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()));
584 typedef typename hboost::mpl::if_c<
615 p._refBase =
nullptr;
618 _GetObjectForTracking());
632 template <
template <
class>
class X,
class U>
634 typename hboost::enable_if<
635 hboost::is_convertible<U*, T*>
685 U*
ptr,
typename std::enable_if<
735 _GetObjectForTracking());
738 _refBase = p._refBase;
754 _GetObjectForTracking());
756 p._GetObjectForTracking());
759 _refBase =
p._refBase;
760 p._refBase =
nullptr;
772 _RemoveRef(_refBase);
779 static void _CheckTypeAssignability() {
781 if (unused) unused = 0;
786 static void _CheckTypeComparability() {
787 bool unused = ((
T*)0 == (U*)0);
788 if (unused) unused =
false;
801 #if !defined(doxygen)
807 _CheckTypeAssignability<U>();
824 #if !defined(doxygen)
830 _CheckTypeAssignability<U>();
833 p._refBase =
nullptr;
836 _GetObjectForTracking());
849 #if !defined(doxygen)
855 _CheckTypeAssignability<U>();
859 reinterpret_cast<T*>(p._GetObjectForTracking()),
860 _GetObjectForTracking());
862 _refBase = p._GetData();
879 #if !defined(doxygen)
885 _CheckTypeAssignability<U>();
889 reinterpret_cast<T*>(
p._GetObjectForTracking()),
890 _GetObjectForTracking());
893 reinterpret_cast<T*>(
p._GetObjectForTracking()));
895 _refBase =
p._GetData();
896 p._refBase =
nullptr;
905 #if !defined(doxygen)
910 _CheckTypeComparability<U>();
912 return _refBase == p._refBase;
919 #if !defined(doxygen)
922 bool operator< (const TfRefPtr<U>&
p)
const {
924 _CheckTypeComparability<U>();
926 return _refBase <
p._refBase;
929 #if !defined(doxygen)
934 _CheckTypeComparability<U>();
936 return _refBase > p._refBase;
939 #if !defined(doxygen)
942 bool operator<= (const TfRefPtr<U>&
p)
const {
944 _CheckTypeComparability<U>();
946 return _refBase <=
p._refBase;
949 #if !defined(doxygen)
954 _CheckTypeComparability<U>();
956 return _refBase >= p._refBase;
962 #if !defined(doxygen)
967 _CheckTypeComparability<U>();
969 return _refBase != p._refBase;
975 return static_cast<T*
>(
const_cast<TfRefBase*
>(_refBase));
986 #if !defined(doxygen)
992 return _refBase ? &TfRefPtr::_refBase :
nullptr;
997 return _refBase ==
nullptr;
1006 _GetObjectForTracking());
1008 other._GetObjectForTracking());
1021 template <
class HashState,
class U>
1027 return static_cast<T *
>(
const_cast<TfRefBase *
>(p._refBase));
1031 class _CreateRefPtr { };
1060 #if defined(doxygen)
1065 template <
class D,
class B>
1069 template <
class D,
class B>
1090 #if defined(doxygen)
1095 template <
class D,
class B>
1112 #if defined(doxygen)
1122 T* _GetData()
const {
1123 return static_cast<T*
>(
const_cast<TfRefBase*
>(_refBase));
1132 T* _GetObjectForTracking()
const {
1133 return reinterpret_cast<T*
>(
const_cast<TfRefBase*
>(_refBase));
1146 void _AddRef()
const {
1147 _Counter::AddRef(_refBase);
1150 void _RemoveRef(
const TfRefBase* ptr)
const {
1151 if (_Counter::RemoveRef(ptr)) {
1153 reinterpret_cast<T*>(const_cast<TfRefBase*>(ptr)));
1158 #if ! defined(doxygen)
1171 #if !defined(doxygen)
1194 return !(p ==
nullptr);
1199 return !(
nullptr ==
p);
1203 inline bool operator< (const TfRefPtr<T> &
p, std::nullptr_t)
1205 return std::less<const TfRefBase *>()(
get_pointer(p),
nullptr);
1208 inline bool operator< (std::nullptr_t, const TfRefPtr<T> &
p)
1210 return std::less<const TfRefBase *>()(
nullptr,
get_pointer(p));
1214 inline bool operator<= (const TfRefPtr<T> &
p, std::nullptr_t)
1216 return !(
nullptr <
p);
1219 inline bool operator<= (std::nullptr_t, const TfRefPtr<T> &
p)
1221 return !(p <
nullptr);
1238 return !(p <
nullptr);
1243 return !(
nullptr <
p);
1247 template <
typename T>
1253 const std::type_info&
1259 return typeid(*ptr._GetData());
1262 template <
class D,
class T>
1268 return RefPtr(dynamic_cast<typename D::DataType*>(ptr._GetData()));
1271 template <
class D,
class T>
1277 return RefPtr(TfSafeDynamic_cast<typename D::DataType*>(ptr._GetData()));
1280 template <
class D,
class T>
1286 return RefPtr(static_cast<typename D::DataType*>(ptr._GetData()));
1297 return *((NonConstRefPtr*)(&ptr));
1319 return t.operator-> ();
1337 return t.operator-> ();
1353 #if !defined(doxygen)
1366 template<
typename T>
1385 auto refBase = ptr._refBase;
1386 return hboost::hash<decltype(refBase)>()(refBase);
1389 template <
class HashState,
class T>
1398 #define TF_SUPPORTS_REFPTR(T) hboost::is_base_of<TfRefBase, T >::value
1400 #if defined(ARCH_COMPILER_MSVC)
1405 #define TF_REFPTR_CONST_VOLATILE_GET(x) \
1410 get_pointer(const volatile x* p) \
1416 #define TF_REFPTR_CONST_VOLATILE_GET(x)
1421 #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
GLuint const GLfloat * val
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
TfRefPtr(const TfRefPtr< T > &p)
static TF_API bool _AddRefIfNonzero(TfRefBase const *refBase)
T * get_pointer(PXR_NS::TfRefPtr< T > const &p)
TF_API void Tf_PostNullSmartPtrDereferenceFatalError(const TfCallContext &, const std::type_info &)
static const T * GetRawPtr(const TfRefPtr< const T > &t)
TfRefPtr(TfRefPtr< U > &&p)
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)
GLfloat GLfloat GLfloat GLfloat h
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)
GLuint GLuint GLsizei GLenum type
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)
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
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.
GLsizei const GLfloat * value
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)