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