Function IntrusivePtr.lock

Creates a new non weak IntrusivePtr that shares ownership of the managed object (must be IntrusivePtr.WeakType).

IntrusivePtr.SharedType lock() scope;

If there is no managed object, i.e. this is empty or this is expired, then the returned IntrusivePtr is empty. Method exists only if IntrusivePtr is isWeak

Examples

static struct Foo{
    ControlBlock!(int, int) c;
    int i;

    this(int i)pure nothrow @safe @nogc{
        this.i = i;
    }
}

{
    IntrusivePtr!Foo x = IntrusivePtr!Foo.make(123);

    auto w = x.weak;    //weak ptr

    IntrusivePtr!Foo y = w.lock;

    assert(x == y);
    assert(x.useCount == 2);
    assert(y.get.i == 123);
}

{
    IntrusivePtr!Foo x = IntrusivePtr!Foo.make(123);

    auto w = x.weak;    //weak ptr

    assert(w.expired == false);

    x = IntrusivePtr!Foo.make(321);

    assert(w.expired == true);

    IntrusivePtr!Foo y = w.lock;

    assert(y == null);
}

{
    shared IntrusivePtr!(shared Foo) x = IntrusivePtr!(shared Foo).make(123);

    shared IntrusivePtr!(shared Foo).WeakType w = x.load.weak;    //weak ptr

    assert(w.expired == false);

    x = IntrusivePtr!(shared Foo).make(321);

    assert(w.expired == true);

    IntrusivePtr!(shared Foo) y = w.load.lock;

    assert(y == null);
}