associative arrays: iteration is finally here

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed Oct 28 17:09:29 PDT 2009


Lars T. Kyllingstad wrote:
> Andrei Alexandrescu wrote:
>> dsimcha wrote:
>>> == Quote from Andrei Alexandrescu (SeeWebsiteForEmail at erdani.org)'s 
>>> article
>>>> Walter has magically converted his work on T[new] into work on making
>>>> associative arrays true templates defined in druntime and not 
>>>> considered
>>>> very special by the compiler.
>>>> This is very exciting because it opens up or simplifies a number of
>>>> possibilities. One is that of implementing true iteration. I actually
>>>> managed to implement last night something that allows you to do:
>>>> int[int] aa = [ 1:1 ];
>>>> auto iter = aa.each;
>>>> writeln(iter.front.key);
>>>> writeln(iter.front.value);
>>>> Two other iterations are possible: by key and by value (in those cases
>>>> iter.front just returns a key or a value).
>>>> One question is, what names should these bear? I am thinking of makign
>>>> opSlice() a universal method of getting the "all" iterator, a default
>>>> that every container must implement.
>>>> For AAs, there would be a "iterate keys" and "iterate values" 
>>>> properties
>>>> or functions. How should they be called?
>>>> Thanks,
>>>> Andrei
>>>
>>> Awesome, this definitely improves the interface, but how about the 
>>> implementation?
>>>  The current implementation, while fast for reading, is unbelievably 
>>> slow for
>>> adding elements, requires a heap allocation (read:  a global lock) on 
>>> *every*
>>> insertion, and generates an insane amount of false pointers.  Even if 
>>> I succeed in
>>> making heap scanning (mostly) precise, it's not clear if the current 
>>> AA impl.
>>> could easily be made to benefit, since it isn't template based.  It 
>>> uses RTTI
>>> internally instead, and the types it's operating on aren't known to the
>>> implementation at compile time, so I wouldn't be able to use 
>>> templates to generate
>>> the bitmask at compile time.  The structs it uses internally would 
>>> therefor have
>>> to be scanned conservatively.
>>
>> I'm afraid that efficiency is a matter I need to defer to the 
>> community for now. Right now, I am trying to get TDPL done. Having or 
>> not having range-style iteration influences the material. Making that 
>> efficient is a matter that would not influence the material (as long 
>> as there is a strong belief that that's doable).
>>
>> Unrelated: one thing that we need to change about AAs is the inability 
>> to get a true reference to the stored element. aa[k] returns an 
>> rvalue, and a[k] = v is done in a manner akin to opIndexAssign. But a 
>> serious AA should have a method of reaching the actual storage for a 
>> value, I think.
> 
> Isn't that what the in operator does?
> 
>    T[U] aa;
>    U key = something;
>    T* p = key in aa;
> 
> -Lars

Correct, sorry for the oversight.

Andrei



More information about the Digitalmars-d mailing list