Changeset 222793 in webkit
- Timestamp:
- Oct 3, 2017, 11:48:57 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r222791 r222793 1 2017-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 1 18 2017-10-03 JF Bastien <jfbastien@apple.com> 2 19 -
trunk/Source/WTF/wtf/WeakPtr.h
r222764 r222793 1 1 /* 2 2 * 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. 4 4 * 5 5 * Redistribution and use in source and binary forms, with or without … … 62 62 }; 63 63 64 template<typename T, typename U> WeakReference<T>* weak_reference_upcast(WeakReference<U>*); 65 template<typename T, typename U> WeakReference<T>* weak_reference_downcast(WeakReference<U>*); 66 64 67 template<typename T> 65 68 class WeakPtr { … … 69 72 WeakPtr(std::nullptr_t) { } 70 73 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>&&); 71 76 72 77 T* get() const { return m_ref ? m_ref->get() : nullptr; } … … 74 79 75 80 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>&&); 76 83 77 84 T* operator->() const { return m_ref->get(); } … … 81 88 82 89 private: 90 template<typename U> friend class WeakPtr; 91 83 92 RefPtr<WeakReference<T>> m_ref; 84 93 }; … … 102 111 if (!m_ref) 103 112 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())) }; 107 114 } 108 115 … … 120 127 }; 121 128 122 template <typename T> inline WeakPtr<T> makeWeakPtr(T& ref) 129 template<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 135 template<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 141 template<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 146 template<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 151 template<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 157 template<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 163 template<typename T> inline WeakPtr<T> makeWeakPtr(T& ref) 123 164 { 124 165 return ref.weakPtrFactory().template createWeakPtr<T>(ref); 125 166 } 126 167 127 template 168 template<typename T> inline WeakPtr<T> makeWeakPtr(T* ptr) 128 169 { 129 170 if (!ptr) -
trunk/Tools/ChangeLog
r222789 r222793 1 2017-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 1 12 2017-10-03 Youenn Fablet <youenn@apple.com> 2 13 -
trunk/Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp
r222764 r222793 213 213 } 214 214 215 auto& weakPtrFactory() { return m_weakPtrFactory; } 216 215 217 private: 216 218 WeakPtrFactory<Base> m_weakPtrFactory; … … 255 257 } 256 258 259 TEST(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 257 293 } // namespace TestWebKitAPI
Note:
See TracChangeset
for help on using the changeset viewer.