24 #ifndef PXR_BASE_TF_WEAK_PTR_H
25 #define PXR_BASE_TF_WEAK_PTR_H
33 #include "pxr/base/tf/nullPtr.h"
37 #include "pxr/base/tf/weakPtrFacade.h"
40 #include <type_traits>
42 PXR_NAMESPACE_OPEN_SCOPE
144 class TfWeakPtr :
public TfWeakPtrFacade<TfWeakPtr, T>
149 template <
class U>
friend class TfWeakPtr;
151 template <
class U>
struct Rebind {
168 : _rawPtr(p._rawPtr), _remnant(std::move(p._remnant)) {
176 typename std::enable_if<
177 std::is_convertible<U*, T*>::value
178 >::type *dummy = 0) : _rawPtr(get_pointer(p))
181 if (ARCH_LIKELY(_rawPtr))
182 _remnant = Tf_WeakBaseAccess::
183 GetRemnant(_rawPtr->__GetTfWeakBase__());
189 std::is_convertible<U*, T*>::value>::type *dummy =
nullptr) : _rawPtr(p)
192 if (ARCH_LIKELY(_rawPtr))
193 _remnant = Tf_WeakBaseAccess::
194 GetRemnant(_rawPtr->__GetTfWeakBase__());
199 typename std::enable_if<
200 std::is_convertible<U*, T*>::value
201 >::type *dummy = 0) : _rawPtr(p._rawPtr), _remnant(p._remnant)
211 _remnant = std::move(p._remnant);
216 bool IsExpired()
const {
217 return this->IsInvalid();
222 T *_FetchPointer()
const {
223 if (ARCH_LIKELY(_remnant && _remnant->_IsAlive()))
228 bool _IsInvalid()
const {
229 return _remnant && !_remnant->_IsAlive();
232 void const *_GetUniqueIdentifier()
const {
233 return _remnant ? _remnant->_GetUniqueIdentifier() : 0;
236 void _EnableExtraNotification()
const {
237 _remnant->EnableNotification();
278 typedef typename TfRefPtr<T>::_Counter Counter;
279 if (T *rawPtr = get_pointer(p)) {
281 if (Counter::AddRefIfNonzero(rawPtr)) {
285 return TfCreateRefPtr(rawPtr);
294 #if !defined(doxygen)
307 : _remnant(wp._remnant) {
310 template <
template <
class>
class PtrTemplate,
class Type>
311 TfWeakPtr(TfWeakPtrFacade<PtrTemplate, Type>
const& wpf)
312 : _remnant(_GetRemnant(wpf)) {
318 _remnant = wp._remnant;
322 template <
template <
class>
class PtrTemplate,
class Type>
324 operator= (TfWeakPtrFacade<PtrTemplate, Type>
const& wpf) {
325 _remnant = _GetRemnant(wpf);
331 return wp._remnant == _remnant;
334 template <
template <
class>
class PtrTemplate,
class Type>
335 bool operator== (TfWeakPtrFacade<PtrTemplate, Type>
const& wpf)
const {
336 return _GetRemnant(wpf) == _remnant;
341 return wp._remnant != _remnant;
344 template <
template <
class>
class PtrTemplate,
class Type>
345 bool operator!= (TfWeakPtrFacade<PtrTemplate, Type>
const& wpf)
const {
346 return _GetRemnant(wpf) != _remnant;
350 bool operator< (TfWeakPtr<U>
const& wp) {
351 return wp._remnant < _remnant;
354 template <
template <
class>
class PtrTemplate,
class Type>
355 bool operator< (TfWeakPtrFacade<PtrTemplate, Type>
const& wpf) {
356 return _GetRemnant(wpf) < _remnant;
361 operator UnspecifiedBoolType()
const {
362 return (_remnant && _remnant->_IsAlive())
363 ? &TfWeakPtr::_remnant :
nullptr;
366 bool operator !()
const {
370 bool IsExpired()
const {
371 return _remnant && !_remnant->_IsAlive();
375 template <
template <
class>
class PtrTemplate,
class Type>
377 _GetRemnant(TfWeakPtrFacade<PtrTemplate, Type>
const& wpf) {
378 TfWeakBase const *weakBase = wpf.GetWeakBase();
379 if (ARCH_LIKELY(weakBase)) {
380 return Tf_WeakBaseAccess::GetRemnant(*weakBase);
406 struct Tf_HasGetWeakBase
413 using _SignatureOf__GetTfWeakBase__ =
TfWeakBase const & (U::*)()
const;
416 static std::true_type
417 _HasSig(_SignatureOf__GetTfWeakBase__<U>);
420 static decltype(_HasSig(&U::__GetTfWeakBase__))
423 static std::false_type
427 using type = decltype(_Deduce(static_cast<T*>(
nullptr)));
428 using value_type =
bool;
429 static const
bool value = type::value;
433 struct Tf_SupportsWeakPtr
435 static const bool value =
436 std::is_base_of<TfWeakBase, T>::value || Tf_HasGetWeakBase<T>::value;
439 #define TF_SUPPORTS_WEAKPTR(T) (Tf_SupportsWeakPtr<T>::value)
440 #define TF_TRULY_SUPPORTS_WEAKPTR(T) std::is_base_of<TfWeakBase, T >::value
442 #define TF_DECLARE_WEAK_POINTABLE_INTERFACE \
443 virtual TfWeakBase const &__GetTfWeakBase__() const = 0
445 #define TF_IMPLEMENT_WEAK_POINTABLE_INTERFACE \
446 virtual TfWeakBase const &__GetTfWeakBase__() const { \
450 PXR_NAMESPACE_CLOSE_SCOPE
452 #endif // PXR_BASE_TF_WEAK_PTR_H
TfRefPtr< T > TfCreateRefPtrFromProtectedWeakPtr(TfWeakPtr< T > const &p)
Thread-safe creation of a Tf ref pointer from a Tf weak pointer.
TfWeakPtr & operator=(TfWeakPtr const &p)=default
Copy assignment.
TfWeakPtr(U *p, typename std::enable_if< std::is_convertible< U *, T * >::value >::type *dummy=nullptr)
Explicitly construct from a raw pointer p.
#define TF_UNUSED(x)
Stops compiler from producing unused argument or variable warnings.
Pointer storage with deletion detection.
A user-extensible hashing mechanism for use with runtime hash tables.
TfWeakPtr(std::nullptr_t)
Construction, implicit conversion from nullptr.
This access class is befriended by TfWeakPtrFacade -derived classes to grant TfWeakPtrFacade access t...
TfWeakPtr(TfWeakPtr &&p) noexcept
Move construction.
TfWeakPtr & operator=(TfWeakPtr &&p) noexcept
Move assignment.
TfWeakPtr(TfNullPtrType)
Construction, implicit conversion from TfNullPtr.
Reference-counted smart pointer utility class.
Enable a concrete base class for use with TfWeakPtr.
TfWeakPtr(TfRefPtr< U > const &p, typename std::enable_if< std::is_convertible< U *, T * >::value >::type *dummy=0)
Conversion from RefPtr where U* is convertible to T* (this pointer type).
A file containing basic constants and definitions.