#pragma once #include namespace sp { template DataBuffer& operator<<(DataBuffer& a_Buffer, const std::unique_ptr>& 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) { using TBase = MessageBase; using MsgId = typename TBase::MessageIdType; static MessageFactory factory; VarInt msgId; a_Buffer >> msgId; a_Message = factory.CreateMessage(MsgId(msgId.GetValue())); a_Message->Read(a_Buffer); return a_Buffer; } template DataBuffer& operator>>(DataBuffer& a_Buffer, std::shared_ptr>& a_Message) { using TBase = MessageBase; using MsgId = typename TBase::MessageIdType; static MessageFactory factory; VarInt msgId; a_Buffer >> msgId; a_Message = std::shared_ptr(factory.CreateMessage(MsgId(msgId.GetValue())).release()); a_Message->Read(a_Buffer); return a_Buffer; } } // namespace sp