Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
75bae99daa
|
@@ -19,7 +19,6 @@ template <typename MessageBase>
|
|||||||
class MessageDispatcher {
|
class MessageDispatcher {
|
||||||
public:
|
public:
|
||||||
using MessageBaseType = MessageBase;
|
using MessageBaseType = MessageBase;
|
||||||
using MessageIdType = typename MessageBase::MessageIdType;
|
|
||||||
using MessageHandler = typename MessageBase::HandlerType;
|
using MessageHandler = typename MessageBase::HandlerType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,23 +37,16 @@ class MessageDispatcher {
|
|||||||
* \param type The packet type
|
* \param type The packet type
|
||||||
* \param handler The packet handler
|
* \param handler The packet handler
|
||||||
*/
|
*/
|
||||||
void RegisterHandler(MessageIdType a_MessageType, MessageHandler* a_Handler);
|
void RegisterHandler(const std::shared_ptr<MessageHandler>& a_Handler);
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Unregister a packet handler
|
|
||||||
* \param type The packet type
|
|
||||||
* \param handler The packet handler
|
|
||||||
*/
|
|
||||||
void UnregisterHandler(MessageIdType a_MessageType, MessageHandler* a_Handler);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Unregister a packet handler
|
* \brief Unregister a packet handler
|
||||||
* \param handler The packet handler
|
* \param handler The packet handler
|
||||||
*/
|
*/
|
||||||
void UnregisterHandler(MessageHandler* a_Handler);
|
void UnregisterHandler(const std::shared_ptr<MessageHandler>& a_Handler);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<MessageIdType, std::vector<MessageHandler*>> m_Handlers;
|
std::vector<std::weak_ptr<MessageHandler>> m_Handlers;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace sp
|
} // namespace sp
|
||||||
|
|||||||
@@ -6,37 +6,22 @@
|
|||||||
namespace sp {
|
namespace sp {
|
||||||
|
|
||||||
template <typename MessageBase>
|
template <typename MessageBase>
|
||||||
void MessageDispatcher<MessageBase>::RegisterHandler(MessageIdType a_MessageType, MessageHandler* a_Handler) {
|
void MessageDispatcher<MessageBase>::RegisterHandler(const std::shared_ptr<MessageHandler>& a_Handler) {
|
||||||
assert(a_Handler);
|
assert(a_Handler);
|
||||||
auto found = std::find(m_Handlers[a_MessageType].begin(), m_Handlers[a_MessageType].end(), a_Handler);
|
m_Handlers.push_back(a_Handler);
|
||||||
if (found == m_Handlers[a_MessageType].end())
|
|
||||||
m_Handlers[a_MessageType].push_back(a_Handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename MessageBase>
|
template <typename MessageBase>
|
||||||
void MessageDispatcher<MessageBase>::UnregisterHandler(MessageIdType a_MessageType, MessageHandler* a_Handler) {
|
void MessageDispatcher<MessageBase>::UnregisterHandler(const std::shared_ptr<MessageHandler>& a_Handler) {
|
||||||
auto found = std::find(m_Handlers[a_MessageType].begin(), m_Handlers[a_MessageType].end(), a_Handler);
|
auto found = std::find(m_Handlers.begin(), m_Handlers.end(), a_Handler);
|
||||||
if (found != m_Handlers[a_MessageType].end())
|
if (found != m_Handlers.end())
|
||||||
m_Handlers[a_MessageType].erase(found);
|
m_Handlers.erase(found);
|
||||||
}
|
|
||||||
|
|
||||||
template <typename MessageBase>
|
|
||||||
void MessageDispatcher<MessageBase>::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 <typename MessageBase>
|
template <typename MessageBase>
|
||||||
void MessageDispatcher<MessageBase>::Dispatch(const MessageBase& a_Message) {
|
void MessageDispatcher<MessageBase>::Dispatch(const MessageBase& a_Message) {
|
||||||
MessageIdType type = a_Message.GetId();
|
for (auto& handler : m_Handlers) {
|
||||||
for (auto& handler : m_Handlers[type]) {
|
a_Message.Dispatch(*handler.lock());
|
||||||
a_Message.Dispatch(*handler);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,10 +61,9 @@ int main() {
|
|||||||
|
|
||||||
// dispatch tests
|
// dispatch tests
|
||||||
|
|
||||||
MyHandler h;
|
auto h = std::make_shared<MyHandler>();
|
||||||
PacketDispatcher d;
|
PacketDispatcher d;
|
||||||
d.RegisterHandler(PacketID::KeepAlive, &h);
|
d.RegisterHandler(h);
|
||||||
d.RegisterHandler(PacketID::MDC, &h);
|
|
||||||
d.Dispatch(m);
|
d.Dispatch(m);
|
||||||
PacketFactory f;
|
PacketFactory f;
|
||||||
auto message = f.CreateMessage(PacketID::KeepAlive);
|
auto message = f.CreateMessage(PacketID::KeepAlive);
|
||||||
|
|||||||
Reference in New Issue
Block a user