24 #ifndef PXR_BASE_TF_WEAK_PTR_FACADE_H
25 #define PXR_BASE_TF_WEAK_PTR_FACADE_H
35 #include <hboost/functional/hash_fwd.hpp>
36 #include <hboost/mpl/or.hpp>
37 #include <hboost/type_traits/is_base_of.hpp>
38 #include <hboost/type_traits/is_same.hpp>
39 #include <hboost/utility/enable_if.hpp>
45 template <
template <
class>
class PtrTemplate,
class DataType>
55 template <
template <
class>
class PtrTemplate,
class DataType>
58 template <
class Facade>
60 return f._FetchPointer();
63 template <
class Facade>
65 return f._GetUniqueIdentifier();
68 template <
class Facade>
70 return f._EnableExtraNotification();
73 template <
class Facade>
75 return f._IsInvalid();
85 template <
template <
class>
class X,
class Y>
103 template <
template <
class>
class PtrTemplate,
class Type>
116 template <
class Other>
123 template <
class Other>
125 return !(*
this ==
p);
138 return !(*
this ==
p);
151 template <
class Other>
152 bool operator < (PtrTemplate<Other>
const &
p)
const {
158 template <
class Other>
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>
176 return _FetchPointer() ? &TfWeakPtrFacade::_FetchPointer :
nullptr;
180 return !(bool(*
this));
185 return _FetchPointer() == &
obj;
193 return dynamic_cast<T *
>(_FetchPointer());
205 return &_Derived()->__GetTfWeakBase__();
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>
269 template <
template <
class>
class X,
class Y>
275 template <
template <
class>
class X,
class Y>
278 return !(p ==
nullptr);
280 template <
template <
class>
class X,
class Y>
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>
313 template <
template <
class>
class X,
class Y>
319 template <
template <
class>
class X,
class Y>
322 return !(p <
nullptr);
324 template <
template <
class>
class X,
class Y>
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>
352 return ToPtr(const_cast<typename ToPtr::DataType *>
364 template <
template <
class>
class X,
class U>
366 typename hboost::enable_if<
367 hboost::is_convertible<U*, T*>
378 template <
template <
class>
class Ptr,
class T>
380 typename hboost::enable_if<
381 hboost::is_base_of<TfWeakPtrFacadeBase, Ptr<T> >
400 template <
template <
class>
class Ptr,
class T>
402 typename hboost::enable_if<
403 hboost::is_base_of<TfWeakPtrFacadeBase, Ptr<const T> >
411 return Ptr<const T>(
ptr);
422 template <
class HashState,
template <
class>
class X,
class T>
430 template <
template <
class>
class X,
class T>
438 return hboost::hash<decltype(uniqueId)>()(uniqueId);
443 #endif // PXR_BASE_TF_WEAK_PTR_FACADE_H
DataType & operator*() const
static Ptr< T > ConstructFromRawPtr(T *ptr)
void const * GetUniqueIdentifier() const
void EnableExtraNotification() const
bool operator==(PtrTemplate< Other > const &p) const
static void Class_Object_MUST_Be_Passed_By_Address()
bool operator!=(PtrTemplate< Other > const &p) const
bool operator>(PtrTemplate< Other > const &p) const
ToPtr TfStatic_cast(TfWeakPtrFacade< X, Y > const &p)
TF_API const TfNullPtrType TfNullPtr
ARCH_API std::string ArchGetDemangled(const std::string &typeName)
size_t hash_value(TfWeakPtrFacade< X, T > const &ptr)
static Facade::DataType * FetchPointer(Facade const &f)
Y * get_pointer(TfWeakPtrFacade< X, Y > const &p)
DataType *(TfWeakPtrFacade::*)(void) const UnspecifiedBoolType
bool operator>(TfWeakPtrFacade< X, Y > const &p, std::nullptr_t)
TF_API void Tf_PostNullSmartPtrDereferenceFatalError(const TfCallContext &, const char *)
static bool IsNull(const Ptr< const T > &t)
static void Class_Object_MUST_Be_Passed_By_Address()
bool operator!=(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Inequality operator, does exact floating point comparisons.
ToPtr TfSafeDynamic_cast(TfWeakPtrFacade< X, Y > const &p)
void Tf_RefPtrTracker_New(const void *, const void *)
bool PointsTo(T const &obj) const
void TfHashAppend(HashState &h, TfWeakPtrFacade< X, T > const &ptr)
PtrTemplate< DataType > Derived
GLfloat GLfloat GLfloat GLfloat h
ToPtr TfDynamic_cast(TfWeakPtrFacade< X, Y > const &p)
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
static const T * GetRawPtr(const Ptr< const T > &t)
static bool IsNull(const Ptr< T > &t)
static void const * GetUniqueIdentifier(Facade const &f)
bool operator>=(TfWeakPtrFacade< X, Y > const &p, std::nullptr_t)
#define PXR_NAMESPACE_CLOSE_SCOPE
DataType * operator->() const
friend std::type_info const & TfTypeid(Derived const &p)
static bool IsInvalid(Facade const &f)
ToPtr TfConst_cast(TfWeakPtrFacade< X, Y > const &p)
T DataType
Convenience type accessor to underlying type T for template code.
bool operator>=(PtrTemplate< Other > const &p) const
static void EnableExtraNotification(Facade const &f)
static T * GetRawPtr(const Ptr< T > &t)
friend class TfWeakPtrFacadeAccess
TfWeakBase const * GetWeakBase() const
bool operator==(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Equality operator, does exact floating point comparisons.
TfWeakPtrFacadeAccess Access
static Ptr< const T > ConstructFromRawPtr(const T *ptr)
static void Class_Object_MUST_Not_Be_Const()