1 Commits

Author SHA1 Message Date
9374332cd2 refactor SerializableMessage
All checks were successful
Linux arm64 / Build (push) Successful in 16s
2025-07-31 17:56:01 +02:00
2 changed files with 83 additions and 47 deletions

View File

@@ -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

View 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