diff --git a/include/sp/io/MessageIO.h b/include/sp/io/MessageIO.h index 6d7b596..89f0ed5 100644 --- a/include/sp/io/MessageIO.h +++ b/include/sp/io/MessageIO.h @@ -8,6 +8,15 @@ namespace sp { namespace details { +template +void WriteBitField(DataBuffer& a_Buffer, std::uint64_t& a_DataRaw, std::size_t& a_Offset) { + T filled = static_cast(a_DataRaw); + ToNetwork(filled); + a_Buffer << filled; + a_Offset = 0; + a_DataRaw = 0; +} + template void WriteField(DataBuffer& a_Buffer, const BitField& a_Data, std::uint64_t& a_DataRaw, std::size_t& a_Offset) { T cut = *a_Data & ((1 << a_Data.GetBitSize()) - 1); @@ -15,11 +24,7 @@ void WriteField(DataBuffer& a_Buffer, const BitField& a_Data, std::u a_DataRaw |= cut << pushCount; a_Offset += a_Data.GetBitSize(); if (a_Offset == sizeof(T) * 8) { - T filled = static_cast(a_DataRaw); - ToNetwork(filled); - a_Buffer << filled; - a_Offset = 0; - a_DataRaw = 0; + WriteBitField(a_Buffer, a_DataRaw, a_Offset); } } @@ -34,10 +39,10 @@ template void ReadField(DataBuffer& a_Buffer, BitField& a_Data, std::size_t& a_Offset) { a_Buffer >> *a_Data; FromNetwork(*a_Data); - - *a_Data >>= sizeof(T) * 8 - a_Offset - a_Data.GetBitSize(); + + *a_Data >>= sizeof(T) * 8 - a_Offset - a_Data.GetBitSize(); *a_Data &= (1 << a_Data.GetBitSize()) - 1; - + if (a_Offset != sizeof(T) * 8) { a_Buffer.SetReadOffset(a_Buffer.GetReadOffset() - sizeof(T)); a_Offset += a_Data.GetBitSize(); @@ -65,7 +70,8 @@ DataBuffer WriteMessage(const TData& a_MessageData) { template void ReadMessage(DataBuffer& a_Buffer, TData& a_MessageData) { std::size_t currentOffset = 0; - boost::pfr::for_each_field(a_MessageData, [&a_Buffer, ¤tOffset](auto& a_Field) { ReadField(a_Buffer, a_Field, currentOffset); }); + boost::pfr::for_each_field( + a_MessageData, [&a_Buffer, ¤tOffset](auto& a_Field) { ReadField(a_Buffer, a_Field, currentOffset); }); } } // namespace details