#pragma once #include "base.hpp" #include #include #include namespace cru { // A non-copyable non-movable Event class. // It stores a list of event handlers. template class Event { public: using EventHandler = std::function; using EventHandlerToken = long; Event() = default; Event(const Event&) = delete; Event& operator=(const Event&) = delete; Event(Event&&) = delete; Event& operator=(Event&&) = delete; ~Event() = default; EventHandlerToken AddHandler(const EventHandler& handler) { const auto token = current_token_++; handlers_.emplace(token, handler); return token; } void RemoveHandler(const EventHandlerToken token) { auto find_result = handlers_.find(token); if (find_result != handlers_.cend()) handlers_.erase(find_result); } template void Raise(Args&&... args) { for (const auto& handler : handlers_) (handler.second)(std::forward(args)...); } private: std::map handlers_; EventHandlerToken current_token_ = 0; }; } // namespace cru