Core/SerializationContext: Replaced currentBitPos and currentByte by [read|write][BitPos][Byte] to handle properly bit reading/writing
This commit is contained in:
parent
33fb70b65b
commit
550176e198
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -219,17 +219,17 @@ namespace Nz
|
|||
*/
|
||||
inline bool Serialize(SerializationContext& context, bool value, TypeTag<bool>)
|
||||
{
|
||||
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<UInt8>());
|
||||
if (++context.writeBitPos >= 8)
|
||||
return Serialize(context, context.writeByte, TypeTag<UInt8>());
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
|
@ -291,18 +291,18 @@ namespace Nz
|
|||
*/
|
||||
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;
|
||||
|
||||
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))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue