associative arrays: iteration is finally here
Lars T. Kyllingstad
public at kyllingen.NOSPAMnet
Wed Oct 28 14:30:02 PDT 2009
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
More information about the Digitalmars-d
mailing list