24 #ifndef PXR_BASE_TF_WEAK_PTR_FACADE_H 25 #define PXR_BASE_TF_WEAK_PTR_FACADE_H 36 #include <type_traits> 38 PXR_NAMESPACE_OPEN_SCOPE
42 template <
template <
class>
class PtrTemplate,
class DataType>
43 class TfWeakPtrFacade;
52 template <
template <
class>
class PtrTemplate,
class DataType>
53 friend class TfWeakPtrFacade;
55 template <
class Facade>
56 static typename Facade::DataType *FetchPointer(Facade
const &f) {
57 return f._FetchPointer();
60 template <
class Facade>
61 static void const *GetUniqueIdentifier(Facade
const &f) {
62 return f._GetUniqueIdentifier();
65 template <
class Facade>
66 static void EnableExtraNotification(Facade
const &f) {
67 return f._EnableExtraNotification();
70 template <
class Facade>
71 static bool IsInvalid(Facade
const &f) {
72 return f._IsInvalid();
82 template <
template <
class>
class X,
class Y>
83 Y *get_pointer(TfWeakPtrFacade<X, Y>
const &p) {
84 return TfWeakPtrFacadeAccess::FetchPointer(p);
87 PXR_NAMESPACE_CLOSE_SCOPE
92 using PXR_NS::get_pointer;
95 PXR_NAMESPACE_OPEN_SCOPE
98 class TfWeakPtrFacadeBase {};
100 template <
template <
class>
class PtrTemplate,
class Type>
101 class TfWeakPtrFacade :
public TfWeakPtrFacadeBase {
107 typedef Type DataType;
108 typedef PtrTemplate<DataType> Derived;
111 typedef Type element_type;
113 template <
class Other>
114 bool operator == (PtrTemplate<Other>
const &p)
const {
116 return _FetchPointer() == TfWeakPtrFacadeAccess::FetchPointer(p);
117 return GetUniqueIdentifier() == p.GetUniqueIdentifier();
120 template <
class Other>
121 bool operator != (PtrTemplate<Other>
const &p)
const {
122 return !(*
this == p);
127 if (!GetUniqueIdentifier())
129 DataType *ptr = _FetchPointer();
130 return ptr && ptr == get_pointer(p);
135 return !(*
this == p);
144 friend bool operator != (
const TfRefPtr<T>& p1, Derived
const &p2) {
148 template <
class Other>
149 bool operator < (PtrTemplate<Other>
const &p)
const {
151 return _FetchPointer() < TfWeakPtrFacadeAccess::FetchPointer(p);
152 return GetUniqueIdentifier() < p.GetUniqueIdentifier();
155 template <
class Other>
156 bool operator > (PtrTemplate<Other>
const &p)
const {
157 return !(*
this < p) && !(*
this == p);
160 template <
class Other>
161 bool operator <= (PtrTemplate<Other>
const &p)
const {
162 return (*
this < p) || (*
this == p);
165 template <
class Other>
166 bool operator >= (PtrTemplate<Other>
const &p)
const {
170 using UnspecifiedBoolType = DataType * (TfWeakPtrFacade::*)(
void)
const;
172 operator UnspecifiedBoolType ()
const {
173 return _FetchPointer() ? &TfWeakPtrFacade::_FetchPointer :
nullptr;
176 bool operator ! ()
const {
177 return !(bool(*
this));
181 bool PointsTo(T
const &obj)
const {
182 return _FetchPointer() == &obj;
189 bool PointsToA()
const {
190 return dynamic_cast<T *>(_FetchPointer());
193 bool IsInvalid()
const {
194 return Access::IsInvalid(_Derived());
197 void const *GetUniqueIdentifier()
const {
198 return Access::GetUniqueIdentifier(_Derived());
202 return &_Derived()->__GetTfWeakBase__();
205 void EnableExtraNotification()
const {
206 Access::EnableExtraNotification(_Derived());
209 DataType *operator -> ()
const {
210 DataType *ptr = _FetchPointer();
214 Tf_PostNullSmartPtrDereferenceFatalError(
215 TF_CALL_CONTEXT,
typeid(Derived).name());
218 DataType &operator * ()
const {
219 return * operator->();
225 _Derived() = TfNullPtr;
230 friend std::type_info
const &TfTypeid(Derived
const &p) {
231 if (ARCH_UNLIKELY(!p))
234 return typeid(*get_pointer(p));
237 DataType *_FetchPointer()
const {
238 return Access::FetchPointer(_Derived());
241 Derived &_Derived() {
242 return static_cast<Derived &>(*
this);
245 Derived
const &_Derived()
const {
246 return static_cast<Derived const &>(*
this);
261 template <
template <
class>
class X,
class Y>
262 inline bool operator== (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
266 template <
template <
class>
class X,
class Y>
267 inline bool operator== (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
272 template <
template <
class>
class X,
class Y>
273 inline bool operator!= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
275 return !(p ==
nullptr);
277 template <
template <
class>
class X,
class Y>
278 inline bool operator!= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
280 return !(
nullptr == p);
283 template <
template <
class>
class X,
class Y>
284 inline bool operator< (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
286 return std::less<void const *>()(p.GetUniqueIdentifier(),
nullptr);
288 template <
template <
class>
class X,
class Y>
289 inline bool operator< (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
291 return std::less<void const *>()(
nullptr, p.GetUniqueIdentifier());
294 template <
template <
class>
class X,
class Y>
295 inline bool operator<= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
297 return !(
nullptr < p);
299 template <
template <
class>
class X,
class Y>
300 inline bool operator<= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
302 return !(p <
nullptr);
305 template <
template <
class>
class X,
class Y>
306 inline bool operator> (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
310 template <
template <
class>
class X,
class Y>
311 inline bool operator> (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
316 template <
template <
class>
class X,
class Y>
317 inline bool operator>= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
319 return !(p <
nullptr);
321 template <
template <
class>
class X,
class Y>
322 inline bool operator>= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
324 return !(
nullptr < p);
329 template <
class ToPtr,
template <
class>
class X,
class Y>
331 return ToPtr(dynamic_cast<typename ToPtr::DataType *>
335 template <
class ToPtr,
template <
class>
class X,
class Y>
337 return ToPtr(TfSafeDynamic_cast<typename ToPtr::DataType *>
341 template <
class ToPtr,
template <
class>
class X,
class Y>
343 return ToPtr(static_cast<typename ToPtr::DataType *>
347 template <
class ToPtr,
template <
class>
class X,
class Y>
348 ToPtr TfConst_cast(TfWeakPtrFacade<X, Y>
const &p) {
349 return ToPtr(const_cast<typename ToPtr::DataType *>
361 template <
template <
class>
class X,
class U>
363 typename std::enable_if<
364 std::is_convertible<U*, T*>::value
366 : _refBase(get_pointer(p))
369 Tf_RefPtrTracker_New(
this, _GetObjectForTracking());
375 template <
template <
class>
class Ptr,
class T>
378 std::is_base_of<TfWeakPtrFacadeBase, Ptr<T>>::value
381 static T* GetRawPtr(
const Ptr<T>& t) {
382 return get_pointer(t);
385 static Ptr<T> ConstructFromRawPtr(T* ptr) {
389 static bool IsNull(
const Ptr<T>& t) {
393 static void Class_Object_MUST_Be_Passed_By_Address() { }
394 static void Class_Object_MUST_Not_Be_Const() { }
397 template <
template <
class>
class Ptr,
class T>
400 std::is_base_of<TfWeakPtrFacadeBase, Ptr<const T>>::value
403 static const T* GetRawPtr(
const Ptr<const T>& t) {
404 return get_pointer(t);
407 static Ptr<const T> ConstructFromRawPtr(
const T* ptr) {
408 return Ptr<const T>(ptr);
411 static bool IsNull(
const Ptr<const T>& t) {
415 static void Class_Object_MUST_Be_Passed_By_Address() { }
419 template <
class HashState,
template <
class>
class X,
class T>
421 TfHashAppend(HashState &h, TfWeakPtrFacade<X, T>
const &ptr)
423 return h.Append(ptr.GetUniqueIdentifier());
427 template <
template <
class>
class X,
class T>
434 PXR_NAMESPACE_CLOSE_SCOPE
436 #endif // PXR_BASE_TF_WEAK_PTR_FACADE_H TfRefPtr()
Initialize pointer to nullptr.
TO TfSafeDynamic_cast(FROM *ptr)
Safely perform a dynamic cast.
SdfHandle< typename DST::SpecType > TfStatic_cast(const SdfHandle< SRC > &x)
Convert SdfHandle<SRC> x to an SdfHandle<DST>.
ARCH_API std::string ArchGetDemangled(const std::string &typeName)
Return demangled RTTI-generated type name.
AR_API bool operator!=(const ArAssetInfo &lhs, const ArAssetInfo &rhs)
T DataType
Convenience type accessor to underlying type T for template code.
Low-level utilities for informing users of various internal and external diagnostic conditions.
AR_API bool operator==(const ArAssetInfo &lhs, const ArAssetInfo &rhs)
Demangle C++ typenames generated by the typeid() facility.
A user-extensible hashing mechanism for use with runtime hash tables.
SdfHandle< typename DST::SpecType > TfDynamic_cast(const SdfHandle< SRC > &x)
Convert SdfHandle<SRC> x to an SdfHandle<DST>.
This access class is befriended by TfWeakPtrFacade -derived classes to grant TfWeakPtrFacade access t...
#define TF_FATAL_ERROR(fmt, args)
Issue a fatal error and end the program.
size_t hash_value(const half h)
Overload hash_value for half.
Implements assorted functions based on compile-time type information.
VT_API bool operator==(VtDictionary const &, VtDictionary const &)
Equality comparison.
Reference-counted smart pointer utility class.
Enable a concrete base class for use with TfWeakPtr.