aboutsummaryrefslogtreecommitdiff
path: root/include/cru/base/Event.h
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-17 13:31:04 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-17 13:31:04 +0800
commitc9f31440d65a867e2316e9a19ee3f5db2d0e53a7 (patch)
treee5ea356d86222360f5a2fb79bf72478eb3bf1ebe /include/cru/base/Event.h
parentd7874664af04ac7fd56cfffbaba4511b3a77f12d (diff)
downloadcru-c9f31440d65a867e2316e9a19ee3f5db2d0e53a7.tar.gz
cru-c9f31440d65a867e2316e9a19ee3f5db2d0e53a7.tar.bz2
cru-c9f31440d65a867e2316e9a19ee3f5db2d0e53a7.zip
Revert removing SelfResolvable.
Diffstat (limited to 'include/cru/base/Event.h')
-rw-r--r--include/cru/base/Event.h18
1 files changed, 12 insertions, 6 deletions
diff --git a/include/cru/base/Event.h b/include/cru/base/Event.h
index c26bea83..0bf54475 100644
--- a/include/cru/base/Event.h
+++ b/include/cru/base/Event.h
@@ -1,5 +1,6 @@
#pragma once
#include "Base.h"
+#include "SelfResolvable.h"
#include <algorithm>
#include <cassert>
@@ -11,7 +12,7 @@
namespace cru {
class EventHandlerRevoker;
-class EventBase : public Object {
+class EventBase : public Object, public SelfResolvable<EventBase> {
friend EventHandlerRevoker;
public:
@@ -34,23 +35,28 @@ class EventHandlerRevoker {
friend EventBase;
private:
- EventHandlerRevoker(EventBase* event, EventBase::EventHandlerToken token)
- : event_(event), token_(token) {}
+ EventHandlerRevoker(ObjectResolver<EventBase>&& resolver,
+ EventBase::EventHandlerToken token)
+ : resolver_(std::move(resolver)), 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 { event_->RemoveHandler(token_); }
+ void operator()() const {
+ if (const auto event = resolver_.Resolve()) {
+ event->RemoveHandler(token_);
+ }
+ }
private:
- EventBase* event_;
+ ObjectResolver<EventBase> resolver_;
EventBase::EventHandlerToken token_;
};
inline EventHandlerRevoker EventBase::CreateRevoker(EventHandlerToken token) {
- return EventHandlerRevoker(this, token);
+ return EventHandlerRevoker(CreateResolver(), token);
}
struct IBaseEvent : public virtual Interface {