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);
}