view test/dgs.d @ 51:61bc1b4ad3c4 trunk

[svn r55] Foreach was always generating code as if the value variable was 'ref' Other not-so-major improvements
author lindquist
date Mon, 22 Oct 2007 17:25:44 +0200
parents c53b6e3fe49a
children d9d5d59873d8
line wrap: on
line source

struct S
{
    int i;
    int square()
    {
        return i*i;
    }
    int plus(int a)
    {
        return i + a;
    }
    int minus(int a)
    {
        return i - a;
    }
    int delegate(int) get(char op)
    {
        int delegate(int) rval;
        if (op == '+')
            rval = +
        else if (op == '-')
            rval = −
        return rval;
    }
}

int calldg1(int delegate(int) dg, int i)
{
    return dg(i);
}

void delegate() retdg()
{
    void delegate() dg;
    return dg;
}

void getretdg()
{
    void delegate() dg;
    dg = retdg();
}

class C
{
    int i;
    void m()
    {
        i = 42;
    }
}

void getclassdg()
{
    scope c = new C;
    void delegate() dg = &c.m;
    assert(c.i != 42);
    dg();
    assert(c.i == 42);
}

void main()
{
    printf("Delegate test\n");
    S s = S(4);
    
    auto dg = &s.square;
    //assert(dg() == 16);
    //dg();
    
    /*auto dg1 = &s.plus;
    assert(dg1(6) == 10);
    
    auto dg2 = &s.minus;
    assert(calldg1(dg2,30) == -26);
    
    auto dg3 = s.get('+');
    assert(dg3(16) == 20);
    
    getretdg();
    getclassdg();*/
    
    printf("  SUCCESS\n");
}