24 #ifndef PXR_BASE_TF_REF_PTR_H
25 #define PXR_BASE_TF_REF_PTR_H
441 #include <type_traits>
464 template <
template <
class>
class X,
class Y>
483 if (refBase->_shouldInvokeUniqueChangedListener)
495 return refBase->_shouldInvokeUniqueChangedListener ?
508 if (ptr->_shouldInvokeUniqueChangedListener) {
512 auto val = counter.load();
516 }
while (!counter.compare_exchange_weak(
val,
val + 1));
540 return (ptr && (ptr->
GetRefCount()._DecrementAndTestIfZero()));
550 auto val = counter.load();
554 }
while (!counter.compare_exchange_weak(
val,
val + 1));
578 using _Counter =
typename std::conditional<
609 p._refBase =
nullptr;
612 _GetObjectForTracking());
626 template <
template <
class>
class X,
class U>
628 typename std::enable_if<
679 U*
ptr,
typename std::enable_if<
729 _GetObjectForTracking());
732 _refBase = p._refBase;
748 _GetObjectForTracking());
750 p._GetObjectForTracking());
753 _refBase = p._refBase;
754 p._refBase =
nullptr;
766 _RemoveRef(_refBase);
777 #if !defined(doxygen)
796 #if !defined(doxygen)
801 p._refBase =
nullptr;
804 _GetObjectForTracking());
817 #if !defined(doxygen)
824 reinterpret_cast<T*>(p._GetObjectForTracking()),
825 _GetObjectForTracking());
827 _refBase = p._GetData();
844 #if !defined(doxygen)
851 reinterpret_cast<T*>(p._GetObjectForTracking()),
852 _GetObjectForTracking());
855 reinterpret_cast<T*>(p._GetObjectForTracking()));
857 _refBase = p._GetData();
858 p._refBase =
nullptr;
867 #if !defined(doxygen)
871 -> decltype(std::declval<T *>() == std::declval<U *>(),
bool()) {
872 return _refBase == p._refBase;
878 #if !defined(doxygen)
882 -> decltype(std::declval<T *>() != std::declval<U *>(),
bool()) {
883 return _refBase != p._refBase;
890 #if !defined(doxygen)
893 auto operator<(const TfRefPtr<U>& p)
const
894 -> decltype(std::declval<T *>() < std::declval<U *>(),
bool()) {
895 return _refBase < p._refBase;
898 #if !defined(doxygen)
902 -> decltype(std::declval<T *>() > std::declval<U *>(),
bool()) {
903 return _refBase > p._refBase;
906 #if !defined(doxygen)
909 auto operator<=(const TfRefPtr<U>& p)
const
910 -> decltype(std::declval<T *>() <= std::declval<U *>(),
bool()) {
911 return _refBase <= p._refBase;
914 #if !defined(doxygen)
918 -> decltype(std::declval<T *>() >= std::declval<U *>(),
bool()) {
919 return _refBase >= p._refBase;
925 return static_cast<T*
>(
const_cast<TfRefBase*
>(_refBase));
936 #if !defined(doxygen)
942 return _refBase ? &TfRefPtr::_refBase :
nullptr;
947 return _refBase ==
nullptr;
956 _GetObjectForTracking());
958 other._GetObjectForTracking());
971 template <
class HashState,
class U>
977 return static_cast<T *
>(
const_cast<TfRefBase *
>(p._refBase));
981 class _CreateRefPtr { };
1010 #if defined(doxygen)
1015 template <
class D,
class B>
1019 template <
class D,
class B>
1040 #if defined(doxygen)
1045 template <
class D,
class B>
1062 #if defined(doxygen)
1072 T* _GetData()
const {
1073 return static_cast<T*
>(
const_cast<TfRefBase*
>(_refBase));
1082 T* _GetObjectForTracking()
const {
1083 return reinterpret_cast<T*
>(
const_cast<TfRefBase*
>(_refBase));
1096 void _AddRef()
const {
1097 _Counter::AddRef(_refBase);
1100 void _RemoveRef(
const TfRefBase* ptr)
const {
1101 if (_Counter::RemoveRef(ptr)) {
1103 reinterpret_cast<T*>(const_cast<TfRefBase*>(ptr)));
1108 #if ! defined(doxygen)
1121 #if !defined(doxygen)
1144 return !(p ==
nullptr);
1149 return !(
nullptr == p);
1153 inline bool operator< (const TfRefPtr<T> &p, std::nullptr_t)
1155 return std::less<const TfRefBase *>()(
get_pointer(p),
nullptr);
1158 inline bool operator< (std::nullptr_t, const TfRefPtr<T> &p)
1160 return std::less<const TfRefBase *>()(
nullptr,
get_pointer(p));
1164 inline bool operator<= (const TfRefPtr<T> &p, std::nullptr_t)
1166 return !(
nullptr < p);
1169 inline bool operator<= (std::nullptr_t, const TfRefPtr<T> &p)
1171 return !(p <
nullptr);
1188 return !(p <
nullptr);
1193 return !(
nullptr < p);
1197 template <
typename T>
1203 const std::type_info&
1209 return typeid(*ptr._GetData());
1212 template <
class D,
class T>
1218 return RefPtr(dynamic_cast<typename D::DataType*>(ptr._GetData()));
1221 template <
class D,
class T>
1227 return RefPtr(TfSafeDynamic_cast<typename D::DataType*>(ptr._GetData()));
1230 template <
class D,
class T>
1236 return RefPtr(static_cast<typename D::DataType*>(ptr._GetData()));
1247 return *((NonConstRefPtr*)(&ptr));
1269 return t.operator-> ();
1287 return t.operator-> ();
1303 #if !defined(doxygen)
1316 template<
typename T>
1335 template <
class HashState,
class T>
1344 #define TF_SUPPORTS_REFPTR(T) std::is_base_of<TfRefBase, T>::value
1348 #endif // PXR_BASE_TF_REF_PTR_H
void swap(ArAssetInfo &lhs, ArAssetInfo &rhs)
static void Class_Object_MUST_Be_Passed_By_Address()
auto operator==(const TfRefPtr< U > &p) const -> decltype(std::declval< T * >()==std::declval< U * >(), bool())
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)
auto operator>=(const TfRefPtr< U > &p) const -> decltype(std::declval< T * >() >=std::declval< U * >(), bool())
GLsizei const GLfloat * value
static bool RemoveRef(TfRefBase const *ptr)
const TfRefBase *(TfRefPtr::*) UnspecifiedBoolType
static bool IsNull(const TfRefPtr< T > &t)
TF_API const TfNullPtrType TfNullPtr
auto operator>(const TfRefPtr< U > &p) const -> decltype(std::declval< T * >() > std::declval< U * >(), bool())
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 *)
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)
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.
auto operator!=(const TfRefPtr< U > &p) const -> decltype(std::declval< T * >()!=std::declval< U * >(), bool())
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
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)
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)