diff options
| author | Yuqian Yang <crupest@crupest.life> | 2025-11-16 12:14:47 +0800 |
|---|---|---|
| committer | Yuqian Yang <crupest@crupest.life> | 2025-11-16 12:14:47 +0800 |
| commit | faf73c4af74bdae1abf394a33b573149b98ec2b1 (patch) | |
| tree | aa985593c35a256e7190eddf47e023962a717ade /include/cru/ui/DeleteLater.h | |
| parent | 4e0b7d82cd64ef8016dcb49247a8a5e4de8a0b3d (diff) | |
| download | cru-faf73c4af74bdae1abf394a33b573149b98ec2b1.tar.gz cru-faf73c4af74bdae1abf394a33b573149b98ec2b1.tar.bz2 cru-faf73c4af74bdae1abf394a33b573149b98ec2b1.zip | |
Clean DeleteLater.
Diffstat (limited to 'include/cru/ui/DeleteLater.h')
| -rw-r--r-- | include/cru/ui/DeleteLater.h | 61 |
1 files changed, 19 insertions, 42 deletions
diff --git a/include/cru/ui/DeleteLater.h b/include/cru/ui/DeleteLater.h index 0f04c73a..d04d1814 100644 --- a/include/cru/ui/DeleteLater.h +++ b/include/cru/ui/DeleteLater.h @@ -1,65 +1,42 @@ #pragma once #include "Base.h" +#include <cru/base/Guard.h> #include <memory> #include <utility> namespace cru::ui { class CRU_UI_API DeleteLaterImpl { public: + DeleteLaterImpl(); virtual ~DeleteLaterImpl(); void DeleteLater(); protected: virtual void OnPrepareDelete(); + + private: + bool delete_later_scheduled_; }; +namespace details { template <typename T> -class DeleteLaterPtr { - public: - DeleteLaterPtr() = default; - - 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; } +struct DeleteLaterPtrDeleter { + void operator()(T* p) const noexcept { p->DeleteLater(); } +}; +} // namespace details - T* get() const { return ptr_; } +template <typename T> +using DeleteLaterPtr = std::unique_ptr<T, details::DeleteLaterPtrDeleter<T>>; - private: - T* ptr_ = nullptr; -}; +template <typename T> +DeleteLaterPtr<T> ToDeleteLaterPtr(std::unique_ptr<T>&& p) { + return DeleteLaterPtr<T>(p.release()); +} template <typename T, typename... Args> -DeleteLaterPtr<T> MakeDeleteLaterPtr(Args&&... args) { - return DeleteLaterPtr<T>(new T(std::forward<Args>(args)...)); +DeleteLaterPtr<T> MakeDeleteLater(Args&&... args) { + return DeleteLaterPtr<T>(std::forward<Args>(args)...); } + } // namespace cru::ui |
