diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/cru/base/Event.h | 12 | ||||
| -rw-r--r-- | include/cru/ui/DeleteLater.h | 61 | ||||
| -rw-r--r-- | include/cru/ui/events/RoutedEvent.h | 15 |
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: |
