diff --git a/libutils/RefBase_test.cpp b/libutils/RefBase_test.cpp index dcc469e48..93f9654b1 100644 --- a/libutils/RefBase_test.cpp +++ b/libutils/RefBase_test.cpp @@ -242,12 +242,12 @@ TEST(RefBase, ReplacedComparison) { } TEST(RefBase, AssertWeakRefExistsSuccess) { - // uses some other refcounting method, or non at all bool isDeleted; sp foo = sp::make(&isDeleted); wp weakFoo = foo; EXPECT_EQ(weakFoo, wp::fromExisting(foo.get())); + EXPECT_EQ(weakFoo.unsafe_get(), wp::fromExisting(foo.get()).unsafe_get()); EXPECT_FALSE(isDeleted); foo = nullptr; @@ -255,7 +255,7 @@ TEST(RefBase, AssertWeakRefExistsSuccess) { } TEST(RefBase, AssertWeakRefExistsDeath) { - // uses some other refcounting method, or non at all + // uses some other refcounting method, or none at all bool isDeleted; Foo* foo = new Foo(&isDeleted); diff --git a/libutils/include/utils/RefBase.h b/libutils/include/utils/RefBase.h index 5a5bd56e5..714894924 100644 --- a/libutils/include/utils/RefBase.h +++ b/libutils/include/utils/RefBase.h @@ -547,6 +547,7 @@ wp wp::fromExisting(T* other) { refs->incWeakRequireWeak(other); wp ret; + ret.m_ptr = other; ret.m_refs = refs; return ret; } diff --git a/libutils/include/utils/StrongPointer.h b/libutils/include/utils/StrongPointer.h index 1f070524a..dd53b9ec0 100644 --- a/libutils/include/utils/StrongPointer.h +++ b/libutils/include/utils/StrongPointer.h @@ -72,6 +72,12 @@ public: template sp(const sp& other); // NOLINT(implicit) template sp(sp&& other); // NOLINT(implicit) + // Cast a strong pointer directly from one type to another. Constructors + // allow changing types, but only if they are pointer-compatible. This does + // a static_cast internally. + template + static inline sp cast(const sp& other); + ~sp(); // Assignment @@ -279,6 +285,12 @@ sp::sp(sp&& other) other.m_ptr = nullptr; } +template +template +sp sp::cast(const sp& other) { + return sp::fromExisting(static_cast(other.get())); +} + template sp::~sp() { if (m_ptr)