diff options
author | crupest <crupest@outlook.com> | 2024-01-01 22:20:21 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2024-01-27 01:02:14 +0800 |
commit | 8673907e4e3f2f9ff6e8bd18aaf3ddc6d84c0e64 (patch) | |
tree | daa8acf69dbf57f47deaba816961e377399a6f38 /include/cru/common/Event2.h | |
parent | e96f5b6713814dd59814f17cb9bb437e3a6fca47 (diff) | |
download | cru-8673907e4e3f2f9ff6e8bd18aaf3ddc6d84c0e64.tar.gz cru-8673907e4e3f2f9ff6e8bd18aaf3ddc6d84c0e64.tar.bz2 cru-8673907e4e3f2f9ff6e8bd18aaf3ddc6d84c0e64.zip |
NEED TEST: add support for pointer conversion in ObjectResolver.
Diffstat (limited to 'include/cru/common/Event2.h')
-rw-r--r-- | include/cru/common/Event2.h | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/include/cru/common/Event2.h b/include/cru/common/Event2.h index 5677828a..62fb366d 100644 --- a/include/cru/common/Event2.h +++ b/include/cru/common/Event2.h @@ -10,6 +10,13 @@ #include <vector> namespace cru { +class Event2Base { + public: + virtual ~Event2Base() = default; + + virtual void RevokeHandler(int token_value) = 0; +}; + template <typename TArgument, typename TResult> class EventContext { public: @@ -46,20 +53,19 @@ constexpr bool is_event2_v = false; template <typename TArgument, typename TResult> constexpr bool is_event2_v<Event2<TArgument, TResult>> = true; -template <typename TEvent2> class EventHandlerToken { - static_assert(is_event2_v<TEvent2>, "TEvent2 must be Event2 class."); - public: - EventHandlerToken(ObjectResolver<TEvent2> event_resolver, int token_value) + EventHandlerToken(ObjectResolver<Event2Base> event_resolver, int token_value) : event_resolver_(std::move(event_resolver)), token_value_(token_value) {} - ObjectResolver<TEvent2> GetEventResolver() const { return event_resolver_; } + ObjectResolver<Event2Base> GetEventResolver() const { + return event_resolver_; + } int GetTokenValue() const { return token_value_; } - void RevokeHandler() const; + inline void RevokeHandler() const; private: - ObjectResolver<TEvent2> event_resolver_; + ObjectResolver<Event2Base> event_resolver_; int token_value_; }; @@ -79,9 +85,10 @@ struct Event2BehaviorFlags { template <typename TArgument = std::nullptr_t, typename TResult = std::nullptr_t> -class Event2 : public SelfResolvable<Event2<TArgument, TResult>> { +class Event2 : public Event2Base, + public SelfResolvable<Event2<TArgument, TResult>> { public: - using HandlerToken = EventHandlerToken<Event2>; + using HandlerToken = EventHandlerToken; using Context = EventContext<TArgument, TResult>; using Handler = std::function<void(Context*)>; using SpyOnlyHandler = std::function<void()>; @@ -122,7 +129,7 @@ class Event2 : public SelfResolvable<Event2<TArgument, TResult>> { return HandlerToken(this->CreateResolver(), token); } - void RevokeHandler(int token_value) { + void RevokeHandler(int token_value) override { auto iter = this->handlers_.cbegin(); auto end = this->handlers_.cend(); for (; iter != end; ++iter) { @@ -184,8 +191,7 @@ class Event2 : public SelfResolvable<Event2<TArgument, TResult>> { Event2BehaviorFlag flags_; }; -template <typename TEvent2> -void EventHandlerToken<TEvent2>::RevokeHandler() const { +inline void EventHandlerToken::RevokeHandler() const { auto event = this->event_resolver_.Resolve(); if (event) { event->RevokeHandler(this->token_value_); |