28#include <unordered_map>
32#include "utility/event/event.hpp"
34namespace utility::event
51 using Handler = std::function<void(
const Event &)>;
53 std::unordered_map<std::size_t, std::vector<Handler>> _handlers;
55 template<
typename EventType>
static std::size_t typeKey(
void)
noexcept
57 static const EventType *marker =
nullptr;
58 return reinterpret_cast<std::size_t
>(&marker);
78 template<InheritFromEvent EventType,
typename Callable>
81 auto key = typeKey<EventType>();
82 _handlers[key].emplace_back([fn = std::forward<Callable>(listener)](
83 const Event &event)
mutable {
84 fn(
static_cast<const EventType &
>(event));
94 template<InheritFromEvent EventType>
95 void emit(
const EventType &event)
const
97 auto key = typeKey<EventType>();
98 auto it = _handlers.find(key);
99 if (it == _handlers.end()) {
102 for (
const auto &handler: it->second) {
113 _handlers.erase(typeKey<EventType>());
Dispatches typed events to registered listeners.
void clearAll(void) noexcept
Remove all listeners for every event type.
EventDispatcher(void)=default
Default constructor.
void addListener(Callable &&listener)
Register a listener for a concrete event type.
void emit(const EventType &event) const
Emit an event to all listeners registered for its concrete type.
void clearListeners(void)
Remove all listeners registered for a concrete event type.
~EventDispatcher(void)=default
Default destructor.
Base class for events in the event system.