refactor SerializableMessage
This commit is contained in:
@@ -1,47 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <sp/protocol/MessageFactory.h>
|
|
||||||
|
|
||||||
namespace sp {
|
|
||||||
|
|
||||||
template <typename TMessageID, typename THandler>
|
|
||||||
DataBuffer& operator<<(DataBuffer& a_Buffer, const std::unique_ptr<MessageBase<TMessageID, THandler>>& a_Message) {
|
|
||||||
return a_Buffer << VarInt{static_cast<std::uint64_t>(a_Message->GetId())} << a_Message->Write();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TMessageID, typename THandler>
|
|
||||||
DataBuffer& operator<<(DataBuffer& a_Buffer, const std::shared_ptr<MessageBase<TMessageID, THandler>>& a_Message) {
|
|
||||||
return a_Buffer << VarInt{static_cast<std::uint64_t>(a_Message->GetId())} << a_Message->Write();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TMessageID, typename THandler, typename TTMessages>
|
|
||||||
DataBuffer& operator>>(DataBuffer& a_Buffer, std::unique_ptr<MessageBase<TMessageID, THandler>>& a_Message) {
|
|
||||||
using TBase = MessageBase<TMessageID, THandler>;
|
|
||||||
using MsgId = typename TBase::MessageIdType;
|
|
||||||
static MessageFactory<TBase, TTMessages> factory;
|
|
||||||
|
|
||||||
VarInt msgId;
|
|
||||||
a_Buffer >> msgId;
|
|
||||||
|
|
||||||
a_Message = factory.CreateMessage(MsgId(msgId.GetValue()));
|
|
||||||
a_Message->Read(a_Buffer);
|
|
||||||
|
|
||||||
return a_Buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TMessageID, typename THandler, typename TTMessages>
|
|
||||||
DataBuffer& operator>>(DataBuffer& a_Buffer, std::shared_ptr<MessageBase<TMessageID, THandler>>& a_Message) {
|
|
||||||
using TBase = MessageBase<TMessageID, THandler>;
|
|
||||||
using MsgId = typename TBase::MessageIdType;
|
|
||||||
static MessageFactory<TBase, TTMessages> factory;
|
|
||||||
|
|
||||||
VarInt msgId;
|
|
||||||
a_Buffer >> msgId;
|
|
||||||
|
|
||||||
a_Message = std::shared_ptr<TBase>(factory.CreateMessage(MsgId(msgId.GetValue())).release());
|
|
||||||
a_Message->Read(a_Buffer);
|
|
||||||
|
|
||||||
return a_Buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace sp
|
|
||||||
83
include/sp/io/SerializableMessage.h
Normal file
83
include/sp/io/SerializableMessage.h
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <sp/common/DataBuffer.h>
|
||||||
|
|
||||||
|
namespace sp {
|
||||||
|
|
||||||
|
template <typename TMessageFactory>
|
||||||
|
class SerializableMessage {
|
||||||
|
using MessageBaseType = typename TMessageFactory::MessageBaseType;
|
||||||
|
using HandlerType = typename MessageBaseType::HandlerType;
|
||||||
|
using MessageIdType = typename MessageBaseType::MessageIdType;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<MessageBaseType> m_Message;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SerializableMessage(std::unique_ptr<MessageBaseType>&& a_MessagePtr) : m_Message(std::move(a_MessagePtr)) {}
|
||||||
|
|
||||||
|
operator MessageBaseType&() {
|
||||||
|
return *m_Message;
|
||||||
|
}
|
||||||
|
|
||||||
|
SerializableMessage& operator=(std::unique_ptr<MessageBaseType>&& a_MessagePtr) {
|
||||||
|
m_Message = std::move(a_MessagePtr);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageIdType GetId() const {
|
||||||
|
return m_Message->GetId();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dispatch(HandlerType& handler) const {
|
||||||
|
m_Message->Dispatch(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Read(DataBuffer& a_Buffer) {
|
||||||
|
m_Message->Read(a_Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
DataBuffer Write() const {
|
||||||
|
return m_Message->Write();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename TMessageFactory>
|
||||||
|
DataBuffer& operator<<(DataBuffer& a_Buffer, const std::unique_ptr<SerializableMessage<TMessageFactory>>& a_Message) {
|
||||||
|
return a_Buffer << VarInt{static_cast<std::uint64_t>(a_Message->GetId())} << a_Message->Write();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TMessageFactory>
|
||||||
|
DataBuffer& operator<<(DataBuffer& a_Buffer, const std::shared_ptr<SerializableMessage<TMessageFactory>>& a_Message) {
|
||||||
|
return a_Buffer << VarInt{static_cast<std::uint64_t>(a_Message->GetId())} << a_Message->Write();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TMessageFactory>
|
||||||
|
DataBuffer& operator>>(DataBuffer& a_Buffer, std::unique_ptr<SerializableMessage<TMessageFactory>>& a_Message) {
|
||||||
|
using MsgId = typename TMessageFactory::IdType;
|
||||||
|
static TMessageFactory factory;
|
||||||
|
|
||||||
|
VarInt msgId;
|
||||||
|
a_Buffer >> msgId;
|
||||||
|
|
||||||
|
a_Message = std::make_unique<SerializableMessage<TMessageFactory>>(std::move(factory.CreateMessage(MsgId(msgId.GetValue()))));
|
||||||
|
a_Message->Read(a_Buffer);
|
||||||
|
|
||||||
|
return a_Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TMessageFactory>
|
||||||
|
DataBuffer& operator>>(DataBuffer& a_Buffer, std::shared_ptr<SerializableMessage<TMessageFactory>>& a_Message) {
|
||||||
|
using MsgId = typename TMessageFactory::IdType;
|
||||||
|
static TMessageFactory factory;
|
||||||
|
|
||||||
|
VarInt msgId;
|
||||||
|
a_Buffer >> msgId;
|
||||||
|
|
||||||
|
a_Message = std::make_shared<SerializableMessage<TMessageFactory>>(std::move(factory.CreateMessage(MsgId(msgId.GetValue()))));
|
||||||
|
a_Message->Read(a_Buffer);
|
||||||
|
|
||||||
|
return a_Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace sp
|
||||||
Reference in New Issue
Block a user