diff --git a/ChangeLog.md b/ChangeLog.md index 0f68a9a8f..2e2c30d59 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -107,6 +107,7 @@ Nazara Engine: - Added AbstractViewer::Project and AbstractViewer::Unproject methods - Added AbstractViewer::ProjectDepth method - 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: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/Algorithm.inl b/include/Nazara/Core/Algorithm.inl index 969c07bdd..f21b0c36a 100644 --- a/include/Nazara/Core/Algorithm.inl +++ b/include/Nazara/Core/Algorithm.inl @@ -219,17 +219,17 @@ namespace Nz */ inline bool Serialize(SerializationContext& context, bool value, TypeTag) { - if (context.currentBitPos == 8) + if (context.writeBitPos == 8) { - context.currentBitPos = 0; - context.currentByte = 0; + context.writeBitPos = 0; + context.writeByte = 0; } if (value) - context.currentByte |= 1 << context.currentBitPos; + context.writeByte |= 1 << context.writeBitPos; - if (++context.currentBitPos >= 8) - return Serialize(context, context.currentByte, TypeTag()); + if (++context.writeBitPos >= 8) + return Serialize(context, context.writeByte, TypeTag()); else return true; } @@ -291,18 +291,18 @@ namespace Nz */ inline bool Unserialize(SerializationContext& context, bool* value, TypeTag) { - if (context.currentBitPos == 8) + if (context.readBitPos == 8) { - if (!Unserialize(context, &context.currentByte, TypeTag())) + if (!Unserialize(context, &context.readByte, TypeTag())) return false; - context.currentBitPos = 0; + context.readBitPos = 0; } if (value) - *value = (context.currentByte & (1 << context.currentBitPos)) != 0; + *value = (context.readByte & (1 << context.readBitPos)) != 0; - context.currentBitPos++; + context.readBitPos++; return true; } @@ -341,7 +341,7 @@ namespace Nz { NazaraAssert(value, "Invalid data pointer"); - context.ResetBitPosition(); + context.ResetReadBitPosition(); if (context.stream->Read(value, sizeof(T)) == sizeof(T)) { diff --git a/include/Nazara/Core/SerializationContext.hpp b/include/Nazara/Core/SerializationContext.hpp index 94951666d..4111f7a7b 100644 --- a/include/Nazara/Core/SerializationContext.hpp +++ b/include/Nazara/Core/SerializationContext.hpp @@ -20,11 +20,14 @@ namespace Nz { Stream* stream; Endianness endianness = Endianness_BigEndian; //< Default to Big Endian encoding - UInt8 currentBitPos = 8; //< 8 means no bit is currently wrote - UInt8 currentByte; //< Undefined value, will be initialized at the first bit write + UInt8 readBitPos = 8; //< 8 means no bit is currently read + 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(); - inline void ResetBitPosition(); + inline void ResetReadBitPosition(); + inline void ResetWriteBitPosition(); }; } diff --git a/include/Nazara/Core/SerializationContext.inl b/include/Nazara/Core/SerializationContext.inl index 870972655..4379f718d 100644 --- a/include/Nazara/Core/SerializationContext.inl +++ b/include/Nazara/Core/SerializationContext.inl @@ -7,16 +7,24 @@ 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 - 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; } } diff --git a/src/Nazara/Core/SerializationContext.cpp b/src/Nazara/Core/SerializationContext.cpp index 5949281e3..cf9711bea 100644 --- a/src/Nazara/Core/SerializationContext.cpp +++ b/src/Nazara/Core/SerializationContext.cpp @@ -19,16 +19,16 @@ namespace Nz /*! * Write bits to the stream (if any) and reset the current bit cursor - * \see ResetBitPosition + * \see ResetWriteBitPosition */ void SerializationContext::FlushBits() { - if (currentBitPos != 8) + if (writeBitPos != 8) { - ResetBitPosition(); + ResetWriteBitPosition(); // Serialize will reset the bit position - if (!Serialize(*this, currentByte)) + if (!Serialize(*this, writeByte)) NazaraWarning("Failed to flush bits"); } }