#pragma once #include #include namespace sp { template void MessageDispatcher::RegisterHandler(MessageIdType a_MessageType, MessageHandler* a_Handler) { assert(a_Handler); auto found = std::find(m_Handlers[a_MessageType].begin(), m_Handlers[a_MessageType].end(), a_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(m_Handlers[a_MessageType].begin(), m_Handlers[a_MessageType].end(), a_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; pair.second.erase(std::remove(pair.second.begin(), pair.second.end(), a_Handler), pair.second.end()); } } template void MessageDispatcher::Dispatch(const MessageBase& a_Message) { MessageIdType type = a_Message.GetId(); for (auto& handler : m_Handlers[type]) { a_Message.Dispatch(*handler); } } } // namespace sp