rcMake

rcMake
(
T
A...
)
()

Examples

static string[] log;

static class Par
{
    this( uint i ) { log ~= "+par"; }
    ~this() { log ~= "-par"; }
}

static class Ch : Par
{
    this() { super(1); log ~= "+ch"; }
    ~this() { log ~= "-ch"; }
}

assert( log.length == 0 );

auto inc = 0;
{
    RCObject!Ch c;
    {
        auto a = rcMake!Ch();
        assert( equal( log, ["+par","+ch"] ) );
        assert( a.refCount == 1 );
        auto b = a;
        assert( equal( log, ["+par","+ch"] ) );
        assert( a.refCount == 2 );
        assert( b.refCount == 2 );
        c = a;
        assert( a.refCount == 3 );
        assert( b.refCount == 3 );
        assert( c.refCount == 3 );
        b = rcMake!Ch();
        assert( a.refCount == 2 );
        assert( b.refCount == 1 );
        assert( c.refCount == 2 );
        assert( equal( log, ["+par","+ch","+par","+ch"] ) );
        b = rcMake!Ch();
        assert( a.refCount == 2 );
        assert( b.refCount == 1 );
        assert( c.refCount == 2 );
        assert( equal( log, ["+par","+ch","+par","+ch",
                             "+par","+ch", // new Ch stored in b
                             "-ch","-par" // old Ch in b
                            ] ) );
    }
    assert( c.refCount == 1 );
}
assert( equal( log, ["+par","+ch","+par","+ch",
                     "+par","+ch","-ch","-par",
                     "-ch","-par","-ch","-par"] ) );

Meta