Function sharedPtr
Create SharedPtr
from parameter ptr
of type SharedPtr
, RcPtr
or IntrusivePtr
.
auto sharedPtr(Ptr)
(
auto scope ref Ptr ptr
) @trusted
if (!is(Ptr == shared) && isSmartPtr!Ptr);
Example
import btl .autoptr .rc_ptr;
import btl .autoptr .intrusive_ptr;
import core .lifetime : move;
//RcPtr -> SharedPtr:
{
auto x = RcPtr!long .make(42);
assert(*x == 42);
assert(x .useCount == 1);
auto s = sharedPtr(x);
assert(x .useCount == 2);
import btl .autoptr .shared_ptr : isSharedPtr;
static assert(isSharedPtr!(typeof(s)));
auto s2 = sharedPtr(x .move);
assert(s .useCount == 2);
auto y = sharedPtr(RcPtr!long .init);
assert(y == null);
}
//IntrusivePtr -> SharedPtr:
{
static class Foo{
ControlBlock!(int, int) c;
int i;
this(int i)pure nothrow @safe @nogc{
this .i = i;
}
}
auto x = IntrusivePtr!Foo .make(42);
//assert(x.get.i == 42);
assert(x .useCount == 1);
auto s = sharedPtr(x);
assert(x .useCount == 2);
import btl .autoptr .shared_ptr : isSharedPtr;
static assert(isSharedPtr!(typeof(s)));
auto s2 = sharedPtr(x .move);
assert(s .useCount == 2);
auto y = sharedPtr(IntrusivePtr!Foo .init);
assert(y == null);
}
//SharedPtr -> SharedPtr:
{
auto a = SharedPtr!long .make(1);
assert(a .useCount == 1);
auto b = sharedPtr(a);
assert(a .useCount == 2);
auto c = sharedPtr(SharedPtr!long .make(2));
assert(c .useCount == 1);
}