aboutsummaryrefslogtreecommitdiff
path: root/include/cru
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-05-07 21:49:28 +0800
committercrupest <crupest@outlook.com>2022-05-07 21:49:28 +0800
commit2690e9b2ff14a1019ff464e92717a2ca9cbdc056 (patch)
treeac1d28b716adcf52b6eb464970d1923ad74049d6 /include/cru
parentee5aa17e44cb36b386e89032cab96caf87b5b524 (diff)
downloadcru-2690e9b2ff14a1019ff464e92717a2ca9cbdc056.tar.gz
cru-2690e9b2ff14a1019ff464e92717a2ca9cbdc056.tar.bz2
cru-2690e9b2ff14a1019ff464e92717a2ca9cbdc056.zip
...
Diffstat (limited to 'include/cru')
-rw-r--r--include/cru/ui/DeleteLater.h47
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) {