Automatic opApply iteration counter
    bearophile 
    bearophileHUGS at lycos.com
       
    Wed Apr 14 05:46:49 PDT 2010
    
    
  
This thread is now fit for D.learn, but I answer it here to not split it up.
Steven Schveighoffer:
> Don't forget, opApply is just a function, you can use it as such :)
Right, I forget it often... I will keep in mind your example, thank you.
> Oh, and don't forget to always make opApply take a scope delegate!  
> Otherwise, it allocates the calling function's frame on the heap (in D2 at  
> least).
To test it, I have compiled this program with and without the two scope annotations (I use printf to remove lot of noise from the resulting asm, because writeln adds tons of functions):
import std.c.stdio: printf;
alias int Int;
struct Xfibonacci {
    Int max;
    int opApply(scope int delegate(ref Int) dg) {
         int _dg(ref int i, ref Int l) { return dg(l); }
         return opApply(&_dg);
    }
    int opApply(scope int delegate(ref int, ref Int) dg) {
        int result, index;
        Int a=0, b=1;
        while (a < max) {
            result = dg(index, b);
            if (result) break;
            index++;
            a += b;
            result = dg(index, a);
            if (result) break;
            b += a;
            index++;
        }
        return result;
    }
}
void main() {
    foreach (f; Xfibonacci(200))
        printf("%d\n", f);
    printf("\n");
    foreach (i, f; Xfibonacci(200))
        printf("%d %d\n", i, f);
}
This is one of the functions, using the scope attributes:
_D11xfibonacci210Xfibonacci7opApplyMFMDFKiZiZi:
    push EAX
    mov ECX,offset FLAT:_D11xfibonacci210Xfibonacci7opApplyMFMDFKiZiZi3_dgMFKiKiZi
    mov EAX,0[ESP]
    push ECX
    lea EDX,4[ESP]
    push EDX
    call near ptr _D11xfibonacci210Xfibonacci7opApplyMFMDFKiKiZiZi
    pop ECX
    ret 8
The same function, not using the scope attributes:
_D11xfibonacci210Xfibonacci7opApplyMFDFKiZiZi:
    push EAX
    push EBX
    push ESI
    push 010h
    call near ptr __d_allocmemory
    mov EBX,EAX
    mov EAX,0Ch[ESP]
    mov [EBX],EAX
    mov EDX,018h[ESP]
    mov ESI,014h[ESP]
    mov 8[EBX],ESI
    mov ECX,offset FLAT:_D11xfibonacci210Xfibonacci7opApplyMFDFKiZiZi3_dgMFKiKiZi
    mov 0Ch[EBX],EDX
    add ESP,4
    push ECX
    push EBX
    call near ptr _D11xfibonacci210Xfibonacci7opApplyMFDFKiKiZiZi
    pop ESI
    pop EBX
    pop ECX
    ret 8
Bye,
bearophile
    
    
More information about the Digitalmars-d
mailing list