24#ifndef PXR_BASE_TF_ANY_WEAK_PTR_H
25#define PXR_BASE_TF_ANY_WEAK_PTR_H
32#include "pxr/base/tf/api.h"
34#include "pxr/base/tf/type.h"
37#ifdef PXR_PYTHON_SUPPORT_ENABLED
41#include "pxr/base/tf/pyObjWrapper.h"
47PXR_NAMESPACE_OPEN_SCOPE
63 template <
class Ptr,
class =
typename
64 std::enable_if<Tf_SupportsWeakPtr<
65 typename Ptr::DataType>::value>::type>
67 static_assert(
sizeof(_PointerHolder<Ptr>) <=
sizeof(_Data),
68 "Ptr is too big to fit in a TfAnyWeakPtr");
69 new (&_ptrStorage) _PointerHolder<Ptr>(ptr);
74 static_assert(
sizeof(_EmptyHolder) <=
sizeof(_Data),
75 "Ptr is too big to fit in a TfAnyWeakPtr");
76 new (&_ptrStorage) _EmptyHolder;
86 other._Get()->Clone(&_ptrStorage);
91 _Get()->~_PointerHolderBase();
92 other._Get()->Clone(&_ptrStorage);
98 _Get()->~_PointerHolderBase();
112 TF_API
operator bool()
const;
122 return !(*
this == rhs);
130 return !(rhs < *
this);
140 return !(*
this < rhs);
155#ifdef PXR_PYTHON_SUPPORT_ENABLED
160 friend boost::python::api::object
161 Tf_GetPythonObjectFromAnyWeakPtr(This
const &self);
164 boost::python::api::object _GetPythonObject()
const;
167 template <
class WeakPtr>
168 friend WeakPtr TfAnyWeakPtrDynamicCast(
const TfAnyWeakPtr &anyWeak, WeakPtr*);
171 struct _PointerHolderBase {
172 TF_API
virtual ~_PointerHolderBase();
173 virtual void Clone(_Data *target)
const = 0;
174 virtual bool IsInvalid()
const = 0;
175 virtual void const * GetUniqueIdentifier()
const = 0;
176 virtual TfWeakBase const *GetWeakBase()
const = 0;
177 virtual operator bool()
const = 0;
178 virtual bool _IsConst()
const = 0;
180 virtual const std::type_info & GetTypeInfo()
const = 0;
181 virtual TfType const& GetType()
const = 0;
182 virtual const void* _GetMostDerivedPtr()
const = 0;
183 virtual bool _IsPolymorphic()
const = 0;
186 struct _EmptyHolder : _PointerHolderBase {
187 TF_API
virtual ~_EmptyHolder();
188 TF_API
virtual void Clone(_Data *target)
const;
189 TF_API
virtual bool IsInvalid()
const;
190 TF_API
virtual void const * GetUniqueIdentifier()
const;
191 TF_API
virtual TfWeakBase const *GetWeakBase()
const;
192 TF_API
virtual operator bool()
const;
193 TF_API
virtual bool _IsConst()
const;
195 TF_API
virtual const std::type_info & GetTypeInfo()
const;
196 TF_API
virtual TfType const& GetType()
const;
197 TF_API
virtual const void* _GetMostDerivedPtr()
const;
198 TF_API
virtual bool _IsPolymorphic()
const;
201 template <
typename Ptr>
202 struct _PointerHolder : _PointerHolderBase {
203 _PointerHolder(Ptr
const &ptr) : _ptr(ptr) {
206 virtual ~_PointerHolder();
207 virtual void Clone(_Data *target)
const;
208 virtual bool IsInvalid()
const;
209 virtual void const *GetUniqueIdentifier()
const;
210 virtual TfWeakBase const *GetWeakBase()
const;
211 virtual operator bool()
const;
212 virtual bool _IsConst()
const;
214 virtual const std::type_info & GetTypeInfo()
const;
215 virtual TfType const& GetType()
const;
216 virtual const void* _GetMostDerivedPtr()
const;
217 virtual bool _IsPolymorphic()
const;
222 _PointerHolderBase* _Get()
const {
223 return (_PointerHolderBase*)(&_ptrStorage);
233template <
class HashState,
234 class T,
class =
typename std::enable_if<
235 std::is_same<T, TfAnyWeakPtr>::value>::type>
237TfHashAppend(HashState &h,
const T& ptr)
239 h.Append(ptr.GetUniqueIdentifier());
243TfAnyWeakPtr::_PointerHolder<Ptr>::~_PointerHolder() {}
247TfAnyWeakPtr::_PointerHolder<Ptr>::Clone(_Data *target)
const
249 new (target) _PointerHolder<Ptr>(_ptr);
254TfAnyWeakPtr::_PointerHolder<Ptr>::IsInvalid()
const
256 return _ptr.IsInvalid();
261TfAnyWeakPtr::_PointerHolder<Ptr>::GetUniqueIdentifier()
const
263 return _ptr.GetUniqueIdentifier();
268TfAnyWeakPtr::_PointerHolder<Ptr>::GetWeakBase()
const
270 return &(_ptr->__GetTfWeakBase__());
274TfAnyWeakPtr::_PointerHolder<Ptr>::operator bool()
const
281TfAnyWeakPtr::_PointerHolder<Ptr>::GetPythonObject()
const
283#ifdef PXR_PYTHON_SUPPORT_ENABLED
290const std::type_info &
291TfAnyWeakPtr::_PointerHolder<Ptr>::GetTypeInfo()
const
293 return TfTypeid(_ptr);
298TfAnyWeakPtr::_PointerHolder<Ptr>::GetType()
const
305TfAnyWeakPtr::_PointerHolder<Ptr>::_GetMostDerivedPtr()
const
311 typename Ptr::DataType
const *rawPtr = get_pointer(_ptr);
317TfAnyWeakPtr::_PointerHolder<Ptr>::_IsPolymorphic()
const
319 return std::is_polymorphic<typename Ptr::DataType>::value;
324TfAnyWeakPtr::_PointerHolder<Ptr>::_IsConst()
const
326 return std::is_const<typename Ptr::DataType>::value;
329PXR_NAMESPACE_CLOSE_SCOPE
Miscellaneous Utilities for dealing with script.
boost::python::object TfPyObject(T const &t, bool complainOnFailure=true)
Return a python object for the given C++ object, loading the appropriate wrapper code if necessary.
Provides the ability to hold an arbitrary TfWeakPtr in a non-type-specific manner in order to observe...
TF_API const std::type_info & GetTypeInfo() const
returns the type_info of the underlying WeakPtr
bool operator!=(const TfAnyWeakPtr &rhs) const
inequality operator
TF_API TfType const & GetType() const
Returns the TfType of the underlying WeakPtr.
bool operator>(const TfAnyWeakPtr &rhs) const
greater than operator
bool operator<=(const TfAnyWeakPtr &rhs) const
less than or equal operator
TF_API bool operator!() const
operator !
TF_API bool IsInvalid() const
Return true only if this expiry checker is watching a weak pointer which has expired.
TF_API void const * GetUniqueIdentifier() const
Return the unique identifier of the WeakPtr this AnyWeakPtr contains.
bool operator>=(const TfAnyWeakPtr &rhs) const
greater than or equal operator
TfAnyWeakPtr(Ptr const &ptr)
Construct an AnyWeakPtr watching ptr.
TF_API TfWeakBase const * GetWeakBase() const
Return the TfWeakBase object of the WeakPtr we are holding.
size_t GetHash() const
Return a hash value for this instance.
TF_API bool operator<(const TfAnyWeakPtr &rhs) const
comparison operator
TfAnyWeakPtr(TfNullPtrType)
Construct and implicitly convert from TfNullPtr.
TfAnyWeakPtr(std::nullptr_t)
Construct and implicitly convert from std::nullptr_t.
TF_API bool operator==(const TfAnyWeakPtr &rhs) const
equality operator
TfAnyWeakPtr()
Construct an AnyWeakPtr not watching any ptr.
Boost Python object wrapper.
TfType represents a dynamic runtime type.
static TfType const & Find()
Retrieve the TfType corresponding to type T.
Enable a concrete base class for use with TfWeakPtr.
std::enable_if< std::is_polymorphic< T >::value, Tf_CopyCV< T, void > * >::type TfCastToMostDerivedType(T *ptr)
Return a pointer to the most-derived object.
Pointer storage with deletion detection.