#pragma once #include #include namespace sp { namespace details { template void WriteField(DataBuffer& a_Buffer, const BitField& a_Data, BitBuffer& a_BitBuffer) { a_BitBuffer.Append(*a_Data); a_BitBuffer.UpdateWrite(true); } template void WriteField(DataBuffer& a_Buffer, const T& a_Data, BitBuffer& a_BitBuffer) { a_Buffer << a_Data; a_BitBuffer.UpdateWrite(false); } template void ReadField(DataBuffer& a_Buffer, BitField& a_Data, BitBuffer& a_BitBuffer) { a_BitBuffer.Read(*a_Data); a_BitBuffer.UpdateRead(true); } template void ReadField(DataBuffer& a_Buffer, T& a_Data, BitBuffer& a_BitBuffer) { a_Buffer >> a_Data; a_BitBuffer.UpdateRead(false); } } // namespace details template 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 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