This commit is contained in:
@@ -10,71 +10,44 @@ class SerializableMessage {
|
||||
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)) {}
|
||||
std::shared_ptr<MessageBaseType> m_Message;
|
||||
|
||||
operator MessageBaseType&() {
|
||||
return *m_Message;
|
||||
SerializableMessage() {}
|
||||
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) {
|
||||
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 <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();
|
||||
}
|
||||
|
||||
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) {
|
||||
DataBuffer& operator>>(DataBuffer& a_Buffer, SerializableMessage<TMessageFactory>& 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<SerializableMessage<TMessageFactory>>(std::move(factory.CreateMessage(MsgId(msgId.GetValue()))));
|
||||
a_Message->Read(a_Buffer);
|
||||
auto msgPtr = std::shared_ptr<MsgBase>(factory.CreateMessage(MsgId(msgId.GetValue())).release());
|
||||
|
||||
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 = SerializableMessage<TMessageFactory>(msgPtr);
|
||||
a_Message->Read(a_Buffer);
|
||||
|
||||
return a_Buffer;
|
||||
|
||||
Reference in New Issue
Block a user