#pragma once #include #include #include "event.h" #include "keyCodes.h" #include "eventHandler.h" #include // using EventType = std::uint32_t; // using EventId = std::uint64_t; class EventManager { public: EventManager(const EventManager&) = delete; const EventManager& operator=(const EventManager&) = delete; static EventManager& getInstance() { static EventManager instance; return instance; } void shutdown(); void subscribe(int eventType, std::unique_ptr&& handler, int eventId); void unsubscribe(int eventType, const std::string& handlerName, int eventId); void triggerEvent(const Event& event_, int eventId); void queueEvent(std::unique_ptr&& event_, int eventId); void dispatchEvents(); private: EventManager() = default; std::vector, int>> eventsQueue; std::unordered_map>> subscribers; std::unordered_map>>> subscribersByEventId; }; template inline void subscribe(const EventHandler& callback, int eventId = 0, const bool unsubscribeOnSuccess = false) { std::unique_ptr handler = std::make_unique>(callback, unsubscribeOnSuccess); EventManager::getInstance().subscribe(EventType::getStaticEventType(), std::move(handler), eventId); } template inline void unsubscribe(const EventHandler& callback, int eventId = 0) { const std::string handlerName = callback.target_type().name(); EventManager::getInstance().unsubscribe(EventType::getStaticEventType(), handlerName, eventId); } inline void triggerEvent(const Event& triggeredEvent, int eventId = 0) { EventManager::getInstance().triggerEvent(triggeredEvent, eventId); } inline void queueEvent(std::unique_ptr&& queuedEvent, int eventId = 0) { EventManager::getInstance().queueEvent(std::forward>(queuedEvent), eventId); }