Can we get rid of opApply?

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Tue Jan 20 06:44:19 PST 2009


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



More information about the Digitalmars-d mailing list