associative arrays: iteration is finally here

Pelle Månsson pelle.mansson at gmail.com
Wed Oct 28 12:34:14 PDT 2009


Denis Koroskin wrote:
> On Wed, 28 Oct 2009 17:22:00 +0300, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> wrote:
> 
>> 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.
>>
> 
> Wow, this is outstanding! (I hope it didn't have any negative impact on 
> compile-time AA capabilities).
> 
>> 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
> 
> If AA is providing a way to iterate over both keys and values (and it's 
> a default iteration scheme), why should AA provide 2 other iteration 
> schemes? Can't they be implemented externally (using adaptor ranges) 
> with the same efficiency?
> 
> foreach (e; keys(aa)) {
>     writefln("key: %s", e);
> }
> 
> foreach (e; values(aa)) {
>     writefln("value: %s", e);
> }

Why would you prefer keys(aa) over aa.keys?

> Last, I believe foreach loop should automatically call opSlice() on 
> iteratee. There is currently an inconsistency with built-in types - you 
> don't have to call [] on them, yet you must call it on all the other types:

Try implementing the range interface (front, popFront and empty), and 
they are ranges. Magic! opApply is worth mentioning here, as well.



More information about the Digitalmars-d mailing list