7#ifndef PXR_BASE_TF_WEAK_PTR_FACADE_H
8#define PXR_BASE_TF_WEAK_PTR_FACADE_H
21PXR_NAMESPACE_OPEN_SCOPE
25template <
template <
class>
class PtrTemplate,
class DataType>
35 template <
template <
class>
class PtrTemplate,
class DataType>
36 friend class TfWeakPtrFacade;
38 template <
class Facade>
39 static typename Facade::DataType *FetchPointer(Facade
const &f) {
40 return f._FetchPointer();
43 template <
class Facade>
44 static void const *GetUniqueIdentifier(Facade
const &f) {
45 return f._GetUniqueIdentifier();
48 template <
class Facade>
49 static void EnableExtraNotification(Facade
const &f) {
50 return f._EnableExtraNotification();
53 template <
class Facade>
54 static bool IsInvalid(Facade
const &f) {
55 return f._IsInvalid();
65template <
template <
class>
class X,
class Y>
66Y *get_pointer(TfWeakPtrFacade<X, Y>
const &p) {
67 return TfWeakPtrFacadeAccess::FetchPointer(p);
70PXR_NAMESPACE_CLOSE_SCOPE
75 using PXR_NS::get_pointer;
78PXR_NAMESPACE_OPEN_SCOPE
81class TfWeakPtrFacadeBase {};
83template <
template <
class>
class PtrTemplate,
class Type>
84class TfWeakPtrFacade :
public TfWeakPtrFacadeBase {
90 typedef Type DataType;
91 typedef PtrTemplate<DataType> Derived;
94 typedef Type element_type;
96 template <
class Other>
97 bool operator == (PtrTemplate<Other>
const &p)
const {
99 return _FetchPointer() == TfWeakPtrFacadeAccess::FetchPointer(p);
100 return GetUniqueIdentifier() == p.GetUniqueIdentifier();
103 template <
class Other>
104 bool operator != (PtrTemplate<Other>
const &p)
const {
105 return !(*
this == p);
110 if (!GetUniqueIdentifier())
112 DataType *ptr = _FetchPointer();
113 return ptr && ptr == get_pointer(p);
118 return !(*
this == p);
122 friend bool operator == (
const TfRefPtr<T>& p1, Derived
const &p2) {
127 friend bool operator != (
const TfRefPtr<T>& p1, Derived
const &p2) {
131 template <
class Other>
132 bool operator < (PtrTemplate<Other>
const &p)
const {
134 return _FetchPointer() < TfWeakPtrFacadeAccess::FetchPointer(p);
135 return GetUniqueIdentifier() < p.GetUniqueIdentifier();
138 template <
class Other>
139 bool operator > (PtrTemplate<Other>
const &p)
const {
140 return !(*
this < p) && !(*
this == p);
143 template <
class Other>
144 bool operator <= (PtrTemplate<Other>
const &p)
const {
145 return (*
this < p) || (*
this == p);
148 template <
class Other>
149 bool operator >= (PtrTemplate<Other>
const &p)
const {
153 using UnspecifiedBoolType = DataType * (TfWeakPtrFacade::*)(
void)
const;
155 operator UnspecifiedBoolType ()
const {
156 return _FetchPointer() ? &TfWeakPtrFacade::_FetchPointer :
nullptr;
159 bool operator ! ()
const {
160 return !(bool(*
this));
164 bool PointsTo(T
const &obj)
const {
165 return _FetchPointer() == &obj;
172 bool PointsToA()
const {
173 return dynamic_cast<T *
>(_FetchPointer());
176 bool IsInvalid()
const {
177 return Access::IsInvalid(_Derived());
180 void const *GetUniqueIdentifier()
const {
181 return Access::GetUniqueIdentifier(_Derived());
185 return &_Derived()->__GetTfWeakBase__();
188 void EnableExtraNotification()
const {
189 Access::EnableExtraNotification(_Derived());
192 DataType *operator -> ()
const {
193 DataType *ptr = _FetchPointer();
197 Tf_PostNullSmartPtrDereferenceFatalError(
198 TF_CALL_CONTEXT,
typeid(Derived).name());
201 DataType &operator * ()
const {
202 return * operator->();
208 _Derived() = TfNullPtr;
213 friend std::type_info
const &TfTypeid(Derived
const &p) {
214 if (ARCH_UNLIKELY(!p))
217 return typeid(*get_pointer(p));
220 DataType *_FetchPointer()
const {
221 return Access::FetchPointer(_Derived());
224 Derived &_Derived() {
225 return static_cast<Derived &
>(*this);
228 Derived
const &_Derived()
const {
229 return static_cast<Derived
const &
>(*this);
244template <
template <
class>
class X,
class Y>
245inline bool operator== (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
249template <
template <
class>
class X,
class Y>
250inline bool operator== (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
255template <
template <
class>
class X,
class Y>
256inline bool operator!= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
258 return !(p ==
nullptr);
260template <
template <
class>
class X,
class Y>
261inline bool operator!= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
263 return !(
nullptr == p);
266template <
template <
class>
class X,
class Y>
267inline bool operator< (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
269 return std::less<void const *>()(p.GetUniqueIdentifier(),
nullptr);
271template <
template <
class>
class X,
class Y>
272inline bool operator< (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
274 return std::less<void const *>()(
nullptr, p.GetUniqueIdentifier());
277template <
template <
class>
class X,
class Y>
278inline bool operator<= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
280 return !(
nullptr < p);
282template <
template <
class>
class X,
class Y>
283inline bool operator<= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
285 return !(p <
nullptr);
288template <
template <
class>
class X,
class Y>
289inline bool operator> (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
293template <
template <
class>
class X,
class Y>
294inline bool operator> (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
299template <
template <
class>
class X,
class Y>
300inline bool operator>= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
302 return !(p <
nullptr);
304template <
template <
class>
class X,
class Y>
305inline bool operator>= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
307 return !(
nullptr < p);
312template <
class ToPtr,
template <
class>
class X,
class Y>
313ToPtr TfDynamic_cast(TfWeakPtrFacade<X, Y>
const &p) {
314 return ToPtr(
dynamic_cast<typename ToPtr::DataType *
>
318template <
class ToPtr,
template <
class>
class X,
class Y>
320 return ToPtr(TfSafeDynamic_cast<typename ToPtr::DataType *>
324template <
class ToPtr,
template <
class>
class X,
class Y>
325ToPtr TfStatic_cast(TfWeakPtrFacade<X, Y>
const &p) {
326 return ToPtr(
static_cast<typename ToPtr::DataType *
>
330template <
class ToPtr,
template <
class>
class X,
class Y>
331ToPtr TfConst_cast(TfWeakPtrFacade<X, Y>
const &p) {
332 return ToPtr(
const_cast<typename ToPtr::DataType *
>
344template <
template <
class>
class X,
class U>
346 typename std::enable_if<
347 std::is_convertible<U*, T*>::value
349 : _refBase(get_pointer(p))
352 Tf_RefPtrTracker_New(
this, _GetObjectForTracking());
358template <
template <
class>
class Ptr,
class T>
361 std::is_base_of<TfWeakPtrFacadeBase, Ptr<T>>::value
364 static T* GetRawPtr(
const Ptr<T>& t) {
365 return get_pointer(t);
368 static Ptr<T> ConstructFromRawPtr(T* ptr) {
372 static bool IsNull(
const Ptr<T>& t) {
376 static void Class_Object_MUST_Be_Passed_By_Address() { }
377 static void Class_Object_MUST_Not_Be_Const() { }
380template <
template <
class>
class Ptr,
class T>
383 std::is_base_of<TfWeakPtrFacadeBase, Ptr<const T>>::value
386 static const T* GetRawPtr(
const Ptr<const T>& t) {
387 return get_pointer(t);
390 static Ptr<const T> ConstructFromRawPtr(
const T* ptr) {
391 return Ptr<const T>(ptr);
394 static bool IsNull(
const Ptr<const T>& t) {
398 static void Class_Object_MUST_Be_Passed_By_Address() { }
402template <
class HashState,
template <
class>
class X,
class T>
404TfHashAppend(HashState &h, TfWeakPtrFacade<X, T>
const &ptr)
406 return h.Append(ptr.GetUniqueIdentifier());
410template <
template <
class>
class X,
class T>
417PXR_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.