47 lines
1.6 KiB
C++
47 lines
1.6 KiB
C++
#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
|