24 #ifndef PXR_BASE_TF_REF_PTR_H
25 #define PXR_BASE_TF_REF_PTR_H
438 #include <hboost/functional/hash_fwd.hpp>
439 #include <hboost/mpl/if.hpp>
440 #include <hboost/type_traits/is_base_of.hpp>
441 #include <hboost/type_traits/is_convertible.hpp>
442 #include <hboost/type_traits/is_same.hpp>
443 #include <hboost/utility/enable_if.hpp>
446 #include <type_traits>
469 template <
template <
class>
class X,
class Y>
488 if (refBase->_shouldInvokeUniqueChangedListener)
500 return refBase->_shouldInvokeUniqueChangedListener ?
513 if (ptr->_shouldInvokeUniqueChangedListener) {
545 return (ptr && (ptr->
GetRefCount()._DecrementAndTestIfZero()));
583 typedef typename hboost::mpl::if_c<
614 p._refBase =
nullptr;
617 _GetObjectForTracking());
631 template <
template <
class>
class X,
class U>
633 typename hboost::enable_if<
634 hboost::is_convertible<U*, T*>
684 U*
ptr,
typename std::enable_if<
734 _GetObjectForTracking());
737 _refBase = p._refBase;
753 _GetObjectForTracking());
755 p._GetObjectForTracking());
758 _refBase =
p._refBase;
759 p._refBase =
nullptr;
771 _RemoveRef(_refBase);
778 static void _CheckTypeAssignability() {
780 if (unused) unused = 0;
785 static void _CheckTypeComparability() {
786 bool unused = ((
T*)0 == (U*)0);
787 if (unused) unused =
false;
800 #if !defined(doxygen)
806 _CheckTypeAssignability<U>();
823 #if !defined(doxygen)
829 _CheckTypeAssignability<U>();
832 p._refBase =
nullptr;
835 _GetObjectForTracking());
848 #if !defined(doxygen)
854 _CheckTypeAssignability<U>();
858 reinterpret_cast<T*>(p._GetObjectForTracking()),
859 _GetObjectForTracking());
861 _refBase = p._GetData();
878 #if !defined(doxygen)
884 _CheckTypeAssignability<U>();
888 reinterpret_cast<T*>(
p._GetObjectForTracking()),
889 _GetObjectForTracking());
892 reinterpret_cast<T*>(
p._GetObjectForTracking()));
894 _refBase =
p._GetData();
895 p._refBase =
nullptr;
904 #if !defined(doxygen)
909 _CheckTypeComparability<U>();
911 return _refBase == p._refBase;
918 #if !defined(doxygen)
921 bool operator< (const TfRefPtr<U>&
p)
const {
923 _CheckTypeComparability<U>();
925 return _refBase <
p._refBase;
928 #if !defined(doxygen)
933 _CheckTypeComparability<U>();
935 return _refBase > p._refBase;
938 #if !defined(doxygen)
941 bool operator<= (const TfRefPtr<U>&
p)
const {
943 _CheckTypeComparability<U>();
945 return _refBase <=
p._refBase;
948 #if !defined(doxygen)
953 _CheckTypeComparability<U>();
955 return _refBase >= p._refBase;
961 #if !defined(doxygen)
966 _CheckTypeComparability<U>();
968 return _refBase != p._refBase;
974 return static_cast<T*
>(
const_cast<TfRefBase*
>(_refBase));
985 #if !defined(doxygen)
991 return _refBase ? &TfRefPtr::_refBase :
nullptr;
996 return _refBase ==
nullptr;
1005 _GetObjectForTracking());
1007 other._GetObjectForTracking());
1020 template <
class HashState,
class U>
1026 return static_cast<T *
>(
const_cast<TfRefBase *
>(p._refBase));
1030 class _CreateRefPtr { };
1059 #if defined(doxygen)
1064 template <
class D,
class B>
1068 template <
class D,
class B>
1089 #if defined(doxygen)
1094 template <
class D,
class B>
1111 #if defined(doxygen)
1121 T* _GetData()
const {
1122 return static_cast<T*
>(
const_cast<TfRefBase*
>(_refBase));
1131 T* _GetObjectForTracking()
const {
1132 return reinterpret_cast<T*
>(
const_cast<TfRefBase*
>(_refBase));
1145 void _AddRef()
const {
1146 _Counter::AddRef(_refBase);
1149 void _RemoveRef(
const TfRefBase* ptr)
const {
1150 if (_Counter::RemoveRef(ptr)) {
1152 reinterpret_cast<T*>(const_cast<TfRefBase*>(ptr)));
1157 #if ! defined(doxygen)
1170 #if !defined(doxygen)
1193 return !(p ==
nullptr);
1198 return !(
nullptr ==
p);
1202 inline bool operator< (const TfRefPtr<T> &
p, std::nullptr_t)
1204 return std::less<const TfRefBase *>()(
get_pointer(p),
nullptr);
1207 inline bool operator< (std::nullptr_t, const TfRefPtr<T> &
p)
1209 return std::less<const TfRefBase *>()(
nullptr,
get_pointer(p));
1213 inline bool operator<= (const TfRefPtr<T> &
p, std::nullptr_t)
1215 return !(
nullptr <
p);
1218 inline bool operator<= (std::nullptr_t, const TfRefPtr<T> &
p)
1220 return !(p <
nullptr);
1237 return !(p <
nullptr);
1242 return !(
nullptr <
p);
1246 template <
typename T>
1252 const std::type_info&
1258 return typeid(*ptr._GetData());
1261 template <
class D,
class T>
1267 return RefPtr(dynamic_cast<typename D::DataType*>(ptr._GetData()));
1270 template <
class D,
class T>
1276 return RefPtr(TfSafeDynamic_cast<typename D::DataType*>(ptr._GetData()));
1279 template <
class D,
class T>
1285 return RefPtr(static_cast<typename D::DataType*>(ptr._GetData()));
1296 return *((NonConstRefPtr*)(&ptr));
1318 return t.operator-> ();
1336 return t.operator-> ();
1352 #if !defined(doxygen)
1365 template<
typename T>
1384 auto refBase = ptr._refBase;
1385 return hboost::hash<decltype(refBase)>()(refBase);
1388 template <
class HashState,
class T>
1397 #define TF_SUPPORTS_REFPTR(T) hboost::is_base_of<TfRefBase, T >::value
1399 #if defined(ARCH_COMPILER_MSVC)
1404 #define TF_REFPTR_CONST_VOLATILE_GET(x) \
1409 get_pointer(const volatile x* p) \
1415 #define TF_REFPTR_CONST_VOLATILE_GET(x)
1420 #endif // PXR_BASE_TF_REF_PTR_H
void swap(ArAssetInfo &lhs, ArAssetInfo &rhs)
static void Class_Object_MUST_Be_Passed_By_Address()
TfRefPtr< T > TfCreateRefPtr(T *ptr)
PXR_NAMESPACE_OPEN_SCOPE size_t hash_value(const TfRefPtr< T > &ptr)
TfRefPtr< typename T::DataType > TfConst_cast(const TfRefPtr< const typename T::DataType > &ptr)
static TfRefPtr< const T > ConstructFromRawPtr(T *ptr)
friend size_t hash_value(const TfRefPtr< U > &)
TfRefPtr(TfNullPtrType)
Implicit conversion from TfNullPtr to TfRefPtr.
const TfRefCount & GetRefCount() const
void swap(UT::ArraySet< Key, MULTI, MAX_LOAD_FACTOR_256, Clearer, Hash, KeyEqual > &a, UT::ArraySet< Key, MULTI, MAX_LOAD_FACTOR_256, Clearer, Hash, KeyEqual > &b)
bool operator>(const TfRefPtr< U > &p) const
static bool RemoveRef(TfRefBase const *ptr)
const TfRefBase *(TfRefPtr::*) UnspecifiedBoolType
static bool IsNull(const TfRefPtr< T > &t)
TF_API const TfNullPtrType TfNullPtr
static void Class_Object_MUST_Be_Passed_By_Address()
void Tf_RefPtrTracker_LastRef(const void *, const void *)
friend T * get_pointer(TfRefPtr const &p)
friend TfRefPtr< U > TfCreateRefPtr(U *)
bool operator>=(const TfRefPtr< U > &p) const
TfRefPtr< T > & operator=(const TfRefPtr< T > &p)
Y * get_pointer(TfWeakPtrFacade< X, Y > const &p)
bool operator!() const
True if the pointer points to NULL.
friend TfRefPtr< typename D::DataType > TfSafeDynamic_cast(const TfRefPtr< B > &)
void Tf_RefPtrTracker_Delete(const void *, const void *)
TfRefPtr(U *ptr, typename std::enable_if< std::is_convertible< U *, T * >::value >::type *=nullptr)
T & operator*() const
Dereferences the stored pointer.
static bool RemoveRef(TfRefBase const *refBase)
TfRefPtr< typename D::DataType > TfDynamic_cast(const TfRefPtr< T > &ptr)
bool operator!=(const TfRefPtr< U > &p) const
TF_API void Tf_PostNullSmartPtrDereferenceFatalError(const TfCallContext &, const char *)
TfRefPtr(const TfRefPtr< T > &p)
static TF_API bool _AddRefIfNonzero(TfRefBase const *refBase)
T * get_pointer(PXR_NS::TfRefPtr< T > const &p)
static const T * GetRawPtr(const TfRefPtr< const T > &t)
TfRefPtr(TfRefPtr< U > &&p)
A generic, discriminated value, whose type may be queried dynamically.
TfRefPtr< T > & operator=(TfRefPtr< U > &&p)
static T * GetRawPtr(const TfRefPtr< T > &t)
bool operator!=(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Inequality operator, does exact floating point comparisons.
const std::type_info & TfTypeid(const TfRefPtr< T > &ptr)
friend const std::type_info & TfTypeid(const TfRefPtr< U > &ptr)
static bool AddRefIfNonzero(TfRefBase const *ptr)
TfRefPtr< typename D::DataType > TfSafeDynamic_cast(const TfRefPtr< T > &ptr)
TfRefPtr< typename D::DataType > TfStatic_cast(const TfRefPtr< T > &ptr)
TfRefPtr(TfRefPtr< T > &&p)
void Tf_RefPtrTracker_New(const void *, const void *)
static int AddRef(TfRefBase const *refBase)
static TF_API int _AddRef(TfRefBase const *refBase)
friend TfRefPtr< typename D::DataType > TfDynamic_cast(const TfRefPtr< B > &)
bool operator>(const TfRefPtr< T > &p, std::nullptr_t)
GLfloat GLfloat GLfloat GLfloat h
TfRefPtr(std::nullptr_t)
Implicit conversion from nullptr to TfRefPtr.
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
TfRefPtr< T > & operator=(TfRefPtr< T > &&p)
static bool AddRefIfNonzero(TfRefBase const *ptr)
static bool IsNull(const TfRefPtr< const T > &t)
static TF_API bool _RemoveRef(TfRefBase const *refBase)
void Tf_RefPtrTracker_FirstRef(const void *, const void *)
#define PXR_NAMESPACE_CLOSE_SCOPE
GLsizei const GLfloat * value
static TfRefPtr< T > ConstructFromRawPtr(T *ptr)
friend void TfHashAppend(HashState &, const TfRefPtr< U > &)
void TfHashAppend(HashState &h, const TfRefPtr< T > &ptr)
T DataType
Convenience type accessor to underlying type T for template code.
friend TfRefPtr< typename D::DataType > TfStatic_cast(const TfRefPtr< B > &)
bool operator>=(const TfRefPtr< T > &p, std::nullptr_t)
TfRefPtr(const TfRefPtr< U > &p)
friend TfRefPtr< U > TfCreateRefPtrFromProtectedWeakPtr(TfWeakPtr< U > const &)
void Tf_RefPtrTracker_Assign(const void *, const void *, const void *)
TfRefPtr< T > & operator=(const TfRefPtr< U > &p)
static void Class_Object_MUST_Not_Be_Const()
T * operator->() const
Accessor to T's public members.
static int AddRef(TfRefBase const *refBase)
bool operator==(const TfRefPtr< U > &p) const
friend TfRefPtr< typename D::DataType > TfConst_cast(const TfRefPtr< const typename D::DataType > &)
bool operator==(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Equality operator, does exact floating point comparisons.
void swap(TfRefPtr &other)