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