#include "eventManager.h" void EventManager::shutdown() { subscribers.clear(); } void EventManager::subscribe(int eventType, std::unique_ptr&& handler, int eventId) { if (eventId) { std::unordered_map>>>::iterator subscribers = subscribersByEventId.find(eventType); if (subscribers != subscribersByEventId.end()) { std::unordered_map>>& handlersMap = subscribers->second; std::unordered_map>>::iterator handlers = handlersMap.find(eventId); if (handlers != handlersMap.end()) { handlers->second.emplace_back(std::move(handler)); return; } } subscribersByEventId[eventType][eventId].emplace_back(std::move(handler)); } else { auto& handlers = subscribers[eventType]; handlers.emplace_back(std::move(handler)); } } void EventManager::unsubscribe(int eventType, const std::string& handlerName, int eventId) { if (eventId) { std::unordered_map>>>::iterator subscriberList = subscribersByEventId.find(eventType); if (subscriberList != subscribersByEventId.end()) { std::unordered_map>>& handlersMap = subscriberList->second; std::unordered_map>>::iterator handlers = handlersMap.find(eventId); if (handlers != handlersMap.end()) { std::vector>& callbacks = handlers->second; for (std::vector>::iterator it = callbacks.begin(); it != callbacks.end(); ++it) { if (it->get()->getType() == handlerName) { it = callbacks.erase(it); return; } } } } } else { std::unordered_map>>::iterator handlersIt = subscribers.find(eventType); if (handlersIt != subscribers.end()) { std::vector>& handlers = handlersIt->second; for (std::vector>::iterator it = handlers.begin(); it != handlers.end(); ++it) { if (it->get()->getType() == handlerName) { it = handlers.erase(it); return; } } } } } void EventManager::triggerEvent(const Event& event_, int eventId) { if (eventId > 0) { auto handlersIt = subscribersByEventId[event_.getEventType()].find(eventId); if (handlersIt != subscribersByEventId[event_.getEventType()].end()) { std::vector>& callbacks = handlersIt->second; for (auto it = callbacks.begin(); it != callbacks.end();) { (*it)->exec(event_); if ((*it)->isDestroyOnSuccess()) { it = callbacks.erase(it); } else { ++it; } } } } else { auto& handlers = subscribers[event_.getEventType()]; for (std::unique_ptr& handler : handlers) { handler->exec(event_); } } } void EventManager::queueEvent(std::unique_ptr&& event_, int eventId) { eventsQueue.emplace_back(std::move(event_), eventId); } void EventManager::dispatchEvents() { for (std::vector, int>>::iterator eventIt = eventsQueue.begin(); eventIt != eventsQueue.end();) { if (!eventIt->first.get()->getHandled()) { triggerEvent(*eventIt->first.get(), eventIt->second); eventIt = eventsQueue.erase(eventIt); } else { ++eventIt; } } }