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 39 #endif // PXR_PYTHON_SUPPORT_ENABLED 41 #include "pxr/base/tf/pyObjWrapper.h" 42 #include <boost/operators.hpp> 45 #include <type_traits> 48 PXR_NAMESPACE_OPEN_SCOPE
64 template <
class Ptr,
class =
typename 65 std::enable_if<Tf_SupportsWeakPtr<
66 typename Ptr::DataType>::value>::type>
68 static_assert(
sizeof(_PointerHolder<Ptr>) <=
sizeof(_Data),
69 "Ptr is too big to fit in a TfAnyWeakPtr");
70 new (&_ptrStorage) _PointerHolder<Ptr>(ptr);
75 static_assert(
sizeof(_EmptyHolder) <=
sizeof(_Data),
76 "Ptr is too big to fit in a TfAnyWeakPtr");
77 new (&_ptrStorage) _EmptyHolder;
87 other._Get()->Clone(&_ptrStorage);
92 _Get()->~_PointerHolderBase();
93 other._Get()->Clone(&_ptrStorage);
99 _Get()->~_PointerHolderBase();
113 TF_API
operator bool()
const;
136 #ifdef PXR_PYTHON_SUPPORT_ENABLED 141 friend boost::python::api::object
142 Tf_GetPythonObjectFromAnyWeakPtr(This
const &
self);
145 boost::python::api::object _GetPythonObject()
const;
146 #endif // PXR_PYTHON_SUPPORT_ENABLED 148 template <
class WeakPtr>
149 friend WeakPtr TfAnyWeakPtrDynamicCast(
const TfAnyWeakPtr &anyWeak, WeakPtr*);
152 struct _PointerHolderBase {
153 TF_API
virtual ~_PointerHolderBase();
154 virtual void Clone(_Data *target)
const = 0;
158 virtual operator bool()
const = 0;
159 virtual bool _IsConst()
const = 0;
161 virtual const std::type_info &
GetTypeInfo()
const = 0;
163 virtual const void* _GetMostDerivedPtr()
const = 0;
164 virtual bool _IsPolymorphic()
const = 0;
167 struct _EmptyHolder : _PointerHolderBase {
168 TF_API
virtual ~_EmptyHolder();
169 TF_API
virtual void Clone(_Data *target)
const;
173 TF_API
virtual operator bool()
const;
174 TF_API
virtual bool _IsConst()
const;
176 TF_API
virtual const std::type_info &
GetTypeInfo()
const;
178 TF_API
virtual const void* _GetMostDerivedPtr()
const;
179 TF_API
virtual bool _IsPolymorphic()
const;
182 template <
typename Ptr>
183 struct _PointerHolder : _PointerHolderBase {
184 _PointerHolder(Ptr
const &ptr) : _ptr(ptr) {
187 virtual ~_PointerHolder();
188 virtual void Clone(_Data *target)
const;
192 virtual operator bool()
const;
193 virtual bool _IsConst()
const;
195 virtual const std::type_info &
GetTypeInfo()
const;
197 virtual const void* _GetMostDerivedPtr()
const;
198 virtual bool _IsPolymorphic()
const;
203 _PointerHolderBase* _Get()
const {
204 return (_PointerHolderBase*)(&_ptrStorage);
214 template <
class HashState,
215 class T,
class =
typename std::enable_if<
216 std::is_same<T, TfAnyWeakPtr>::value>::type>
218 TfHashAppend(HashState &h,
const T& ptr)
220 h.Append(ptr.GetUniqueIdentifier());
224 TfAnyWeakPtr::_PointerHolder<Ptr>::~_PointerHolder() {}
228 TfAnyWeakPtr::_PointerHolder<Ptr>::Clone(_Data *target)
const 230 new (target) _PointerHolder<Ptr>(_ptr);
235 TfAnyWeakPtr::_PointerHolder<Ptr>::IsInvalid()
const 237 return _ptr.IsInvalid();
242 TfAnyWeakPtr::_PointerHolder<Ptr>::GetUniqueIdentifier()
const 244 return _ptr.GetUniqueIdentifier();
249 TfAnyWeakPtr::_PointerHolder<Ptr>::GetWeakBase()
const 251 return &(_ptr->__GetTfWeakBase__());
255 TfAnyWeakPtr::_PointerHolder<Ptr>::operator bool()
const 262 TfAnyWeakPtr::_PointerHolder<Ptr>::GetPythonObject()
const 264 #ifdef PXR_PYTHON_SUPPORT_ENABLED 268 #endif // PXR_PYTHON_SUPPORT_ENABLED 271 const std::type_info &
272 TfAnyWeakPtr::_PointerHolder<Ptr>::GetTypeInfo()
const 274 return TfTypeid(_ptr);
279 TfAnyWeakPtr::_PointerHolder<Ptr>::GetType()
const 286 TfAnyWeakPtr::_PointerHolder<Ptr>::_GetMostDerivedPtr()
const 292 typename Ptr::DataType
const *rawPtr = get_pointer(_ptr);
298 TfAnyWeakPtr::_PointerHolder<Ptr>::_IsPolymorphic()
const 300 return std::is_polymorphic<typename Ptr::DataType>::value;
305 TfAnyWeakPtr::_PointerHolder<Ptr>::_IsConst()
const 307 return std::is_const<typename Ptr::DataType>::value;
310 PXR_NAMESPACE_CLOSE_SCOPE
TF_API bool operator==(const TfAnyWeakPtr &rhs) const
equality operator
TF_API bool IsInvalid() const
Return true only if this expiry checker is watching a weak pointer which has expired.
TF_API TfWeakBase const * GetWeakBase() const
Return the TfWeakBase object of the WeakPtr we are holding.
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.
Miscellaneous Utilities for dealing with script.
static TfType const & Find()
Retrieve the TfType corresponding to type T.
Pointer storage with deletion detection.
Provides the ability to hold an arbitrary TfWeakPtr in a non-type-specific manner in order to observe...
TfAnyWeakPtr(Ptr const &ptr)
Construct an AnyWeakPtr watching ptr.
TF_API bool operator !() const
operator !
TfAnyWeakPtr(TfNullPtrType)
Construct and implicitly convert from TfNullPtr.
TF_API const std::type_info & GetTypeInfo() const
returns the type_info of the underlying WeakPtr
std::enable_if< std::is_polymorphic< T >::value, Tf_CopyCV< T, void > * >::type TfCastToMostDerivedType(T *ptr)
Return a pointer to the most-derived object.
Boost Python object wrapper.
TF_API bool operator<(const TfAnyWeakPtr &rhs) const
comparison operator
TfAnyWeakPtr()
Construct an AnyWeakPtr not watching any ptr.
TF_API TfType const & GetType() const
Returns the TfType of the underlying WeakPtr.
TfAnyWeakPtr(std::nullptr_t)
Construct and implicitly convert from std::nullptr_t.
TfType represents a dynamic runtime type.
TF_API void const * GetUniqueIdentifier() const
Return the unique identifier of the WeakPtr this AnyWeakPtr contains.
Enable a concrete base class for use with TfWeakPtr.
size_t GetHash() const
Return a hash value for this instance.