Core/SerializationContext: Replaced currentBitPos and currentByte by [read|write][BitPos][Byte] to handle properly bit reading/writing

This commit is contained in:
Jérôme Leclercq 2018-05-31 16:10:58 +02:00
parent 33fb70b65b
commit 550176e198
5 changed files with 36 additions and 24 deletions

View File

@ -107,6 +107,7 @@ Nazara Engine:
- Added AbstractViewer::Project and AbstractViewer::Unproject methods - Added AbstractViewer::Project and AbstractViewer::Unproject methods
- Added AbstractViewer::ProjectDepth method - Added AbstractViewer::ProjectDepth method
- Fixed SocketPoller not be able to recover from some errors (like invalid sockets and such) - Fixed SocketPoller not be able to recover from some errors (like invalid sockets and such)
- ⚠️ Replaced currentBitPos and currentByte fields by [read|write][BitPos][Byte] to handle properly bit reading/writing.
Nazara Development Kit: Nazara Development Kit:
- Added ImageWidget (#139) - Added ImageWidget (#139)

View File

@ -219,17 +219,17 @@ namespace Nz
*/ */
inline bool Serialize(SerializationContext& context, bool value, TypeTag<bool>) inline bool Serialize(SerializationContext& context, bool value, TypeTag<bool>)
{ {
if (context.currentBitPos == 8) if (context.writeBitPos == 8)
{ {
context.currentBitPos = 0; context.writeBitPos = 0;
context.currentByte = 0; context.writeByte = 0;
} }
if (value) if (value)
context.currentByte |= 1 << context.currentBitPos; context.writeByte |= 1 << context.writeBitPos;
if (++context.currentBitPos >= 8) if (++context.writeBitPos >= 8)
return Serialize(context, context.currentByte, TypeTag<UInt8>()); return Serialize(context, context.writeByte, TypeTag<UInt8>());
else else
return true; return true;
} }
@ -291,18 +291,18 @@ namespace Nz
*/ */
inline bool Unserialize(SerializationContext& context, bool* value, TypeTag<bool>) inline bool Unserialize(SerializationContext& context, bool* value, TypeTag<bool>)
{ {
if (context.currentBitPos == 8) if (context.readBitPos == 8)
{ {
if (!Unserialize(context, &context.currentByte, TypeTag<UInt8>())) if (!Unserialize(context, &context.readByte, TypeTag<UInt8>()))
return false; return false;
context.currentBitPos = 0; context.readBitPos = 0;
} }
if (value) if (value)
*value = (context.currentByte & (1 << context.currentBitPos)) != 0; *value = (context.readByte & (1 << context.readBitPos)) != 0;
context.currentBitPos++; context.readBitPos++;
return true; return true;
} }
@ -341,7 +341,7 @@ namespace Nz
{ {
NazaraAssert(value, "Invalid data pointer"); NazaraAssert(value, "Invalid data pointer");
context.ResetBitPosition(); context.ResetReadBitPosition();
if (context.stream->Read(value, sizeof(T)) == sizeof(T)) if (context.stream->Read(value, sizeof(T)) == sizeof(T))
{ {

View File

@ -20,11 +20,14 @@ namespace Nz
{ {
Stream* stream; Stream* stream;
Endianness endianness = Endianness_BigEndian; //< Default to Big Endian encoding Endianness endianness = Endianness_BigEndian; //< Default to Big Endian encoding
UInt8 currentBitPos = 8; //< 8 means no bit is currently wrote UInt8 readBitPos = 8; //< 8 means no bit is currently read
UInt8 currentByte; //< Undefined value, will be initialized at the first bit write UInt8 readByte; //< Undefined value, will be initialized at the first bit read
UInt8 writeBitPos = 8; //< 8 means no bit is currently wrote
UInt8 writeByte; //< Undefined value, will be initialized at the first bit write
void FlushBits(); void FlushBits();
inline void ResetBitPosition(); inline void ResetReadBitPosition();
inline void ResetWriteBitPosition();
}; };
} }

View File

@ -7,16 +7,24 @@
namespace Nz namespace Nz
{ {
/*! /*!
* \brief Reset the current bit cursor * \brief Reset the current read bit cursor
*/
inline void SerializationContext::ResetReadBitPosition()
{
readBitPos = 8;
}
/*!
* \brief Reset the current read bit cursor
* \remark This function only reset the cursor position, it doesn't do any writing * \remark This function only reset the cursor position, it doesn't do any writing
if you wish to write all bits and reset bit position, call FlushBits if you wish to write all bits and reset bit position, call FlushBits
\see FlushBits \see FlushBits
*/ */
inline void SerializationContext::ResetBitPosition() inline void SerializationContext::ResetWriteBitPosition()
{ {
currentBitPos = 8; writeBitPos = 8;
} }
} }

View File

@ -19,16 +19,16 @@ namespace Nz
/*! /*!
* Write bits to the stream (if any) and reset the current bit cursor * Write bits to the stream (if any) and reset the current bit cursor
* \see ResetBitPosition * \see ResetWriteBitPosition
*/ */
void SerializationContext::FlushBits() void SerializationContext::FlushBits()
{ {
if (currentBitPos != 8) if (writeBitPos != 8)
{ {
ResetBitPosition(); ResetWriteBitPosition();
// Serialize will reset the bit position // Serialize will reset the bit position
if (!Serialize(*this, currentByte)) if (!Serialize(*this, writeByte))
NazaraWarning("Failed to flush bits"); NazaraWarning("Failed to flush bits");
} }
} }