| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Weak pointers are pointers to an object that do not affect its lifetime, | 5 // Weak pointers are pointers to an object that do not affect its lifetime, |
| 6 // and which may be invalidated (i.e. reset to NULL) by the object, or its | 6 // and which may be invalidated (i.e. reset to NULL) by the object, or its |
| 7 // owner, at any time, most commonly when the object is about to be deleted. | 7 // owner, at any time, most commonly when the object is about to be deleted. |
| 8 | 8 |
| 9 // Weak pointers are useful when an object needs to be accessed safely by one | 9 // Weak pointers are useful when an object needs to be accessed safely by one |
| 10 // or more objects other than its owner, and those callers can cope with the | 10 // or more objects other than its owner, and those callers can cope with the |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 class SupportsWeakPtrBase { | 154 class SupportsWeakPtrBase { |
| 155 public: | 155 public: |
| 156 // A safe static downcast of a WeakPtr<Base> to WeakPtr<Derived>. This | 156 // A safe static downcast of a WeakPtr<Base> to WeakPtr<Derived>. This |
| 157 // conversion will only compile if there is exists a Base which inherits | 157 // conversion will only compile if there is exists a Base which inherits |
| 158 // from SupportsWeakPtr<Base>. See base::AsWeakPtr() below for a helper | 158 // from SupportsWeakPtr<Base>. See base::AsWeakPtr() below for a helper |
| 159 // function that makes calling this easier. | 159 // function that makes calling this easier. |
| 160 template<typename Derived> | 160 template<typename Derived> |
| 161 static WeakPtr<Derived> StaticAsWeakPtr(Derived* t) { | 161 static WeakPtr<Derived> StaticAsWeakPtr(Derived* t) { |
| 162 typedef | 162 typedef |
| 163 is_convertible<Derived, internal::SupportsWeakPtrBase&> convertible; | 163 is_convertible<Derived, internal::SupportsWeakPtrBase&> convertible; |
| 164 COMPILE_ASSERT(convertible::value, | 164 static_assert(convertible::value, |
| 165 AsWeakPtr_argument_inherits_from_SupportsWeakPtr); | 165 "AsWeakPtr argument must inherit from SupportsWeakPtr"); |
| 166 return AsWeakPtrImpl<Derived>(t, *t); | 166 return AsWeakPtrImpl<Derived>(t, *t); |
| 167 } | 167 } |
| 168 | 168 |
| 169 private: | 169 private: |
| 170 // This template function uses type inference to find a Base of Derived | 170 // This template function uses type inference to find a Base of Derived |
| 171 // which is an instance of SupportsWeakPtr<Base>. We can then safely | 171 // which is an instance of SupportsWeakPtr<Base>. We can then safely |
| 172 // static_cast the Base* to a Derived*. | 172 // static_cast the Base* to a Derived*. |
| 173 template <typename Derived, typename Base> | 173 template <typename Derived, typename Base> |
| 174 static WeakPtr<Derived> AsWeakPtrImpl( | 174 static WeakPtr<Derived> AsWeakPtrImpl( |
| 175 Derived* t, const SupportsWeakPtr<Base>&) { | 175 Derived* t, const SupportsWeakPtr<Base>&) { |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 // base::WeakPtr<Derived> ptr = derived.AsWeakPtr(); // Fails. | 336 // base::WeakPtr<Derived> ptr = derived.AsWeakPtr(); // Fails. |
| 337 | 337 |
| 338 template <typename Derived> | 338 template <typename Derived> |
| 339 WeakPtr<Derived> AsWeakPtr(Derived* t) { | 339 WeakPtr<Derived> AsWeakPtr(Derived* t) { |
| 340 return internal::SupportsWeakPtrBase::StaticAsWeakPtr<Derived>(t); | 340 return internal::SupportsWeakPtrBase::StaticAsWeakPtr<Derived>(t); |
| 341 } | 341 } |
| 342 | 342 |
| 343 } // namespace base | 343 } // namespace base |
| 344 | 344 |
| 345 #endif // BASE_MEMORY_WEAK_PTR_H_ | 345 #endif // BASE_MEMORY_WEAK_PTR_H_ |
| OLD | NEW |