aboutsummaryrefslogtreecommitdiff
path: root/include/cru/base/Event.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/base/Event.h')
-rw-r--r--include/cru/base/Event.h37
1 files changed, 5 insertions, 32 deletions
diff --git a/include/cru/base/Event.h b/include/cru/base/Event.h
index 0bf54475..bdaf3ea6 100644
--- a/include/cru/base/Event.h
+++ b/include/cru/base/Event.h
@@ -1,11 +1,11 @@
#pragma once
#include "Base.h"
+#include "Guard.h"
#include "SelfResolvable.h"
#include <algorithm>
#include <cassert>
#include <functional>
-#include <memory>
#include <utility>
#include <vector>
@@ -142,40 +142,13 @@ class Event : public EventBase, public IEvent<TEventArgs> {
::cru::IEvent<arg_type>* name##Event() { return &name##Event_; }
namespace details {
-struct EventHandlerRevokerDestroyer {
- void operator()(EventHandlerRevoker* p) {
- (*p)();
- delete p;
- }
+struct EventHandlerRevokerCaller {
+ void operator()(const EventHandlerRevoker& revoker) { revoker(); }
};
} // namespace details
-// A guard class for event revoker. Automatically revoke it when destroyed.
-class EventHandlerRevokerGuard {
- public:
- EventHandlerRevokerGuard() = default;
- explicit EventHandlerRevokerGuard(EventHandlerRevoker&& revoker)
- : revoker_(new EventHandlerRevoker(std::move(revoker))) {}
-
- EventHandlerRevoker Get() {
- // revoker is only null when this is moved
- // you shouldn't use a moved instance
- assert(revoker_);
- return *revoker_;
- }
-
- EventHandlerRevoker Release() { return std::move(*revoker_.release()); }
-
- void Reset() { revoker_.reset(); }
-
- void Reset(EventHandlerRevoker&& revoker) {
- revoker_.reset(new EventHandlerRevoker(std::move(revoker)));
- }
-
- private:
- std::unique_ptr<EventHandlerRevoker, details::EventHandlerRevokerDestroyer>
- revoker_;
-};
+using EventHandlerRevokerGuard =
+ AutoDestruct<EventHandlerRevoker, details::EventHandlerRevokerCaller>;
class EventHandlerRevokerListGuard {
public: