/* Test the calling of the destroy method as well as illustrating
 * the difference between subtraction and negation in operator
 * overloading
 */
using namespace oadl;

class complex {
    public var real, imag;
    public proc create(r, i) {
        real = r;
        imag = i;
        say("Creating (", r, ",", i, ")\n");
    }
    operator + (rhs) {
        var result;
        result = new complex(real + rhs.real, imag + rhs.imag);
        return result;
    }
    operator - (rhs) {
        var result;
        result = new complex(real - rhs.real, imag - rhs.imag);
        return result;
    }
    operator !- (rhs) {
        var result;
        result = new complex(-real, -imag);
        return result;
    }
    public proc destroy()
    {
        say("Destroying (", real, ",", imag, ")\n");
    }
}

proc main()
{
    var a = complex(1,2);
    var b = complex(3,4);
    var c;
    c = a + b;
    say("c = {", c.real, ",", c.imag, "}\n");
    c = a - b;
    say("c = {", c.real, ",", c.imag, "}\n");
    c = -a;
    say("c = {", c.real, ",", c.imag, "}\n");

    c = nil;
    gc();
}