Changeset 222793 in webkit


Ignore:
Timestamp:
Oct 3, 2017 11:48:57 AM (7 years ago)
Author:
Antti Koivisto
Message:

Allow assigning WeakPtr<Derived> to WeakPtr<Base>
https://bugs.webkit.org/show_bug.cgi?id=177817

Reviewed by Geoff Garen.

Source/WTF:

Add templated copy/move constructors/assignment operators, similar to RefPtr.

  • wtf/WeakPtr.h:

(WTF::WeakPtrFactory::createWeakPtr const):
(WTF::weak_reference_upcast):
(WTF::weak_reference_downcast):
(WTF::WeakPtr<T>::WeakPtr):
(WTF::=):
(WTF::makeWeakPtr):

Tools:

  • TestWebKitAPI/Tests/WTF/WeakPtr.cpp:

(TestWebKitAPI::Base::weakPtrFactory):
(TestWebKitAPI::TEST):

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r222791 r222793  
     12017-10-03  Antti Koivisto  <antti@apple.com>
     2
     3        Allow assigning WeakPtr<Derived> to WeakPtr<Base>
     4        https://bugs.webkit.org/show_bug.cgi?id=177817
     5
     6        Reviewed by Geoff Garen.
     7
     8        Add templated copy/move constructors/assignment operators, similar to RefPtr.
     9
     10        * wtf/WeakPtr.h:
     11        (WTF::WeakPtrFactory::createWeakPtr const):
     12        (WTF::weak_reference_upcast):
     13        (WTF::weak_reference_downcast):
     14        (WTF::WeakPtr<T>::WeakPtr):
     15        (WTF::=):
     16        (WTF::makeWeakPtr):
     17
    1182017-10-03  JF Bastien  <jfbastien@apple.com>
    219
  • trunk/Source/WTF/wtf/WeakPtr.h

    r222764 r222793  
    11/*
    22 * Copyright (C) 2013 Google, Inc. All Rights Reserved.
    3  * Copyright (C) 2015 Apple Inc. All Rights Reserved.
     3 * Copyright (C) 2015, 2017 Apple Inc. All Rights Reserved.
    44 *
    55 * Redistribution and use in source and binary forms, with or without
     
    6262};
    6363
     64template<typename T, typename U> WeakReference<T>* weak_reference_upcast(WeakReference<U>*);
     65template<typename T, typename U> WeakReference<T>* weak_reference_downcast(WeakReference<U>*);
     66
    6467template<typename T>
    6568class WeakPtr {
     
    6972    WeakPtr(std::nullptr_t) { }
    7073    WeakPtr(Ref<WeakReference<T>>&& ref) : m_ref(std::forward<Ref<WeakReference<T>>>(ref)) { }
     74    template<typename U> WeakPtr(const WeakPtr<U>&);
     75    template<typename U> WeakPtr(WeakPtr<U>&&);
    7176
    7277    T* get() const { return m_ref ? m_ref->get() : nullptr; }
     
    7479
    7580    WeakPtr& operator=(std::nullptr_t) { m_ref = nullptr; return *this; }
     81    template<typename U> WeakPtr& operator=(const WeakPtr<U>&);
     82    template<typename U> WeakPtr& operator=(WeakPtr<U>&&);
    7683
    7784    T* operator->() const { return m_ref->get(); }
     
    8188
    8289private:
     90    template<typename U> friend class WeakPtr;
     91
    8392    RefPtr<WeakReference<T>> m_ref;
    8493};
     
    102111        if (!m_ref)
    103112            m_ref = WeakReference<T>::create(&ptr);
    104         ASSERT(&ptr == m_ref->get());
    105         static_assert(std::is_convertible<U*, T*>::value, "T* must be convertible to U*");
    106         return WeakPtr<U>(Ref<WeakReference<U>>(reinterpret_cast<WeakReference<U>&>(*m_ref)));
     113        return { makeRef(*weak_reference_downcast<U>(m_ref.get())) };
    107114    }
    108115
     
    120127};
    121128
    122 template <typename T> inline WeakPtr<T> makeWeakPtr(T& ref)
     129template<typename T, typename U> inline WeakReference<T>* weak_reference_upcast(WeakReference<U>* weakReference)
     130{
     131    static_assert(std::is_convertible<U*, T*>::value, "U* must be convertible to T*");
     132    return reinterpret_cast<WeakReference<T>*>(weakReference);
     133}
     134
     135template<typename T, typename U> inline WeakReference<T>* weak_reference_downcast(WeakReference<U>* weakReference)
     136{
     137    static_assert(std::is_convertible<T*, U*>::value, "T* must be convertible to U*");
     138    return reinterpret_cast<WeakReference<T>*>(weakReference);
     139}
     140
     141template<typename T> template<typename U> inline WeakPtr<T>::WeakPtr(const WeakPtr<U>& o)
     142    : m_ref(weak_reference_upcast<T>(o.m_ref.get()))
     143{
     144}
     145
     146template<typename T> template<typename U> inline WeakPtr<T>::WeakPtr(WeakPtr<U>&& o)
     147    : m_ref(adoptRef(weak_reference_upcast<T>(o.m_ref.leakRef())))
     148{
     149}
     150
     151template<typename T> template<typename U> inline WeakPtr<T>& WeakPtr<T>::operator=(const WeakPtr<U>& o)
     152{
     153    m_ref = weak_reference_upcast<T>(o.m_ref.get());
     154    return *this;
     155}
     156
     157template<typename T> template<typename U> inline WeakPtr<T>& WeakPtr<T>::operator=(WeakPtr<U>&& o)
     158{
     159    m_ref = adoptRef(weak_reference_upcast<T>(o.m_ref.leakRef()));
     160    return *this;
     161}
     162
     163template<typename T> inline WeakPtr<T> makeWeakPtr(T& ref)
    123164{
    124165    return ref.weakPtrFactory().template createWeakPtr<T>(ref);
    125166}
    126167
    127 template <typename T> inline WeakPtr<T> makeWeakPtr(T* ptr)
     168template<typename T> inline WeakPtr<T> makeWeakPtr(T* ptr)
    128169{
    129170    if (!ptr)
  • trunk/Tools/ChangeLog

    r222789 r222793  
     12017-10-03  Antti Koivisto  <antti@apple.com>
     2
     3        Allow assigning WeakPtr<Derived> to WeakPtr<Base>
     4        https://bugs.webkit.org/show_bug.cgi?id=177817
     5
     6        Reviewed by Geoff Garen.
     7
     8        * TestWebKitAPI/Tests/WTF/WeakPtr.cpp:
     9        (TestWebKitAPI::Base::weakPtrFactory):
     10        (TestWebKitAPI::TEST):
     11
    1122017-10-03  Youenn Fablet  <youenn@apple.com>
    213
  • trunk/Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp

    r222764 r222793  
    213213    }
    214214
     215    auto& weakPtrFactory() { return m_weakPtrFactory; }
     216
    215217private:
    216218    WeakPtrFactory<Base> m_weakPtrFactory;
     
    255257}
    256258
     259TEST(WTF_WeakPtr, DerivedConstructAndAssign)
     260{
     261    Derived derived;
     262    {
     263        WeakPtr<Derived> derivedWeakPtr = makeWeakPtr(derived);
     264        WeakPtr<Base> baseWeakPtr { WTFMove(derivedWeakPtr) };
     265        EXPECT_EQ(baseWeakPtr.get(), &derived);
     266        EXPECT_NULL(derivedWeakPtr.get());
     267    }
     268
     269    {
     270        WeakPtr<Derived> derivedWeakPtr = makeWeakPtr(derived);
     271        WeakPtr<Base> baseWeakPtr { derivedWeakPtr };
     272        EXPECT_EQ(baseWeakPtr.get(), &derived);
     273        EXPECT_EQ(derivedWeakPtr.get(), &derived);
     274    }
     275
     276    {
     277        WeakPtr<Derived> derivedWeakPtr = makeWeakPtr(derived);
     278        WeakPtr<Base> baseWeakPtr;
     279        baseWeakPtr = WTFMove(derivedWeakPtr);
     280        EXPECT_EQ(baseWeakPtr.get(), &derived);
     281        EXPECT_NULL(derivedWeakPtr.get());
     282    }
     283
     284    {
     285        WeakPtr<Derived> derivedWeakPtr = makeWeakPtr(derived);
     286        WeakPtr<Base> baseWeakPtr;
     287        baseWeakPtr = derivedWeakPtr;
     288        EXPECT_EQ(baseWeakPtr.get(), &derived);
     289        EXPECT_EQ(derivedWeakPtr.get(), &derived);
     290    }
     291}
     292
    257293} // namespace TestWebKitAPI
Note: See TracChangeset for help on using the changeset viewer.