9#include <unordered_map>
59 std::scoped_lock lock(other._queueMutex, other._callbacksMutex);
89 template <
typename TEvent,
typename TScheduler = DirectCallbackSchedulerTag,
typename TCallBack>
104 template <
typename TEvent>
void PushEvent(
const TEvent &event)
107 std::shared_ptr<Utils::EventContainer<TEvent>> directContainer;
114 if (callbacks.contains(typeID))
124 std::static_pointer_cast<Utils::EventContainer<TEvent>>(
_eventCallbacks[schedulerID][typeID]);
130 for (
auto &callback : directContainer->GetFunctions())
132 callback->Call(event);
148 auto schedulerID = std::type_index(
typeid(TScheduler));
150 std::queue<std::pair<EventTypeID, std::any>> queueCopy;
159 while (!queueCopy.empty())
161 auto [typeID, event] = std::move(queueCopy.front());
164 std::shared_ptr<Utils::IEventContainer> callback;
175 callback->Trigger(event);
190 template <
typename TEvent,
typename TScheduler = DirectCallbackSchedulerTag>
195 auto schedulerID = std::type_index(
typeid(TScheduler));
198 Log::Warning(
"EventManager::UnregisterCallback: No callbacks registered for this event type.");
201 auto container = std::static_pointer_cast<Utils::EventContainer<TEvent>>(
_eventCallbacks[schedulerID][typeID]);
202 if (!container->Contains(callbackID))
204 Log::Warning(
"EventManager::UnregisterCallback: Callback ID not found.");
207 container->DeleteFunction(callbackID);
211 template <
typename TEvent,
typename TCallBack,
typename TScheduler>
216 auto schedulerID = std::type_index(
typeid(TScheduler));
227 auto container = std::static_pointer_cast<Utils::EventContainer<TEvent>>(
_eventCallbacks[schedulerID][typeID]);
228 return container->AddFunction(std::forward<TCallBack>(callback));
237 template <
typename TEvent>
static EventTypeID _GetId(
void) {
return typeid(TEvent).hash_code(); }
239 std::unordered_map<std::type_index, std::unordered_map<EventTypeID, std::shared_ptr<Utils::IEventContainer>>>
241 std::unordered_map<std::type_index, std::queue<std::pair<EventTypeID, std::any>>>
_eventQueue;
static EventCallbackID _GenerateRandomID()
Definition EventManager.hpp:231
EventCallbackID _RegisterCallbackImpl(TCallBack &&callback)
Definition EventManager.hpp:212
std::unordered_map< std::type_index, std::queue< std::pair< EventTypeID, std::any > > > _eventQueue
Definition EventManager.hpp:241
size_t EventTypeID
Type identifier for event types.
Definition EventManager.hpp:31
void UnregisterCallback(EventCallbackID callbackID)
Unregister a previously registered callback.
Definition EventManager.hpp:191
EventManager & operator=(EventManager &&other) noexcept
Move assignment operator.
Definition EventManager.hpp:69
void PushEvent(const TEvent &event)
Queue an event for processing.
Definition EventManager.hpp:104
EventManager & operator=(const EventManager &)=delete
~EventManager()
Definition EventManager.hpp:43
std::mutex _callbacksMutex
Definition EventManager.hpp:243
static EventTypeID _GetId(void)
Definition EventManager.hpp:237
EventManager(const EventManager &)=delete
EventManager()=default
Default constructor.
std::unordered_map< std::type_index, std::unordered_map< EventTypeID, std::shared_ptr< Utils::IEventContainer > > > _eventCallbacks
Definition EventManager.hpp:240
EventManager(EventManager &&other) noexcept
Move constructor.
Definition EventManager.hpp:57
size_t EventCallbackID
Unique identifier for registered event callbacks.
Definition EventManager.hpp:36
EventCallbackID RegisterCallback(TCallBack &&callback)
Definition EventManager.hpp:90
void ProcessEvents(void)
Process all queued events for a specific scheduler.
Definition EventManager.hpp:146
std::mutex _queueMutex
Definition EventManager.hpp:242
Definition EventContainer.hpp:17
Definition EventManager.hpp:16
void Warning(const T &msg) noexcept
Definition Logger.hpp:49
Definition EventManager.hpp:25