From 1dab244aaad8694ba37ef43caedd8c8ba0310c00 Mon Sep 17 00:00:00 2001 From: crupest Date: Mon, 5 Nov 2018 20:54:48 +0800 Subject: ... --- src/cru_event.h | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) (limited to 'src/cru_event.h') 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 -#include -#include -#include +#include +#include #include "base.h" @@ -46,8 +45,8 @@ namespace cru { using ArgsType = TArgsType; - using EventHandler = Function; - using EventHandlerPtr = std::shared_ptr; + using EventHandler = std::function; + 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(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 handlers_; + std::unordered_map handlers_; + + EventHandlerToken current_token_ = 0; }; } -- cgit v1.2.3