15template<
typename U,
typename =
void>
19struct IsNodeType<U,
std::void_t<decltype(std::declval<U>().IsDestroyed())>> : std::true_type {};
43 Set(src.mPointer, src.mRefCount);
48 mPointer = src.mPointer;
49 mRefCount = src.mRefCount;
51 src.mPointer =
nullptr;
52 src.mRefCount =
nullptr;
67 Set(src.mPointer, src.mRefCount);
75 mPointer = src.mPointer;
76 mRefCount = src.mRefCount;
78 src.mPointer =
nullptr;
79 src.mRefCount =
nullptr;
92 return Get() == other.
Get();
102 return Get() == other;
120 operator bool()
const
127 if (mPointer != pointer)
131 OCT_ASSERT((mPointer !=
nullptr) == (mRefCount !=
nullptr));
136 mRefCount = refCount;
138 if (mPointer !=
nullptr && mRefCount ==
nullptr)
144 if (mRefCount !=
nullptr)
146 mRefCount->mSharedCount++;
158 bool diffPointer = (mPointer != pointer);
165 mPointer !=
nullptr &&
166 mRefCount !=
nullptr &&
167 mRefCount->mSharedCount == 2)
177 if (mPointer !=
nullptr)
181 mRefCount->mSharedCount--;
183 if (mRefCount->mSharedCount <= 0)
189 mRefCount->mWeakCount++;
191 if (mRefCount->mDeleter)
193 mRefCount->mDeleter(mPointer);
198 mRefCount->mWeakCount--;
201 if (mRefCount->mSharedCount <= 0 &&
202 mRefCount->mWeakCount <= 0)
223 if (node !=
nullptr &&
224 mRefCount !=
nullptr &&
225 mRefCount->mSharedCount == 2)
238 mRefCount->mDeleter = deleteFunc;
264 return mRefCount ? mRefCount->mSharedCount : 0;
274 return mRefCount ? mRefCount->mWeakCount : 0;
286 OCT_ASSERT(!mPointer || mPointer->Is(S::ClassRuntimeId()));
287 return static_cast<S*
>(
Get());
296 return (mPointer !=
nullptr && mRefCount !=
nullptr && !mPointer->IsDestroyed());
300 return (mPointer !=
nullptr && mRefCount !=
nullptr);
306 T* mPointer =
nullptr;
323 Set(src.mPointer, src.mRefCount);
339 mPointer = src.mPointer;
340 mRefCount = src.mRefCount;
342 src.mPointer =
nullptr;
343 src.mRefCount =
nullptr;
355 Set(src.mPointer, src.mRefCount);
381 mPointer = src.mPointer;
382 mRefCount = src.mRefCount;
384 src.mPointer =
nullptr;
385 src.mRefCount =
nullptr;
392 return Get() == other.
Get();
402 return Get() == other.
Get();
412 return Get() == other;
430 operator bool()
const
438 OCT_ASSERT((pointer !=
nullptr) == (refCount !=
nullptr));
445 if (mPointer != pointer)
449 OCT_ASSERT((mPointer !=
nullptr) == (mRefCount !=
nullptr));
454 mRefCount = refCount;
456 if (mRefCount !=
nullptr)
458 mRefCount->mWeakCount++;
470 if (mPointer !=
nullptr)
474 mRefCount->mWeakCount--;
476 if (mRefCount->mSharedCount <= 0 &&
477 mRefCount->mWeakCount <= 0)
498 ret.
Set(mPointer, mRefCount);
508 return (mPointer !=
nullptr && mRefCount !=
nullptr && mRefCount->mSharedCount > 0 && !mPointer->IsDestroyed());
512 return (mPointer !=
nullptr && mRefCount !=
nullptr && mRefCount->mSharedCount > 0);
523 return IsValid() ? mPointer :
nullptr;
528 return IsValid() ? mPointer :
nullptr;
538 return mRefCount ? mRefCount->mSharedCount : 0;
548 return mRefCount ? mRefCount->mWeakCount : 0;
565 OCT_ASSERT(!mPointer || mPointer->Is(S::ClassRuntimeId()));
566 return static_cast<S*
>(
Get());
571 T* mPointer =
nullptr;
581 ret.
Set(newPtr,
nullptr);
585template<
typename T,
typename U>
588 T* pointer =
static_cast<T*
>(src.
Get());
594template<
typename T,
typename U>
597 return PtrStaticCast<T>(src.
Lock());
600template<
typename T,
typename U>
603 U* srcPointer = src.
Get();
604 T* dstPointer =
nullptr;
608 dstPointer = srcPointer->template As<T>();
621template<
typename T,
typename U>
624 return PtrDynamicCast<T>(src.
Lock());
#define OCT_ASSERT(expr)
Definition Assertion.h:12
Export macros for Polyphase Engine symbols.
#define POLYPHASE_API
Definition PolyphaseAPI.h:31
POLYPHASE_API void MakeNodeUserdataStrong(Node *node)
Definition SmartPointer.cpp:7
SharedPtr< T > MakeShared()
Definition SmartPointer.h:577
SharedPtr< Node > NodePtr
Definition SmartPointer.h:627
SharedPtr< T > PtrDynamicCast(const SharedPtr< U > &src)
Definition SmartPointer.h:601
POLYPHASE_API void MakeNodeUserdataWeak(Node *node)
Definition SmartPointer.cpp:52
SharedPtr< T > PtrStaticCast(const SharedPtr< U > &src)
Definition SmartPointer.h:586
WeakPtr< Node > NodePtrWeak
Definition SmartPointer.h:628
Definition SmartPointer.h:33
SharedPtr< T > & operator=(std::nullptr_t)
Definition SmartPointer.h:84
int32_t GetSharedCount() const
Definition SmartPointer.h:267
int32_t GetWeakCount() const
Definition SmartPointer.h:272
void ClearCommon()
Definition SmartPointer.h:175
void SetDeleter(typename RefCount< T >::DeleterFP deleteFunc)
Definition SmartPointer.h:234
SharedPtr(const SharedPtr< T > &src)
Definition SmartPointer.h:41
SharedPtr< T > & operator=(const SharedPtr< T > &src)
Definition SmartPointer.h:65
bool IsValid() const
Definition SmartPointer.h:292
SharedPtr< T > & operator=(SharedPtr< T > &&src)
Definition SmartPointer.h:71
SharedPtr(SharedPtr< T > &&src)
Definition SmartPointer.h:46
SharedPtr(std::nullptr_t)
Definition SmartPointer.h:55
int32_t GetUseCount() const
Definition SmartPointer.h:262
SharedPtr()
Definition SmartPointer.h:36
T *& GetRef()
Definition SmartPointer.h:252
void Set(T *pointer, RefCount< T > *refCount)
Definition SmartPointer.h:156
bool operator==(const SharedPtr &other) const
Definition SmartPointer.h:90
T * Get() const
Definition SmartPointer.h:247
T & operator*() const
Definition SmartPointer.h:115
void Clear()
Definition SmartPointer.h:217
RefCount< T > * GetRefCount() const
Definition SmartPointer.h:257
bool operator==(const T *other) const
Definition SmartPointer.h:100
const T * GetPointerRaw() const
Definition SmartPointer.h:277
bool operator!=(const T *other) const
Definition SmartPointer.h:105
void SetCommon(T *pointer, RefCount< T > *refCount)
Definition SmartPointer.h:125
~SharedPtr()
Definition SmartPointer.h:60
bool operator!=(const SharedPtr &other) const
Definition SmartPointer.h:95
T * operator->() const
Definition SmartPointer.h:110
S * Get() const
Definition SmartPointer.h:284
void Reset()
Definition SmartPointer.h:242
Definition SmartPointer.h:312
T * operator->() const
Definition SmartPointer.h:420
bool operator==(const SharedPtr< T > &other) const
Definition SmartPointer.h:390
void Reset()
Definition SmartPointer.h:516
RefCount< T > * GetRefCount() const
Definition SmartPointer.h:531
SharedPtr< T > Lock() const
Definition SmartPointer.h:492
T & operator*() const
Definition SmartPointer.h:425
bool operator!=(const WeakPtr< T > &other) const
Definition SmartPointer.h:405
~WeakPtr()
Definition SmartPointer.h:346
const T * GetPointerRaw() const
Definition SmartPointer.h:551
T *& GetRef()
Definition SmartPointer.h:526
WeakPtr(WeakPtr< T > &&src)
Definition SmartPointer.h:337
WeakPtr(const WeakPtr< T > &src)
Definition SmartPointer.h:319
int32_t GetWeakCount() const
Definition SmartPointer.h:546
WeakPtr< T > & operator=(WeakPtr< T > &&src)
Definition SmartPointer.h:377
WeakPtr()
Definition SmartPointer.h:314
WeakPtr(std::nullptr_t)
Definition SmartPointer.h:332
S * Get() const
Definition SmartPointer.h:558
T * Get() const
Definition SmartPointer.h:521
int32_t GetSharedCount() const
Definition SmartPointer.h:541
WeakPtr< T > & operator=(const WeakPtr< T > &src)
Definition SmartPointer.h:351
bool operator!=(const T *other) const
Definition SmartPointer.h:415
bool operator==(const WeakPtr< T > &other) const
Definition SmartPointer.h:400
WeakPtr< T > & operator=(std::nullptr_t)
Definition SmartPointer.h:371
WeakPtr(const SharedPtr< T > &src)
Definition SmartPointer.h:327
bool operator==(const T *other) const
Definition SmartPointer.h:410
bool operator!=(const SharedPtr< T > &other) const
Definition SmartPointer.h:395
int32_t GetUseCount() const
Definition SmartPointer.h:536
WeakPtr< T > & operator=(const SharedPtr< T > &src)
Definition SmartPointer.h:365
bool IsValid() const
Definition SmartPointer.h:504
void Clear()
Definition SmartPointer.h:468
void Set(T *pointer, RefCount< T > *refCount)
Definition SmartPointer.h:435
Definition SmartPointer.h:631
Definition SmartPointer.h:16
Definition SmartPointer.h:23
void(* DeleterFP)(T *)
Definition SmartPointer.h:24
int32_t mWeakCount
Definition SmartPointer.h:27
DeleterFP mDeleter
Definition SmartPointer.h:28
int32_t mSharedCount
Definition SmartPointer.h:26