24#ifndef PXR_BASE_TF_WEAK_PTR_FACADE_H
25#define PXR_BASE_TF_WEAK_PTR_FACADE_H
38PXR_NAMESPACE_OPEN_SCOPE
42template <
template <
class>
class PtrTemplate,
class DataType>
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();
82template <
template <
class>
class X,
class Y>
83Y *get_pointer(TfWeakPtrFacade<X, Y>
const &p) {
84 return TfWeakPtrFacadeAccess::FetchPointer(p);
87PXR_NAMESPACE_CLOSE_SCOPE
92 using PXR_NS::get_pointer;
95PXR_NAMESPACE_OPEN_SCOPE
98class TfWeakPtrFacadeBase {};
100template <
template <
class>
class PtrTemplate,
class Type>
101class 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);
139 friend bool operator == (
const TfRefPtr<T>& p1, Derived
const &p2) {
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);
261template <
template <
class>
class X,
class Y>
262inline bool operator== (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
266template <
template <
class>
class X,
class Y>
267inline bool operator== (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
272template <
template <
class>
class X,
class Y>
273inline bool operator!= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
275 return !(p ==
nullptr);
277template <
template <
class>
class X,
class Y>
278inline bool operator!= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
280 return !(
nullptr == p);
283template <
template <
class>
class X,
class Y>
284inline bool operator< (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
286 return std::less<void const *>()(p.GetUniqueIdentifier(),
nullptr);
288template <
template <
class>
class X,
class Y>
289inline bool operator< (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
291 return std::less<void const *>()(
nullptr, p.GetUniqueIdentifier());
294template <
template <
class>
class X,
class Y>
295inline bool operator<= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
297 return !(
nullptr < p);
299template <
template <
class>
class X,
class Y>
300inline bool operator<= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
302 return !(p <
nullptr);
305template <
template <
class>
class X,
class Y>
306inline bool operator> (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
310template <
template <
class>
class X,
class Y>
311inline bool operator> (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
316template <
template <
class>
class X,
class Y>
317inline bool operator>= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
319 return !(p <
nullptr);
321template <
template <
class>
class X,
class Y>
322inline bool operator>= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
324 return !(
nullptr < p);
329template <
class ToPtr,
template <
class>
class X,
class Y>
330ToPtr TfDynamic_cast(TfWeakPtrFacade<X, Y>
const &p) {
331 return ToPtr(
dynamic_cast<typename ToPtr::DataType *
>
335template <
class ToPtr,
template <
class>
class X,
class Y>
337 return ToPtr(TfSafeDynamic_cast<typename ToPtr::DataType *>
341template <
class ToPtr,
template <
class>
class X,
class Y>
342ToPtr TfStatic_cast(TfWeakPtrFacade<X, Y>
const &p) {
343 return ToPtr(
static_cast<typename ToPtr::DataType *
>
347template <
class ToPtr,
template <
class>
class X,
class Y>
348ToPtr TfConst_cast(TfWeakPtrFacade<X, Y>
const &p) {
349 return ToPtr(
const_cast<typename ToPtr::DataType *
>
361template <
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());
375template <
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() { }
397template <
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() { }
419template <
class HashState,
template <
class>
class X,
class T>
421TfHashAppend(HashState &h, TfWeakPtrFacade<X, T>
const &ptr)
423 return h.Append(ptr.GetUniqueIdentifier());
427template <
template <
class>
class X,
class T>
434PXR_NAMESPACE_CLOSE_SCOPE
Low-level utilities for informing users of various internal and external diagnostic conditions.
A user-extensible hashing mechanism for use with runtime hash tables.
Reference-counted smart pointer utility class.
TfRefPtr()
Initialize pointer to nullptr.
T DataType
Convenience type accessor to underlying type T for template code.
Enable a concrete base class for use with TfWeakPtr.
This access class is befriended by TfWeakPtrFacade -derived classes to grant TfWeakPtrFacade access t...
Demangle C++ typenames generated by the typeid() facility.
std::string ArchGetDemangled()
Return demangled RTTI generated-type name.
#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.
TO TfSafeDynamic_cast(FROM *ptr)
Safely perform a dynamic cast.
Implements assorted functions based on compile-time type information.