#pragma once template void MessageDispatcher::RegisterHandler(MessageIdType a_MessageType, const std::weak_ptr& a_Handler) { auto found = std::find_if(m_Handlers[a_MessageType].begin(), m_Handlers[a_MessageType].end(), [&a_Handler](const std::weak_ptr& handler){ return a_Handler.lock() == handler.lock(); }); if (found == m_Handlers[a_MessageType].end()) m_Handlers[a_MessageType].push_back(a_Handler); } template void MessageDispatcher::UnregisterHandler(MessageIdType a_MessageType, const std::weak_ptr& a_Handler) { auto found = std::find_if(m_Handlers[a_MessageType].begin(), m_Handlers[a_MessageType].end(), [&a_Handler](const std::weak_ptr& handler){ return a_Handler.lock() == handler.lock(); }); if (found != m_Handlers[a_MessageType].end()) m_Handlers[a_MessageType].erase(found); } template void MessageDispatcher::UnregisterHandler(const std::weak_ptr& 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](const std::weak_ptr& handler){ return handler.lock() == a_Handler.lock(); }); 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.expired()) a_Message.Dispatch(*handler.lock()); } }