13 #include <utility/dllexport.h>
14 #include <readerwriterqueue.h>
41 virtual ~
Data() =
default;
56 virtual void* getData() = 0;
58 virtual void setData(
void* data) = 0;
64 virtual void enqueueForDeletion() = 0;
90 void enqueue(std::unique_ptr<SafeOwnerBase::Data> ownerData)
92 mQueue.enqueue(std::move(ownerData));
102 moodycamel::ReaderWriterQueue<std::unique_ptr<SafeOwnerBase::Data>> mQueue;
114 class SafeOwner final :
public SafeOwnerBase
129 mObject = std::unique_ptr<T>(ptr);
130 mSharedSafePtr = std::make_shared<Data*>(
this);
135 *mSharedSafePtr =
nullptr;
139 std::unique_ptr<T> mObject =
nullptr;
140 std::shared_ptr<Data*> mSharedSafePtr =
nullptr;
141 std::atomic<bool> mEnqueuedForDeletion = {
false };
152 mDeletionQueue = &deletionQueue;
153 mData = std::make_unique<Data>(ptr);
161 enqueueForDeletion();
170 enqueueForDeletion();
189 template<
typename OTHER>
193 template<
typename OTHER>
202 assert(mData !=
nullptr);
203 return *
static_cast<T*
>(mData->mObject.get());
208 assert(mData !=
nullptr);
209 return *
static_cast<T*
>(mData->mObject.get());
214 assert(mData !=
nullptr);
215 return static_cast<T*
>(mData->mObject.get());
220 assert(mData !=
nullptr);
221 return static_cast<T*
>(mData->mObject.get());
224 template<
typename OTHER>
228 return ptr ? mData->mObject.get() == ptr : mData ==
nullptr;
231 template<
typename OTHER>
234 return ptr ? mData->mObject.get() != ptr : mData !=
nullptr;
239 return mData ==
nullptr;
244 return mData !=
nullptr;
253 return std::move(safePtr);
262 return std::move(safePtr);
268 T*
getRaw() {
return mData->mObject.get(); }
273 T*
getRaw()
const {
return mData->mObject.get(); }
277 void*
getData()
override {
return mData.release(); }
279 void setData(
void* data)
override { mData = std::unique_ptr<Data>(
static_cast<Data*
>(data)); }
289 void enqueueForDeletion()
override
291 if (mData !=
nullptr) {
292 assert(mDeletionQueue !=
nullptr);
293 mData->mEnqueuedForDeletion =
true;
294 mDeletionQueue->
enqueue(std::move(mData));
295 mDeletionQueue =
nullptr;
300 std::unique_ptr<Data> mData =
nullptr;
316 setOwnerData(other.getOwnerData());
321 virtual void* getOwnerData()
const = 0;
323 virtual void setOwnerData(
void* ownerData) = 0;
331 class SafePtr final :
public SafePtrBase
345 mOwnerData = owner.mData->mSharedSafePtr;
369 template<
typename OTHER>
376 template<
typename OTHER>
390 mOwnerData =
nullptr;
408 template<
typename OTHER>
415 template<
typename OTHER>
425 return *
static_cast<T*
>((*mOwnerData)->mObject.get());
431 return *
static_cast<T*
>((*mOwnerData)->mObject.get());
437 return static_cast<T*
>((*mOwnerData)->mObject.get());
443 return static_cast<T*
>((*mOwnerData)->mObject.get());
446 template<
typename OTHER>
449 return ptr ? isValid() && (*mOwnerData)->mObject.get() == ptr : !isValid();
452 template<
typename OTHER>
455 return ptr ? isValid() && (*mOwnerData)->mObject.get() != ptr : !isValid();
460 return !isValid() || (*mOwnerData)->mEnqueuedForDeletion ==
true;
465 return isValid() && (*mOwnerData)->mEnqueuedForDeletion ==
false;
471 return static_cast<T*
>((*mOwnerData)->mObject.get());
477 return static_cast<T*
>((*mOwnerData)->mObject.get());
481 void* getOwnerData()
const override
482 {
return *mOwnerData; }
484 void setOwnerData(
void* ownerData)
override
486 if (ownerData ==
nullptr)
487 mOwnerData =
nullptr;
490 mOwnerData =
static_cast<typename SafeOwner<T>::Data*
>(ownerData)->mSharedSafePtr;
495 return (mOwnerData !=
nullptr) && (*mOwnerData !=
nullptr);
498 std::shared_ptr<typename SafeOwner<T>::Data*> mOwnerData =
nullptr;
T * getRaw() const
Definition: safeptr.h:273
void setData(void *data) override
Definition: safeptr.h:279
SafePtr< T > & operator=(SafePtr< OTHER > &&other)
Definition: safeptr.h:416
SafePtr< T > get()
Definition: safeptr.h:250
Definition: safeptr.h:308
SafeOwner & operator=(const std::nullptr_t)
Definition: safeptr.h:168
SafePtr(SafePtr< OTHER > &&other)
Definition: safeptr.h:409
SafePtr(SafePtr< T > &&other)
Definition: safeptr.h:395
bool operator!=(const std::nullptr_t) const
Definition: safeptr.h:463
SafePtr & operator=(const SafePtr< T > &other)
Definition: safeptr.h:362
bool operator==(const std::nullptr_t) const
Definition: safeptr.h:458
SafePtr(const SafePtr< T > &other)
Definition: safeptr.h:356
~SafeOwner()
Definition: safeptr.h:159
SafePtr(const std::nullptr_t)
Definition: safeptr.h:384
SafePtr & operator=(const SafePtr< OTHER > &other)
Definition: safeptr.h:377
void assign(const SafePtrBase &other)
Definition: safeptr.h:314
T * get() const
Definition: safeptr.h:468
void enqueue(std::unique_ptr< SafeOwnerBase::Data > ownerData)
Definition: safeptr.h:90
T & operator*()
Definition: safeptr.h:428
T * getRaw()
Definition: safeptr.h:268
bool operator==(const OTHER *ptr) const
Definition: safeptr.h:447
const T & operator*() const
Definition: safeptr.h:200
SafePtr & operator=(const std::nullptr_t)
Definition: safeptr.h:388
SafeOwner< T > & operator=(SafeOwner< T > &&other)
Definition: safeptr.h:182
SafeOwner(const std::nullptr_t)
Definition: safeptr.h:165
bool operator==(const OTHER *ptr) const
Definition: safeptr.h:225
void setDeletionQueue(DeletionQueue *queue) override
Definition: safeptr.h:283
SafeOwner(SafeOwner< T > &&other)
Definition: safeptr.h:179
bool operator!=(const std::nullptr_t) const
Definition: safeptr.h:242
T * operator->() const
Definition: safeptr.h:434
SafeOwner(SafeOwner< OTHER > &&other)
Definition: safeptr.h:190
SafePtr(SafeOwner< T > &owner)
Definition: safeptr.h:343
bool operator==(const std::nullptr_t) const
Definition: safeptr.h:237
T * operator->()
Definition: safeptr.h:218
friend class SafePtr< T >
Definition: safeptr.h:118
SafeOwner(DeletionQueue &deletionQueue, T *ptr)
Definition: safeptr.h:150
T & operator*()
Definition: safeptr.h:206
Definition: templateapp.h:17
bool operator!=(const OTHER *ptr) const
Definition: safeptr.h:453
T * operator->()
Definition: safeptr.h:440
T * get()
Definition: safeptr.h:474
const T & operator*() const
Definition: safeptr.h:422
bool operator!=(const OTHER *ptr) const
Definition: safeptr.h:232
friend class DeletionQueue
Definition: safeptr.h:116
DeletionQueue * getDeletionQueue() override
Definition: safeptr.h:281
SafeOwner< T > & operator=(SafeOwner< OTHER > &&other)
Definition: safeptr.h:194
SafePtr< T > get() const
Definition: safeptr.h:259
T * operator->() const
Definition: safeptr.h:212
SafePtr(const SafePtr< OTHER > &other)
Definition: safeptr.h:370
SafePtr< T > & operator=(SafePtr< T > &&other)
Definition: safeptr.h:401
~SafePtr()
Definition: safeptr.h:351
void * getData() override
Definition: safeptr.h:277