#pragma once template void MessageDispatcher::RegisterHandler(MessageIdType a_MessageType, const std::shared_ptr& 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, const std::shared_ptr& 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(const std::shared_ptr& a_Handler) { for (auto& pair : m_Handlers) { if (pair.second.empty()) continue; MessageIdType type = pair.first; m_Handlers[type].erase(std::remove(m_Handlers[type].begin(), m_Handlers[type].end(), a_Handler), m_Handlers[type].end()); } } template void MessageDispatcher::Dispatch(const MessageBase& a_Message) { MessageIdType type = a_Message.GetId(); for (auto& handler : m_Handlers[type]) a_Message.Dispatch(*handler); }