Files
Simple-Protocol-Lib/include/sp/io/MessageIO.h
Persson-dev b8dafa4eb1
All checks were successful
Linux arm64 / Build (push) Successful in 16s
refactor DataBuffer
2025-08-01 12:44:05 +02:00

54 lines
1.5 KiB
C++

#pragma once
#include <sp/io/BitBuffer.h>
#include <sp/common/DataBufferOperators.h>
namespace sp {
namespace details {
template <typename T, std::size_t BitSize>
void WriteField(DataBuffer& a_Buffer, const BitField<T, BitSize>& a_Data, BitBuffer& a_BitBuffer) {
a_BitBuffer.Append<T, BitSize>(*a_Data);
a_BitBuffer.UpdateWrite(true);
}
template <typename T>
void WriteField(DataBuffer& a_Buffer, const T& a_Data, BitBuffer& a_BitBuffer) {
a_Buffer << a_Data;
a_BitBuffer.UpdateWrite(false);
}
template <typename T, std::size_t BitSize>
void ReadField(DataBuffer& a_Buffer, BitField<T, BitSize>& a_Data, BitBuffer& a_BitBuffer) {
a_BitBuffer.Read<T, BitSize>(*a_Data);
a_BitBuffer.UpdateRead(true);
}
template <typename T>
void ReadField(DataBuffer& a_Buffer, T& a_Data, BitBuffer& a_BitBuffer) {
a_Buffer >> a_Data;
a_BitBuffer.UpdateRead(false);
}
} // namespace details
template <typename TData>
DataBuffer WriteMessage(const TData& a_MessageData) {
DataBuffer buffer;
BitBuffer bitBuffer(buffer);
boost::pfr::for_each_field(
a_MessageData, [&buffer, &bitBuffer](const auto& a_Field) { details::WriteField(buffer, a_Field, bitBuffer); });
bitBuffer.UpdateWrite(false);
return buffer;
}
template <typename TData>
void ReadMessage(DataBuffer& a_Buffer, TData& a_MessageData) {
BitBuffer bitBuffer(a_Buffer);
boost::pfr::for_each_field(
a_MessageData, [&a_Buffer, &bitBuffer](auto& a_Field) { details::ReadField(a_Buffer, a_Field, bitBuffer); });
bitBuffer.UpdateRead(false);
}
} // namespace sp