aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-16 12:14:47 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-16 12:14:47 +0800
commitfaf73c4af74bdae1abf394a33b573149b98ec2b1 (patch)
treeaa985593c35a256e7190eddf47e023962a717ade /include
parent4e0b7d82cd64ef8016dcb49247a8a5e4de8a0b3d (diff)
downloadcru-faf73c4af74bdae1abf394a33b573149b98ec2b1.tar.gz
cru-faf73c4af74bdae1abf394a33b573149b98ec2b1.tar.bz2
cru-faf73c4af74bdae1abf394a33b573149b98ec2b1.zip
Clean DeleteLater.
Diffstat (limited to 'include')
-rw-r--r--include/cru/base/Event.h12
-rw-r--r--include/cru/ui/DeleteLater.h61
-rw-r--r--include/cru/ui/events/RoutedEvent.h15
3 files changed, 30 insertions, 58 deletions
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<EventBase> {
friend EventHandlerRevoker;
+ public:
+ CRU_DELETE_COPY(EventBase)
+
protected:
+ EventBase() = default;
using EventHandlerToken = int;
/**
@@ -33,7 +37,7 @@ class EventHandlerRevoker {
private:
EventHandlerRevoker(ObjectResolver<EventBase>&& resolver,
- EventBase::EventHandlerToken token)
+ EventBase::EventHandlerToken token)
: resolver_(std::move(resolver)), token_(token) {}
public:
@@ -163,13 +167,15 @@ class EventHandlerRevokerGuard {
}
private:
- std::unique_ptr<EventHandlerRevoker, details::EventHandlerRevokerDestroyer> revoker_;
+ std::unique_ptr<EventHandlerRevoker, details::EventHandlerRevokerDestroyer>
+ 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 <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
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 <cru/base/Event.h>
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>,
"TEventArgs must not be reference.");
- using RawEventArgs = TEventArgs;
- using IEventType = IEvent<TEventArgs&>;
- 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<TEventArgs&>* Direct() { return &direct_; }
-
IEvent<TEventArgs&>* Bubble() { return &bubble_; }
-
IEvent<TEventArgs&>* Tunnel() { return &tunnel_; }
private: