aboutsummaryrefslogtreecommitdiff
path: root/src/cru_event.h
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-11-05 20:54:48 +0800
committercrupest <crupest@outlook.com>2018-11-05 20:54:48 +0800
commit1dab244aaad8694ba37ef43caedd8c8ba0310c00 (patch)
treef70f6489a0f88520a0bdc095cd9713d03f83687b /src/cru_event.h
parent252519effe30881825dd02e26dc41bd9cde34782 (diff)
downloadcru-1dab244aaad8694ba37ef43caedd8c8ba0310c00.tar.gz
cru-1dab244aaad8694ba37ef43caedd8c8ba0310c00.tar.bz2
cru-1dab244aaad8694ba37ef43caedd8c8ba0310c00.zip
...
Diffstat (limited to 'src/cru_event.h')
-rw-r--r--src/cru_event.h35
1 files changed, 15 insertions, 20 deletions
diff --git a/src/cru_event.h b/src/cru_event.h
index d0a7eb82..1103cdba 100644
--- a/src/cru_event.h
+++ b/src/cru_event.h
@@ -1,9 +1,8 @@
#pragma once
#include <type_traits>
-#include <list>
-#include <memory>
-#include <algorithm>
+#include <functional>
+#include <unordered_map>
#include "base.h"
@@ -46,8 +45,8 @@ namespace cru {
using ArgsType = TArgsType;
- using EventHandler = Function<void(ArgsType&)>;
- using EventHandlerPtr = std::shared_ptr<EventHandler>;
+ using EventHandler = std::function<void(ArgsType&)>;
+ using EventHandlerToken = long;
Event() = default;
Event(const Event&) = delete;
@@ -56,28 +55,22 @@ namespace cru {
Event& operator = (Event&&) = delete;
~Event() = default;
- //Create a EventHandlerPtr from the given handler,
- //add it to list and return it.
- EventHandlerPtr AddHandler(EventHandler&& handler)
+ EventHandlerToken AddHandler(const EventHandler& handler)
{
- EventHandlerPtr ptr = std::make_shared<EventHandler>(std::move(handler));
- handlers_.push_back(ptr);
- return ptr;
+ const auto token = current_token_++;
+ handlers_.emplace(token, handler);
+ return token;
}
- void AddHandler(EventHandlerPtr handler) {
- handlers_.push_back(handler);
- }
-
- void RemoveHandler(EventHandlerPtr handler) {
- auto find_result = std::find(handlers_.cbegin(), handlers_.cend(), handler);
+ void RemoveHandler(const EventHandlerToken token) {
+ auto find_result = handlers_.find(token);
if (find_result != handlers_.cend())
handlers_.erase(find_result);
}
void Raise(ArgsType& args) {
- for (auto ptr : handlers_)
- (*ptr)(args);
+ for (const auto& handler : handlers_)
+ (handler.second)(args);
}
bool IsNoHandler() const
@@ -86,6 +79,8 @@ namespace cru {
}
private:
- std::list<EventHandlerPtr> handlers_;
+ std::unordered_map<EventHandlerToken, EventHandler> handlers_;
+
+ EventHandlerToken current_token_ = 0;
};
}