24 #ifndef PXR_BASE_TF_ANY_WEAK_PTR_H
25 #define PXR_BASE_TF_ANY_WEAK_PTR_H
37 #ifdef PXR_PYTHON_SUPPORT_ENABLED
39 #include <hboost/python/object.hpp>
40 #endif // PXR_PYTHON_SUPPORT_ENABLED
42 #include <hboost/operators.hpp>
45 #include <type_traits>
64 template <
class Ptr,
class =
typename
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
142 Tf_GetPythonObjectFromAnyWeakPtr(
This const &
self);
146 #endif // PXR_PYTHON_SUPPORT_ENABLED
148 template <
class 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;
160 #ifdef PXR_PYTHON_SUPPORT_ENABLED
162 #endif // PXR_PYTHON_SUPPORT_ENABLED
163 virtual const std::type_info &
GetTypeInfo()
const = 0;
165 virtual const void* _GetMostDerivedPtr()
const = 0;
166 virtual bool _IsPolymorphic()
const = 0;
169 struct _EmptyHolder : _PointerHolderBase {
170 TF_API virtual ~_EmptyHolder();
175 TF_API virtual operator bool()
const;
176 TF_API virtual bool _IsConst()
const;
177 #ifdef PXR_PYTHON_SUPPORT_ENABLED
179 #endif // PXR_PYTHON_SUPPORT_ENABLED
182 TF_API virtual const void* _GetMostDerivedPtr()
const;
183 TF_API virtual bool _IsPolymorphic()
const;
186 template <
typename Ptr>
187 struct _PointerHolder : _PointerHolderBase {
188 _PointerHolder(Ptr
const &
ptr) : _ptr(ptr) {
191 virtual ~_PointerHolder();
192 virtual void Clone(_Data *
target)
const;
196 virtual operator bool()
const;
197 virtual bool _IsConst()
const;
198 #ifdef PXR_PYTHON_SUPPORT_ENABLED
200 #endif // PXR_PYTHON_SUPPORT_ENABLED
201 virtual const std::type_info &
GetTypeInfo()
const;
203 virtual const void* _GetMostDerivedPtr()
const;
204 virtual bool _IsPolymorphic()
const;
209 _PointerHolderBase* _Get()
const {
210 return (_PointerHolderBase*)(&_ptrStorage);
220 template <
class HashState,
221 class T,
class =
typename std::enable_if<
226 h.Append(ptr.GetUniqueIdentifier());
230 TfAnyWeakPtr::_PointerHolder<Ptr>::~_PointerHolder() {}
234 TfAnyWeakPtr::_PointerHolder<Ptr>::Clone(_Data *
target)
const
236 new (
target) _PointerHolder<Ptr>(_ptr);
241 TfAnyWeakPtr::_PointerHolder<Ptr>::IsInvalid()
const
243 return _ptr.IsInvalid();
248 TfAnyWeakPtr::_PointerHolder<Ptr>::GetUniqueIdentifier()
const
250 return _ptr.GetUniqueIdentifier();
255 TfAnyWeakPtr::_PointerHolder<Ptr>::GetWeakBase()
const
257 return &(_ptr->__GetTfWeakBase__());
261 TfAnyWeakPtr::_PointerHolder<Ptr>::operator bool()
const
266 #ifdef PXR_PYTHON_SUPPORT_ENABLED
269 TfAnyWeakPtr::_PointerHolder<Ptr>::GetPythonObject()
const
273 #endif // PXR_PYTHON_SUPPORT_ENABLED
276 const std::type_info &
277 TfAnyWeakPtr::_PointerHolder<Ptr>::GetTypeInfo()
const
284 TfAnyWeakPtr::_PointerHolder<Ptr>::GetType()
const
291 TfAnyWeakPtr::_PointerHolder<Ptr>::_GetMostDerivedPtr()
const
297 typename Ptr::DataType
const *rawPtr =
get_pointer(_ptr);
303 TfAnyWeakPtr::_PointerHolder<Ptr>::_IsPolymorphic()
const
310 TfAnyWeakPtr::_PointerHolder<Ptr>::_IsConst()
const
TF_API const std::type_info & GetTypeInfo() const
returns the type_info of the underlying WeakPtr
void TfHashAppend(HashState &h, const T &ptr)
TfAnyWeakPtr(Ptr const &ptr)
Construct an AnyWeakPtr watching ptr.
static TfType const & Find()
TfAnyWeakPtr(TfNullPtrType)
Construct and implicitly convert from TfNullPtr.
fallback_uintptr uintptr_t
TfAnyWeakPtr(std::nullptr_t)
Construct and implicitly convert from std::nullptr_t.
TF_API bool operator<(const TfAnyWeakPtr &rhs) const
comparison operator
Y * get_pointer(TfWeakPtrFacade< X, Y > const &p)
TF_API bool operator!() const
operator !
TfAnyWeakPtr()
Construct an AnyWeakPtr not watching any ptr.
TF_API void const * GetUniqueIdentifier() const
Return the unique identifier of the WeakPtr this AnyWeakPtr contains.
GLint GLint GLsizei GLint GLenum GLenum type
std::weak_ptr< T > WeakPtr
TF_API bool IsInvalid() const
std::enable_if< std::is_polymorphic< T >::value, Tf_CopyCV< T, void > * >::type TfCastToMostDerivedType(T *ptr)
TF_API TfType const & GetType() const
Returns the TfType of the underlying WeakPtr.
const std::type_info & TfTypeid(const TfRefPtr< T > &ptr)
friend WeakPtr TfAnyWeakPtrDynamicCast(const TfAnyWeakPtr &anyWeak, WeakPtr *)
TfAnyWeakPtr & operator=(TfAnyWeakPtr const &other)
hboost::python::object TfPyObject(T const &t, bool complainOnFailure=true)
TF_API bool operator==(const TfAnyWeakPtr &rhs) const
equality operator
size_t GetHash() const
Return a hash value for this instance.
GLfloat GLfloat GLfloat GLfloat h
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
TfAnyWeakPtr(TfAnyWeakPtr const &other)
#define PXR_NAMESPACE_CLOSE_SCOPE
GLsizei const GLfloat * value
TF_API TfWeakBase const * GetWeakBase() const
Return the TfWeakBase object of the WeakPtr we are holding.