From 8d3d9e38eeef41662cfc2d9f7797d01200c730e3 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sun, 2 Mar 2025 20:37:54 +0100 Subject: [PATCH] dispatcher: use weak_ptr --- include/sp/protocol/MessageDispatcher.h | 10 ++++--- .../message/MessageDispatcherImpl.inl | 28 +++++++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/include/sp/protocol/MessageDispatcher.h b/include/sp/protocol/MessageDispatcher.h index cd6b5cd..2f5e9a0 100644 --- a/include/sp/protocol/MessageDispatcher.h +++ b/include/sp/protocol/MessageDispatcher.h @@ -17,7 +17,7 @@ namespace sp { template class MessageDispatcher { private: - std::map>> m_Handlers; + std::map>> m_Handlers; public: using MessageBaseType = MessageBase; @@ -38,18 +38,20 @@ class MessageDispatcher { * \param type The packet type * \param handler The packet handler */ - void RegisterHandler(MessageIdType a_MessageType, const std::shared_ptr& a_Handler); + void RegisterHandler(MessageIdType a_MessageType, const std::weak_ptr& a_Handler); + /** * \brief Unregister a packet handler * \param type The packet type * \param handler The packet handler */ - void UnregisterHandler(MessageIdType a_MessageType, const std::shared_ptr& a_Handler); + void UnregisterHandler(MessageIdType a_MessageType, const std::weak_ptr& a_Handler); + /** * \brief Unregister a packet handler * \param handler The packet handler */ - void UnregisterHandler(const std::shared_ptr& a_Handler); + void UnregisterHandler(const std::weak_ptr& a_Handler); }; #include diff --git a/include/sp/protocol/message/MessageDispatcherImpl.inl b/include/sp/protocol/message/MessageDispatcherImpl.inl index 3531452..568c4b7 100644 --- a/include/sp/protocol/message/MessageDispatcherImpl.inl +++ b/include/sp/protocol/message/MessageDispatcherImpl.inl @@ -1,34 +1,46 @@ #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); +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::shared_ptr& a_Handler) { - auto found = std::find(m_Handlers[a_MessageType].begin(), m_Handlers[a_MessageType].end(), a_Handler); +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::shared_ptr& a_Handler) { +void MessageDispatcher::UnregisterHandler(const std::weak_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()); + 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]) - a_Message.Dispatch(*handler); + for (auto& handler : m_Handlers[type]) { + if (!handler.expired()) + a_Message.Dispatch(*handler.lock()); + } }