diff options
Diffstat (limited to 'include/cru')
-rw-r--r-- | include/cru/ui/DeleteLater.h | 47 |
1 files changed, 41 insertions, 6 deletions
diff --git a/include/cru/ui/DeleteLater.h b/include/cru/ui/DeleteLater.h index 5c098b4a..0f04c73a 100644 --- a/include/cru/ui/DeleteLater.h +++ b/include/cru/ui/DeleteLater.h @@ -1,5 +1,4 @@ #pragma once - #include "Base.h" #include <memory> @@ -16,12 +15,48 @@ class CRU_UI_API DeleteLaterImpl { }; template <typename T> -struct DeleteLaterDeleter { - void operator()(T* p) const { p->DeleteLater(); } -}; +class DeleteLaterPtr { + public: + DeleteLaterPtr() = default; -template <typename T> -using DeleteLaterPtr = std::unique_ptr<T, DeleteLaterDeleter<T>>; + DeleteLaterPtr(const DeleteLaterPtr& other) = delete; + DeleteLaterPtr& operator=(const DeleteLaterPtr& other) = delete; + + DeleteLaterPtr(DeleteLaterPtr&& other) noexcept : ptr_(other.ptr_) { + other.ptr_ = nullptr; + } + + DeleteLaterPtr& operator=(DeleteLaterPtr&& other) noexcept { + if (this != &other) { + if (ptr_ != nullptr) { + ptr_->DeleteLater(); + } + + ptr_ = other.ptr_; + other.ptr_ = nullptr; + } + return *this; + } + + ~DeleteLaterPtr() { + if (ptr_ != nullptr) { + ptr_->DeleteLater(); + } + } + + explicit DeleteLaterPtr(T* ptr) : ptr_(ptr) {} + DeleteLaterPtr(std::unique_ptr<T>&& ptr) : ptr_(ptr.release()) {} + + T& operator*() const { return *ptr_; } + T* operator->() const { return ptr_; } + + explicit operator bool() const { return ptr_ != nullptr; } + + T* get() const { return ptr_; } + + private: + T* ptr_ = nullptr; +}; template <typename T, typename... Args> DeleteLaterPtr<T> MakeDeleteLaterPtr(Args&&... args) { |