From faf73c4af74bdae1abf394a33b573149b98ec2b1 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Sun, 16 Nov 2025 12:14:47 +0800 Subject: Clean DeleteLater. --- include/cru/base/Event.h | 12 ++++++-- include/cru/ui/DeleteLater.h | 61 ++++++++++++------------------------- include/cru/ui/events/RoutedEvent.h | 15 ++------- 3 files changed, 30 insertions(+), 58 deletions(-) (limited to 'include/cru') diff --git a/include/cru/base/Event.h b/include/cru/base/Event.h index 1f57e100..226c2ea4 100644 --- a/include/cru/base/Event.h +++ b/include/cru/base/Event.h @@ -16,7 +16,11 @@ class EventHandlerRevoker; class EventBase : public Object, public SelfResolvable { friend EventHandlerRevoker; + public: + CRU_DELETE_COPY(EventBase) + protected: + EventBase() = default; using EventHandlerToken = int; /** @@ -33,7 +37,7 @@ class EventHandlerRevoker { private: EventHandlerRevoker(ObjectResolver&& resolver, - EventBase::EventHandlerToken token) + EventBase::EventHandlerToken token) : resolver_(std::move(resolver)), token_(token) {} public: @@ -163,13 +167,15 @@ class EventHandlerRevokerGuard { } private: - std::unique_ptr revoker_; + std::unique_ptr + revoker_; }; class EventHandlerRevokerListGuard { public: void Add(EventHandlerRevoker&& revoker) { - event_revoker_guard_list_.push_back(EventHandlerRevokerGuard(std::move(revoker))); + event_revoker_guard_list_.push_back( + EventHandlerRevokerGuard(std::move(revoker))); } EventHandlerRevokerListGuard& operator+=(EventHandlerRevoker&& revoker) { 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 #include #include 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 -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&& 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 +using DeleteLaterPtr = std::unique_ptr>; - private: - T* ptr_ = nullptr; -}; +template +DeleteLaterPtr ToDeleteLaterPtr(std::unique_ptr&& p) { + return DeleteLaterPtr(p.release()); +} template -DeleteLaterPtr MakeDeleteLaterPtr(Args&&... args) { - return DeleteLaterPtr(new T(std::forward(args)...)); +DeleteLaterPtr MakeDeleteLater(Args&&... args) { + return DeleteLaterPtr(std::forward(args)...); } + } // namespace cru::ui diff --git a/include/cru/ui/events/RoutedEvent.h b/include/cru/ui/events/RoutedEvent.h index 9a07e1e9..aa3331a6 100644 --- a/include/cru/ui/events/RoutedEvent.h +++ b/include/cru/ui/events/RoutedEvent.h @@ -1,7 +1,7 @@ #pragma once #include "UiEventArgs.h" -#include "cru/base/Event.h" +#include namespace cru::ui::events { // TEventArgs must not be a reference type. This class help add reference. @@ -14,21 +14,10 @@ class CRU_UI_API RoutedEvent { static_assert(!std::is_reference_v, "TEventArgs must not be reference."); - using RawEventArgs = TEventArgs; - using IEventType = IEvent; - using EventArgs = typename IEventType::Args; - - RoutedEvent() = default; - RoutedEvent(const RoutedEvent& other) = delete; - RoutedEvent(RoutedEvent&& other) = delete; - RoutedEvent& operator=(const RoutedEvent& other) = delete; - RoutedEvent& operator=(RoutedEvent&& other) = delete; - ~RoutedEvent() = default; + using EventArgs = TEventArgs&; IEvent* Direct() { return &direct_; } - IEvent* Bubble() { return &bubble_; } - IEvent* Tunnel() { return &tunnel_; } private: -- cgit v1.2.3