#pragma once template void MessageDispatcher::RegisterHandler(MessageIdType a_MessageType, MessageHandler* a_Handler) { auto found = std::find_if(m_Handlers[a_MessageType].begin(), m_Handlers[a_MessageType].end(), [&a_Handler](const MessageHandler* handler){ return a_Handler == handler; }); if (found == m_Handlers[a_MessageType].end()) m_Handlers[a_MessageType].push_back(a_Handler); } template void MessageDispatcher::UnregisterHandler(MessageIdType a_MessageType, MessageHandler* a_Handler) { auto found = std::find_if(m_Handlers[a_MessageType].begin(), m_Handlers[a_MessageType].end(), [&a_Handler](const MessageHandler* handler){ return a_Handler == handler; }); if (found != m_Handlers[a_MessageType].end()) m_Handlers[a_MessageType].erase(found); } template void MessageDispatcher::UnregisterHandler(MessageHandler* a_Handler) { for (auto& pair : m_Handlers) { if (pair.second.empty()) continue; MessageIdType type = pair.first; auto it = std::find_if(pair.second.begin(), pair.second.end(), [&a_Handler](MessageHandler* handler){ return handler == a_Handler; }); if (it != pair.second.end()) pair.second.erase(it); } } template void MessageDispatcher::Dispatch(const MessageBase& a_Message) { MessageIdType type = a_Message.GetId(); for (auto& handler : m_Handlers[type]) { if (handler) a_Message.Dispatch(*handler); } }