aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/DeleteLater.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/ui/DeleteLater.h')
-rw-r--r--include/cru/ui/DeleteLater.h61
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