fix SerializableMessage
All checks were successful
Linux arm64 / Build (push) Successful in 16s

This commit is contained in:
2025-08-01 12:52:46 +02:00
parent b8dafa4eb1
commit 7eb96163ab

View File

@@ -10,71 +10,44 @@ class SerializableMessage {
using HandlerType = typename MessageBaseType::HandlerType; using HandlerType = typename MessageBaseType::HandlerType;
using MessageIdType = typename MessageBaseType::MessageIdType; using MessageIdType = typename MessageBaseType::MessageIdType;
private:
std::unique_ptr<MessageBaseType> m_Message;
public: public:
SerializableMessage(std::unique_ptr<MessageBaseType>&& a_MessagePtr) : m_Message(std::move(a_MessagePtr)) {} std::shared_ptr<MessageBaseType> m_Message;
operator MessageBaseType&() { SerializableMessage() {}
return *m_Message; SerializableMessage(std::shared_ptr<MessageBaseType>&& a_Message) : m_Message(a_Message) {}
SerializableMessage(const std::shared_ptr<MessageBaseType>& a_Message) : m_Message(a_Message) {}
MessageBaseType* operator->() {
return m_Message.get();
} }
SerializableMessage& operator=(std::unique_ptr<MessageBaseType>&& a_MessagePtr) { operator bool() {
m_Message = std::move(a_MessagePtr); return m_Message.get();
return *this;
} }
MessageIdType GetId() const { const MessageBaseType* operator->() const {
return m_Message->GetId(); return m_Message.get();
}
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> template <typename TMessageFactory>
DataBuffer& operator<<(DataBuffer& a_Buffer, const std::unique_ptr<SerializableMessage<TMessageFactory>>& a_Message) { DataBuffer& operator<<(DataBuffer& a_Buffer, const SerializableMessage<TMessageFactory>& a_Message) {
return a_Buffer << VarInt{static_cast<std::uint64_t>(a_Message->GetId())} << a_Message->Write(); return a_Buffer << VarInt{static_cast<std::uint64_t>(a_Message->GetId())} << a_Message->Write();
} }
template <typename TMessageFactory> template <typename TMessageFactory>
DataBuffer& operator<<(DataBuffer& a_Buffer, const std::shared_ptr<SerializableMessage<TMessageFactory>>& a_Message) { DataBuffer& operator>>(DataBuffer& a_Buffer, 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; using MsgId = typename TMessageFactory::IdType;
using MsgBase = typename TMessageFactory::MessageBaseType;
static TMessageFactory factory; static TMessageFactory factory;
VarInt msgId; VarInt msgId;
a_Buffer >> msgId; a_Buffer >> msgId;
a_Message = std::make_unique<SerializableMessage<TMessageFactory>>(std::move(factory.CreateMessage(MsgId(msgId.GetValue())))); auto msgPtr = std::shared_ptr<MsgBase>(factory.CreateMessage(MsgId(msgId.GetValue())).release());
a_Message->Read(a_Buffer);
return a_Buffer; a_Message = SerializableMessage<TMessageFactory>(msgPtr);
}
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); a_Message->Read(a_Buffer);
return a_Buffer; return a_Buffer;