diff options
Diffstat (limited to 'include/cru')
| -rw-r--r-- | include/cru/base/Event.h | 19 | ||||
| -rw-r--r-- | include/cru/base/SelfResolvable.h | 153 | ||||
| -rw-r--r-- | include/cru/ui/components/Component.h | 5 | ||||
| -rw-r--r-- | include/cru/ui/controls/Control.h | 5 | ||||
| -rw-r--r-- | include/cru/ui/host/WindowHost.h | 2 |
5 files changed, 9 insertions, 175 deletions
diff --git a/include/cru/base/Event.h b/include/cru/base/Event.h index 226c2ea4..276c313f 100644 --- a/include/cru/base/Event.h +++ b/include/cru/base/Event.h @@ -1,8 +1,6 @@ #pragma once #include "Base.h" -#include "SelfResolvable.h" - #include <algorithm> #include <cassert> #include <functional> @@ -13,7 +11,7 @@ namespace cru { class EventHandlerRevoker; -class EventBase : public Object, public SelfResolvable<EventBase> { +class EventBase : public Object { friend EventHandlerRevoker; public: @@ -36,28 +34,23 @@ class EventHandlerRevoker { friend EventBase; private: - EventHandlerRevoker(ObjectResolver<EventBase>&& resolver, - EventBase::EventHandlerToken token) - : resolver_(std::move(resolver)), token_(token) {} + EventHandlerRevoker(EventBase* event, EventBase::EventHandlerToken token) + : event_(event), token_(token) {} public: /** * Revoke the registered handler. If the event has already been destroyed or * the handler is already revoked, nothing will be done. */ - void operator()() const { - if (const auto event = resolver_.Resolve()) { - event->RemoveHandler(token_); - } - } + void operator()() const { event_->RemoveHandler(token_); } private: - ObjectResolver<EventBase> resolver_; + EventBase* event_; EventBase::EventHandlerToken token_; }; inline EventHandlerRevoker EventBase::CreateRevoker(EventHandlerToken token) { - return EventHandlerRevoker(CreateResolver(), token); + return EventHandlerRevoker(this, token); } struct IBaseEvent : public virtual Interface { diff --git a/include/cru/base/SelfResolvable.h b/include/cru/base/SelfResolvable.h deleted file mode 100644 index 84fa54f6..00000000 --- a/include/cru/base/SelfResolvable.h +++ /dev/null @@ -1,153 +0,0 @@ -#pragma once - -#include <cassert> -#include <functional> -#include <memory> -#include <type_traits> - -namespace cru { -template <typename T> -class SelfResolvable; - -template <typename T> -class ObjectResolver { - friend SelfResolvable<T>; - template <typename U> - friend class ObjectResolver; - - private: - template <typename U> - using Accessor_ = std::function<U*(const std::shared_ptr<void*>&)>; - using ThisAccessor_ = Accessor_<T>; - - explicit ObjectResolver(T* o) - : shared_object_ptr_(new void*(o)), - accessor_([](const std::shared_ptr<void*>& ptr) { - return static_cast<T*>(*ptr); - }) {} - explicit ObjectResolver(std::shared_ptr<void*> ptr, ThisAccessor_ accessor) - : shared_object_ptr_(std::move(ptr)), accessor_(std::move(accessor)) {} - - template <typename U> - static ThisAccessor_ CreateAccessor(Accessor_<U> parent_accessor) { - return [parent_accessor = - std::move(parent_accessor)](const std::shared_ptr<void*>& ptr) { - return static_cast<T*>(parent_accessor(ptr)); - }; - } - - public: - template <typename U, - typename = std::enable_if_t<std::is_convertible_v<U*, T*>>> - ObjectResolver(const ObjectResolver<U>& other) - : shared_object_ptr_(other.shared_object_ptr_), - accessor_(CreateAccessor(other.accessor_)) {} - - template <typename U, - typename = std::enable_if_t<std::is_convertible_v<U*, T*>>> - ObjectResolver(ObjectResolver<U>&& other) - : shared_object_ptr_(std::move(other.shared_object_ptr_)), - accessor_(CreateAccessor(std::move(other.accessor_))) {} - - ObjectResolver(const ObjectResolver&) = default; - ObjectResolver& operator=(const ObjectResolver&) = default; - ObjectResolver(ObjectResolver&&) = default; - ObjectResolver& operator=(ObjectResolver&&) = default; - ~ObjectResolver() = default; - - template <typename U, - typename = std::enable_if_t<std::is_convertible_v<U*, T*>>> - ObjectResolver& operator=(const ObjectResolver<U>& other) { - if (this != &other) { - this->shared_object_ptr_ = other.shared_object_ptr_; - this->accessor_ = CreateAccessor(other.accessor_); - } - return *this; - } - - template <typename U, - typename = std::enable_if_t<std::is_convertible_v<U*, T*>>> - ObjectResolver& operator=(ObjectResolver<U>&& other) { - if (this != &other) { - this->shared_object_ptr_ = std::move(other.shared_object_ptr_); - this->accessor_ = CreateAccessor(std::move(other.shared_object_ptr_)); - } - return *this; - } - - bool IsValid() const { return this->shared_object_ptr_ != nullptr; } - - T* Resolve() const { - assert(IsValid()); - return this->accessor_(this->shared_object_ptr_); - } - - /** - * @remarks So this class can be used as a functor. - */ - T* operator()() const { return Resolve(); } - - template <typename U, - typename = std::enable_if_t<std::is_convertible_v<T*, U*>>> - operator ObjectResolver<U>() const { - return ObjectResolver<U>(*this); - } - - private: - void SetResolvedObject(T* o) { - assert(IsValid()); - *this->shared_object_ptr_ = o; - } - - private: - std::shared_ptr<void*> shared_object_ptr_; - std::function<T*(const std::shared_ptr<void*>&)> accessor_; -}; - -/** - * @remarks - * This class is not copyable and movable since subclass is polymorphic and - * copying is then nonsense. However, you can even delete move capability in - * subclass because it may also be nonsense for subclass. The move capability is - * optional. - * - * Whether this class needs to be thread-safe still has to be considered. - */ -template <typename T> -class SelfResolvable { - public: - SelfResolvable() : resolver_(CastToSubClass()) {} - SelfResolvable(const SelfResolvable&) = delete; - SelfResolvable& operator=(const SelfResolvable&) = delete; - - // Resolvers to old object will resolve to new object. - SelfResolvable(SelfResolvable&& other) - : resolver_(std::move(other.resolver_)) { - this->resolver_.SetResolvedObject(CastToSubClass()); - } - - // Old resolvers for this object will resolve to nullptr. - // Other's resolvers will now resolve to this. - SelfResolvable& operator=(SelfResolvable&& other) { - if (this != &other) { - this->resolver_ = std::move(other.resolver_); - this->resolver_.SetResolvedObject(CastToSubClass()); - } - return *this; - } - - virtual ~SelfResolvable() { - if (this->resolver_.IsValid()) { - this->resolver_.SetResolvedObject(nullptr); - } - } - - ObjectResolver<T> CreateResolver() { return resolver_; } - - private: - T* CastToSubClass() { return static_cast<T*>(this); } - - private: - ObjectResolver<T> resolver_; -}; -} // namespace cru diff --git a/include/cru/ui/components/Component.h b/include/cru/ui/components/Component.h index d44e6728..627e2d3c 100644 --- a/include/cru/ui/components/Component.h +++ b/include/cru/ui/components/Component.h @@ -1,7 +1,6 @@ #pragma once #include "../Base.h" #include "../DeleteLater.h" -#include "cru/base/SelfResolvable.h" namespace cru::ui::components { /** @@ -9,9 +8,7 @@ namespace cru::ui::components { * \remarks Component should respect children's Component::IsDeleteByParent * value and decide whether to delete it. */ -class CRU_UI_API Component : public Object, - public SelfResolvable<Component>, - public DeleteLaterImpl { +class CRU_UI_API Component : public Object, public DeleteLaterImpl { public: Component() = default; ~Component() = default; diff --git a/include/cru/ui/controls/Control.h b/include/cru/ui/controls/Control.h index d70854fe..77f5f392 100644 --- a/include/cru/ui/controls/Control.h +++ b/include/cru/ui/controls/Control.h @@ -4,7 +4,6 @@ #include "../events/UiEvents.h" #include "../render/RenderObject.h" #include "../style/StyleRuleSet.h" -#include "cru/base/SelfResolvable.h" #include "cru/ui/render/MeasureRequirement.h" namespace cru::ui::controls { @@ -18,9 +17,7 @@ namespace cru::ui::controls { * - RemoveChild(Control* child) * The last two methods are totally for convenient control tree management. */ -class CRU_UI_API Control : public Object, - public SelfResolvable<Control>, - public DeleteLaterImpl { +class CRU_UI_API Control : public Object, public DeleteLaterImpl { friend class RootControl; CRU_DEFINE_CLASS_LOG_TAG("Control") diff --git a/include/cru/ui/host/WindowHost.h b/include/cru/ui/host/WindowHost.h index 58fd120d..13b06b07 100644 --- a/include/cru/ui/host/WindowHost.h +++ b/include/cru/ui/host/WindowHost.h @@ -16,7 +16,7 @@ class LayoutPaintCycler; struct AfterLayoutEventArgs {}; // The bridge between control tree and native window. -class CRU_UI_API WindowHost : public Object, public SelfResolvable<WindowHost> { +class CRU_UI_API WindowHost : public Object { friend controls::Control; CRU_DEFINE_CLASS_LOG_TAG("WindowHost") |
