read/write for basic types
All checks were successful
Linux arm64 / Build (push) Successful in 14s

This commit is contained in:
2025-06-26 16:02:18 +02:00
parent 073872df94
commit 59bedd6482
6 changed files with 76 additions and 3 deletions

View File

@@ -1,6 +1,7 @@
#pragma once
#include <sp/protocol/MessageBase.h>
#include <sp/protocol/MessageIO.h>
namespace sp {
@@ -8,6 +9,7 @@ template <typename TData, typename TMessageID, TMessageID ID, typename THandler>
class ConcreteMessage : public MessageBase<TMessageID, THandler> {
public:
using DataType = TData;
using ThisType = ConcreteMessage<TData, TMessageID, ID, THandler>;
template <typename... T>
ConcreteMessage(const T&... args) : m_Data{args...} {}
@@ -19,7 +21,15 @@ class ConcreteMessage : public MessageBase<TMessageID, THandler> {
}
virtual void Dispatch(THandler& handler) const override {
handler.Handle(static_cast<const ConcreteMessage<TData, TMessageID, ID, THandler>&>(*this));
handler.Handle(static_cast<const ThisType&>(*this));
}
virtual void Read(std::istream& a_Is) override {
details::ReadMessage(a_Is, m_Data);
}
virtual void Write(std::ostream& a_Os) const override {
details::WriteMessage(a_Os, m_Data);
}
private:

View File

@@ -1,5 +1,7 @@
#pragma once
#include <iosfwd>
namespace sp {
template <typename TMessageID, typename THandler>
@@ -14,6 +16,9 @@ class MessageBase {
virtual MessageIdType GetId() const = 0;
virtual void Dispatch(HandlerType& handler) const = 0;
virtual void Read(std::istream& a_Is) = 0;
virtual void Write(std::ostream& a_Os) const = 0;
};
} // namespace sp

View File

@@ -0,0 +1,38 @@
#pragma once
#include <boost/pfr.hpp>
#include <iostream>
#include <sp/common/ByteSwapping.h>
namespace sp {
namespace details {
template<typename T>
void WriteField(std::ostream& a_Os, const T& a_Data) {
T swapped = a_Data;
ToNetwork(swapped);
a_Os.write(reinterpret_cast<const char*>(&swapped), sizeof(a_Data));
}
template<typename T>
void ReadField(std::istream& a_Is, T& a_Data) {
a_Is.read(reinterpret_cast<char*>(&a_Data), sizeof(a_Data));
FromNetwork(a_Data);
}
template <typename TData>
void WriteMessage(std::ostream& a_Os, const TData& a_MessageData) {
boost::pfr::for_each_field(a_MessageData, [&a_Os](const auto& a_Field) {
WriteField(a_Os, a_Field);
});
}
template <typename TData>
void ReadMessage(std::istream& a_Is, TData& a_MessageData) {
boost::pfr::for_each_field(a_MessageData, [&a_Is](auto& a_Field) {
ReadField(a_Is, a_Field);
});
}
} // namespace details
} // namespace sp