Merge changes I66c97386,Id205c88d

* changes:
  libutils: wp::fromExisting bugfix
  libutils: add sp::cast method
This commit is contained in:
Treehugger Robot 2021-04-08 18:20:38 +00:00 committed by Gerrit Code Review
commit 05a7dfa104
3 changed files with 15 additions and 2 deletions

View file

@ -242,12 +242,12 @@ TEST(RefBase, ReplacedComparison) {
}
TEST(RefBase, AssertWeakRefExistsSuccess) {
// uses some other refcounting method, or non at all
bool isDeleted;
sp<Foo> foo = sp<Foo>::make(&isDeleted);
wp<Foo> weakFoo = foo;
EXPECT_EQ(weakFoo, wp<Foo>::fromExisting(foo.get()));
EXPECT_EQ(weakFoo.unsafe_get(), wp<Foo>::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);

View file

@ -547,6 +547,7 @@ wp<T> wp<T>::fromExisting(T* other) {
refs->incWeakRequireWeak(other);
wp<T> ret;
ret.m_ptr = other;
ret.m_refs = refs;
return ret;
}

View file

@ -72,6 +72,12 @@ public:
template<typename U> sp(const sp<U>& other); // NOLINT(implicit)
template<typename U> sp(sp<U>&& 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 <typename U>
static inline sp<T> cast(const sp<U>& other);
~sp();
// Assignment
@ -279,6 +285,12 @@ sp<T>::sp(sp<U>&& other)
other.m_ptr = nullptr;
}
template <typename T>
template <typename U>
sp<T> sp<T>::cast(const sp<U>& other) {
return sp<T>::fromExisting(static_cast<T*>(other.get()));
}
template<typename T>
sp<T>::~sp() {
if (m_ptr)