Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 05a7dfa1 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes I66c97386,Id205c88d

* changes:
  libutils: wp::fromExisting bugfix
  libutils: add sp::cast method
parents 05e6076c dc43fb27
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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);

+1 −0
Original line number Diff line number Diff line
@@ -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;
}
+12 −0
Original line number Diff line number Diff line
@@ -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)