diff options
author | crupest <crupest@outlook.com> | 2022-05-07 21:49:28 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-05-07 21:49:28 +0800 |
commit | 2690e9b2ff14a1019ff464e92717a2ca9cbdc056 (patch) | |
tree | ac1d28b716adcf52b6eb464970d1923ad74049d6 /include/cru/ui/DeleteLater.h | |
parent | ee5aa17e44cb36b386e89032cab96caf87b5b524 (diff) | |
download | cru-2690e9b2ff14a1019ff464e92717a2ca9cbdc056.tar.gz cru-2690e9b2ff14a1019ff464e92717a2ca9cbdc056.tar.bz2 cru-2690e9b2ff14a1019ff464e92717a2ca9cbdc056.zip |
...
Diffstat (limited to 'include/cru/ui/DeleteLater.h')
-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) { |