24 #ifndef PXR_BASE_TF_WEAK_PTR_FACADE_H
25 #define PXR_BASE_TF_WEAK_PTR_FACADE_H
35 #include <boost/functional/hash_fwd.hpp>
36 #include <boost/mpl/or.hpp>
37 #include <boost/type_traits/is_base_of.hpp>
38 #include <boost/type_traits/is_same.hpp>
39 #include <boost/utility/enable_if.hpp>
41 PXR_NAMESPACE_OPEN_SCOPE
45 template <
template <
class>
class PtrTemplate,
class DataType>
46 class TfWeakPtrFacade;
55 template <
template <
class>
class PtrTemplate,
class DataType>
56 friend class TfWeakPtrFacade;
58 template <
class Facade>
59 static typename Facade::DataType *FetchPointer(Facade
const &f) {
60 return f._FetchPointer();
63 template <
class Facade>
64 static void const *GetUniqueIdentifier(Facade
const &f) {
65 return f._GetUniqueIdentifier();
68 template <
class Facade>
69 static void EnableExtraNotification(Facade
const &f) {
70 return f._EnableExtraNotification();
73 template <
class Facade>
74 static bool IsInvalid(Facade
const &f) {
75 return f._IsInvalid();
85 template <
template <
class>
class X,
class Y>
86 Y *get_pointer(TfWeakPtrFacade<X, Y>
const &p) {
87 return TfWeakPtrFacadeAccess::FetchPointer(p);
90 PXR_NAMESPACE_CLOSE_SCOPE
95 using PXR_NS::get_pointer;
98 PXR_NAMESPACE_OPEN_SCOPE
101 class TfWeakPtrFacadeBase {};
103 template <
template <
class>
class PtrTemplate,
class Type>
104 class TfWeakPtrFacade :
public TfWeakPtrFacadeBase {
110 typedef Type DataType;
111 typedef PtrTemplate<DataType> Derived;
114 typedef Type element_type;
116 template <
class Other>
117 bool operator == (PtrTemplate<Other>
const &p)
const {
119 return _FetchPointer() == TfWeakPtrFacadeAccess::FetchPointer(p);
120 return GetUniqueIdentifier() == p.GetUniqueIdentifier();
123 template <
class Other>
124 bool operator != (PtrTemplate<Other>
const &p)
const {
125 return !(*
this == p);
130 if (!GetUniqueIdentifier())
132 DataType *ptr = _FetchPointer();
133 return ptr && ptr == get_pointer(p);
138 return !(*
this == p);
147 friend bool operator != (
const TfRefPtr<T>& p1, Derived
const &p2) {
151 template <
class Other>
152 bool operator < (PtrTemplate<Other>
const &p)
const {
154 return _FetchPointer() < TfWeakPtrFacadeAccess::FetchPointer(p);
155 return GetUniqueIdentifier() < p.GetUniqueIdentifier();
158 template <
class Other>
159 bool operator > (PtrTemplate<Other>
const &p)
const {
160 return !(*
this < p) && !(*
this == p);
163 template <
class Other>
164 bool operator <= (PtrTemplate<Other>
const &p)
const {
165 return (*
this < p) || (*
this == p);
168 template <
class Other>
169 bool operator >= (PtrTemplate<Other>
const &p)
const {
173 using UnspecifiedBoolType = DataType * (TfWeakPtrFacade::*)(
void)
const;
175 operator UnspecifiedBoolType ()
const {
176 return _FetchPointer() ? &TfWeakPtrFacade::_FetchPointer :
nullptr;
179 bool operator ! ()
const {
180 return !(bool(*
this));
184 bool PointsTo(T
const &obj)
const {
185 return _FetchPointer() == &obj;
192 bool PointsToA()
const {
193 return dynamic_cast<T *
>(_FetchPointer());
196 bool IsInvalid()
const {
197 return Access::IsInvalid(_Derived());
200 void const *GetUniqueIdentifier()
const {
201 return Access::GetUniqueIdentifier(_Derived());
205 return &_Derived()->__GetTfWeakBase__();
208 void EnableExtraNotification()
const {
209 Access::EnableExtraNotification(_Derived());
212 DataType *operator -> ()
const {
213 DataType *ptr = _FetchPointer();
214 if (ARCH_LIKELY(ptr)) {
217 static const TfCallContext ctx(TF_CALL_CONTEXT);
218 Tf_PostNullSmartPtrDereferenceFatalError(ctx,
typeid(Derived));
221 DataType &operator * ()
const {
222 return * operator->();
228 _Derived() = TfNullPtr;
233 friend std::type_info
const &TfTypeid(Derived
const &p) {
234 if (ARCH_UNLIKELY(!p))
237 return typeid(*get_pointer(p));
240 DataType *_FetchPointer()
const {
241 return Access::FetchPointer(_Derived());
244 Derived &_Derived() {
245 return static_cast<Derived &
>(*this);
248 Derived
const &_Derived()
const {
249 return static_cast<Derived
const &
>(*this);
264 template <
template <
class>
class X,
class Y>
265 inline bool operator== (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
269 template <
template <
class>
class X,
class Y>
270 inline bool operator== (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
275 template <
template <
class>
class X,
class Y>
276 inline bool operator!= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
278 return !(p ==
nullptr);
280 template <
template <
class>
class X,
class Y>
281 inline bool operator!= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
283 return !(
nullptr == p);
286 template <
template <
class>
class X,
class Y>
287 inline bool operator< (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
289 return std::less<void const *>()(p.GetUniqueIdentifier(),
nullptr);
291 template <
template <
class>
class X,
class Y>
292 inline bool operator< (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
294 return std::less<void const *>()(
nullptr, p.GetUniqueIdentifier());
297 template <
template <
class>
class X,
class Y>
298 inline bool operator<= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
300 return !(
nullptr < p);
302 template <
template <
class>
class X,
class Y>
303 inline bool operator<= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
305 return !(p <
nullptr);
308 template <
template <
class>
class X,
class Y>
309 inline bool operator> (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
313 template <
template <
class>
class X,
class Y>
314 inline bool operator> (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
319 template <
template <
class>
class X,
class Y>
320 inline bool operator>= (TfWeakPtrFacade<X, Y>
const &p, std::nullptr_t)
322 return !(p <
nullptr);
324 template <
template <
class>
class X,
class Y>
325 inline bool operator>= (std::nullptr_t, TfWeakPtrFacade<X, Y>
const &p)
327 return !(
nullptr < p);
332 template <
class ToPtr,
template <
class>
class X,
class Y>
334 return ToPtr(dynamic_cast<typename ToPtr::DataType *>
338 template <
class ToPtr,
template <
class>
class X,
class Y>
340 return ToPtr(TfSafeDynamic_cast<typename ToPtr::DataType *>
344 template <
class ToPtr,
template <
class>
class X,
class Y>
346 return ToPtr(static_cast<typename ToPtr::DataType *>
350 template <
class ToPtr,
template <
class>
class X,
class Y>
351 ToPtr TfConst_cast(TfWeakPtrFacade<X, Y>
const &p) {
352 return ToPtr(const_cast<typename ToPtr::DataType *>
364 template <
template <
class>
class X,
class U>
366 typename boost::enable_if<
367 boost::is_convertible<U*, T*>
369 : _refBase(get_pointer(p))
372 Tf_RefPtrTracker_New(
this, _GetObjectForTracking());
378 template <
template <
class>
class Ptr,
class T>
380 typename boost::enable_if<
381 boost::is_base_of<TfWeakPtrFacadeBase, Ptr<T> >
384 static T* GetRawPtr(
const Ptr<T>& t) {
385 return get_pointer(t);
388 static Ptr<T> ConstructFromRawPtr(T* ptr) {
392 static bool IsNull(
const Ptr<T>& t) {
396 static void Class_Object_MUST_Be_Passed_By_Address() { }
397 static void Class_Object_MUST_Not_Be_Const() { }
400 template <
template <
class>
class Ptr,
class T>
402 typename boost::enable_if<
403 boost::is_base_of<TfWeakPtrFacadeBase, Ptr<const T> >
406 static const T* GetRawPtr(
const Ptr<const T>& t) {
407 return get_pointer(t);
410 static Ptr<const T> ConstructFromRawPtr(
const T* ptr) {
411 return Ptr<const T>(ptr);
414 static bool IsNull(
const Ptr<const T>& t) {
418 static void Class_Object_MUST_Be_Passed_By_Address() { }
422 template <
class HashState,
template <
class>
class X,
class T>
424 TfHashAppend(HashState &h, TfWeakPtrFacade<X, T>
const &ptr)
426 return h.Append(ptr.GetUniqueIdentifier());
430 template <
template <
class>
class X,
class T>
432 hash_value(TfWeakPtrFacade<X, T>
const &ptr)
437 auto uniqueId = ptr.GetUniqueIdentifier();
438 return boost::hash<decltype(uniqueId)>()(uniqueId);
441 PXR_NAMESPACE_CLOSE_SCOPE
443 #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.
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.
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.