Can we get rid of opApply?

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Tue Jan 20 07:32:04 PST 2009


dsimcha wrote:
> == Quote from Andrei Alexandrescu (SeeWebsiteForEmail at erdani.org)'s article
>> dsimcha wrote:
>>> == Quote from Max Samukha (samukha at voliacable.com.removethis)'s article
>>>> On Tue, 20 Jan 2009 12:23:58 +0300, "Denis Koroskin"
>>>> <2korden at gmail.com> wrote:
>>>>> One nice thing that opApply capable of is it can avoid heap activity by
>>> stack-allocating data during iteration.
>>>>> For example, given an array of ints, iterate over string representations of
> them:
>>>>> struct IntegersAsString
>>>>> {
>>>>>    void opAplly(int delegate(string s) dg)
>>>>>    {
>>>>>        char[16] temp;
>>>>>
>>>>>        foreach (i; array) {
>>>>>            int len = sprintf(temp, "%d", i);
>>>>>            int result = dg(temp[0..len]);
>>>>>            if (result != 0) {
>>>>>                return result;
>>>>>            }
>>>>>        }
>>>>>
>>>>>        return 0;
>>>>>    }
>>>>>
>>>>>    private int[] array;
>>>>> }
>>>>>
>>>>> int array = [1, 1, 2, 3, 5, 8, 13];
>>>>>
>>>>> // no heap allocation take place
>>>>> foreach (string s; IntegersAsString(array)) {
>>>>>    writeln(s);
>>>>> }
>>>>>
>>>>> How would you do that with ranges?
>>>> struct IntegersAsString
>>>> {
>>>>     private
>>>>     {
>>>>       int[] array;
>>>>       char[16] temp;
>>>>     }
>>>>     char[] head()
>>>>     {
>>>>         int len = sprintf(temp.ptr, "%d", array[0]);
>>>>         return temp[0..len];
>>>>     }
>>>>     void next()
>>>>     {
>>>>         array = array[1..$];
>>>>     }
>>>>     bool empty()
>>>>     {
>>>>         return array.length == 0;
>>>>     }
>>>> }
>>>> void main()
>>>> {
>>>>     int[] array = [1, 1, 2, 3, 5, 8, 13];
>>>>     // no heap allocation take place
>>>>     foreach (char[] s; IntegersAsString(array))
>>>>         writefln(s);
>>>> }
>>> Yet another argument for some kind of opRange to syntactically sugar this up.
>> Where would that be useful in this example?
>> Andrei
> 
> foreach(char[] s; array) vs.
> foreach(char[] s; IntegersAsString(array))

Oh, that's not opRange helping, it's head() with parameterized return type.

> I think a lot of stuff is going to need some kind of extra struct like this to
> make it work.  When this is the case, it needs to be possible to have a default
> iteration method that "just works."  The opDot overload, I guess, could do this,
> but it's a rather blunt tool, since then you can't use opDot for other stuff and
> you'd have to forward _everything_ to the opDot object.

How does opDot intervene here?


Andrei



More information about the Digitalmars-d mailing list