54 lines
1.5 KiB
C++
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
|