![]() |
Shadowrun: Awakened 29 September 2011 - Build 871
|
#include <BitStream.h>
Public Member Functions | |
| void | AddBitsAndReallocate (const BitSize_t numberOfBitsToWrite) |
| Reallocates (if necessary) in preparation of writing numberOfBitsToWrite. | |
| void | AlignReadToByteBoundary (void) |
| Align the next write and/or read to a byte boundary. | |
| void | AlignWriteToByteBoundary (void) |
| Align the next write and/or read to a byte boundary. | |
| void | AssertCopyData (void) |
| If we used the constructor version with copy data off, this makes sure it is set to on and the data pointed to is copied. | |
| void | AssertStreamEmpty (void) |
| This is good to call when you are done with the stream to make sure you didn't leave any data left over void. | |
| BitStream (const unsigned int initialBytesToAllocate) | |
| Create the bitstream, with some number of bytes to immediately allocate. | |
| BitStream () | |
| Default Constructor. | |
| BitStream (unsigned char *_data, const unsigned int lengthInBytes, bool _copyData) | |
| Initialize the BitStream, immediately setting the data it contains to a predefined pointer. | |
| BitSize_t | CopyData (unsigned char **_data) const |
| Makes a copy of the internal data for you _data will point to the stream. Partial bytes are left aligned. | |
| void | EndianSwapBytes (int byteOffset, int length) |
| unsigned char * | GetData (void) const |
| BitSize_t | GetNumberOfBitsAllocated (void) const |
| BitSize_t | GetNumberOfBitsUsed (void) const |
| Returns the length in bits of the stream. | |
| BitSize_t | GetNumberOfBytesUsed (void) const |
| Returns the length in bytes of the stream. | |
| BitSize_t | GetNumberOfUnreadBits (void) const |
| Returns the number of bits left in the stream that haven't been read. | |
| BitSize_t | GetReadOffset (void) const |
| Returns the number of bits into the stream that we have read. | |
| BitSize_t | GetWriteOffset (void) const |
| void | IgnoreBits (const BitSize_t numberOfBits) |
| Ignore data we don't intend to read. | |
| void | IgnoreBytes (const unsigned int numberOfBytes) |
| Ignore data we don't intend to read. | |
| void | PadWithZeroToByteLength (unsigned int bytes) |
| Write zeros until the bitstream is filled up to bytes. | |
| void | PrintBits (char *out) const |
| RAKNET_DEBUG_PRINTF the bits in the stream. Great for debugging. | |
| void | PrintBits (void) const |
| void | PrintHex (char *out) const |
| void | PrintHex (void) const |
| bool | Read (BitStream *bitStream) |
| bool | Read (BitStream *bitStream, BitSize_t numberOfBits) |
| Read one bitstream to another. | |
| template<> | |
| bool | Read (wchar_t *&varString) |
| bool | Read (BitStream &bitStream, BitSize_t numberOfBits) |
| template<> | |
| bool | Read (unsigned char *&varString) |
| template<> | |
| bool | Read (bool &outTemplateVar) |
| Read a bool from a bitstream. | |
| template<> | |
| bool | Read (SystemAddress &outTemplateVar) |
| Read a systemAddress from a bitstream. | |
| template<> | |
| bool | Read (uint24_t &outTemplateVar) |
| template<> | |
| bool | Read (RakNetGUID &outTemplateVar) |
| template<> | |
| bool | Read (RakString &outTemplateVar) |
| template<> | |
| bool | Read (RakWString &outTemplateVar) |
| template<> | |
| bool | Read (char *&varString) |
| bool | Read (BitStream &bitStream) |
| bool | Read (char *output, const unsigned int numberOfBytes) |
| Read an array or casted stream of byte. | |
| bool | Read (char *varString) |
| Read strings, non reference. | |
| bool | Read (unsigned char *varString) |
| template<class templateType > | |
| bool | Read (templateType &outTemplateVar) |
| Read any integral type from a bitstream. | |
| bool | ReadAlignedBytes (unsigned char *inOutByteArray, const unsigned int numberOfBytesToRead) |
| Read bits, starting at the next aligned bits. | |
| bool | ReadAlignedBytesSafe (char *inOutByteArray, int &inputLength, const int maxBytesToRead) |
| Reads what was written by WriteAlignedBytesSafe. | |
| bool | ReadAlignedBytesSafe (char *inOutByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead) |
| bool | ReadAlignedBytesSafeAlloc (char **outByteArray, int &inputLength, const unsigned int maxBytesToRead) |
| Same as ReadAlignedBytesSafe() but allocates the memory for you using new, rather than assuming it is safe to write to. | |
| bool | ReadAlignedBytesSafeAlloc (char **outByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead) |
| bool | ReadAlignedVar16 (char *inOutByteArray) |
| bool | ReadAlignedVar32 (char *inOutByteArray) |
| bool | ReadAlignedVar8 (char *inOutByteArray) |
| bool | ReadBit (void) |
| Reads 1 bit and returns true if that bit is 1 and false if it is 0. | |
| bool | ReadBits (unsigned char *inOutByteArray, BitSize_t numberOfBitsToRead, const bool alignBitsToRight=true) |
| Read numberOfBitsToRead bits to the output source. | |
| template<class templateType , class rangeType > | |
| bool | ReadBitsFromIntegerRange (templateType &value, const rangeType minimum, const rangeType maximum, bool allowOutsideRange=false) |
| template<class templateType , class rangeType > | |
| bool | ReadBitsFromIntegerRange (templateType &value, const rangeType minimum, const rangeType maximum, const int requiredBits, bool allowOutsideRange=false) |
| template<class serializationType , class sourceType > | |
| bool | ReadCasted (sourceType &value) |
| template<> | |
| bool | ReadCompressed (SystemAddress &outTemplateVar) |
| template<> | |
| bool | ReadCompressed (uint24_t &outTemplateVar) |
| template<> | |
| bool | ReadCompressed (RakNetGUID &outTemplateVar) |
| template<> | |
| bool | ReadCompressed (bool &outTemplateVar) |
| template<> | |
| bool | ReadCompressed (float &outTemplateVar) |
| For values between -1 and 1. | |
| template<> | |
| bool | ReadCompressed (double &outTemplateVar) |
| For values between -1 and 1. | |
| template<> | |
| bool | ReadCompressed (RakWString &outTemplateVar) |
| template<> | |
| bool | ReadCompressed (char *&outTemplateVar) |
| template<> | |
| bool | ReadCompressed (wchar_t *&outTemplateVar) |
| template<> | |
| bool | ReadCompressed (unsigned char *&outTemplateVar) |
| template<class templateType > | |
| bool | ReadCompressed (templateType &outTemplateVar) |
| Read any integral type from a bitstream. | |
| template<> | |
| bool | ReadCompressed (RakString &outTemplateVar) |
| For strings. | |
| template<class templateType > | |
| bool | ReadCompressedDelta (templateType &outTemplateVar) |
| Read any integral type from a bitstream. | |
| template<> | |
| bool | ReadCompressedDelta (bool &outTemplateVar) |
| Read a bool from a bitstream. | |
| template<> | |
| bool | ReadDelta (bool &outTemplateVar) |
| Read a bool from a bitstream. | |
| template<class templateType > | |
| bool | ReadDelta (templateType &outTemplateVar) |
| Read any integral type from a bitstream. | |
| bool | ReadFloat16 (float &outFloat, float floatMin, float floatMax) |
| Read a float into 2 bytes, spanning the range between floatMin and floatMax. | |
| template<class templateType > | |
| bool | ReadNormQuat (templateType &w, templateType &x, templateType &y, templateType &z) |
| Read a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes. | |
| template<class templateType > | |
| bool | ReadNormVector (templateType &x, templateType &y, templateType &z) |
| Read a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes. | |
| template<class templateType > | |
| bool | ReadOrthMatrix (templateType &m00, templateType &m01, templateType &m02, templateType &m10, templateType &m11, templateType &m12, templateType &m20, templateType &m21, templateType &m22) |
| Read an orthogonal matrix from a quaternion, reading 3 components of the quaternion in 2 bytes each and extrapolatig the 4th. | |
| template<class templateType > | |
| bool | ReadVector (templateType &x, templateType &y, templateType &z) |
| Read 3 floats or doubles, using 10 bytes, where those float or doubles comprise a vector. | |
| void | Reset (void) |
| Resets the bitstream for reuse. | |
| void | ResetReadPointer (void) |
| Sets the read pointer back to the beginning of your data. | |
| void | ResetWritePointer (void) |
| Sets the write pointer back to the beginning of your data. | |
| template<class templateType > | |
| bool | Serialize (bool writeToBitstream, templateType &inOutTemplateVar) |
| Bidirectional serialize/deserialize any integral type to/from a bitstream. | |
| bool | Serialize (bool writeToBitstream, char *inOutByteArray, const unsigned int numberOfBytes) |
| Bidirectional serialize/deserialize an array or casted stream or raw data. This does NOT do endian swapping. | |
| bool | SerializeBits (bool writeToBitstream, unsigned char *inOutByteArray, const BitSize_t numberOfBitsToSerialize, const bool rightAlignedBits=true) |
| Bidirectional serialize/deserialize numberToSerialize bits to/from the input. | |
| template<class templateType , class rangeType > | |
| bool | SerializeBitsFromIntegerRange (bool writeToBitstream, templateType &value, const rangeType minimum, const rangeType maximum, const int requiredBits, bool allowOutsideRange=false) |
| template<class templateType , class rangeType > | |
| bool | SerializeBitsFromIntegerRange (bool writeToBitstream, templateType &value, const rangeType minimum, const rangeType maximum, bool allowOutsideRange=false) |
| template<class serializationType , class sourceType > | |
| bool | SerializeCasted (bool writeToBitstream, sourceType &value) |
| template<class templateType > | |
| bool | SerializeCompressed (bool writeToBitstream, templateType &inOutTemplateVar) |
| Bidirectional serialize/deserialize any integral type to/from a bitstream. | |
| template<class templateType > | |
| bool | SerializeCompressedDelta (bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue) |
| Bidirectional serialize/deserialize any integral type to/from a bitstream. | |
| template<class templateType > | |
| bool | SerializeCompressedDelta (bool writeToBitstream, templateType &inOutTemplateVar) |
| Save as SerializeCompressedDelta(templateType ¤tValue, const templateType &lastValue) when we have an unknown second parameter. | |
| template<class templateType > | |
| bool | SerializeDelta (bool writeToBitstream, templateType &inOutCurrentValue) |
| Bidirectional version of SerializeDelta when you don't know what the last value is, or there is no last value. | |
| template<class templateType > | |
| bool | SerializeDelta (bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue) |
| Bidirectional serialize/deserialize any integral type to/from a bitstream. | |
| bool | SerializeFloat16 (bool writeToBitstream, float &inOutFloat, float floatMin, float floatMax) |
| Serialize a float into 2 bytes, spanning the range between floatMin and floatMax. | |
| template<class templateType > | |
| bool | SerializeNormQuat (bool writeToBitstream, templateType &w, templateType &x, templateType &y, templateType &z) |
| Bidirectional serialize/deserialize a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes. Slightly lossy. | |
| template<class templateType > | |
| bool | SerializeNormVector (bool writeToBitstream, templateType &x, templateType &y, templateType &z) |
| Bidirectional serialize/deserialize a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes. | |
| template<class templateType > | |
| bool | SerializeOrthMatrix (bool writeToBitstream, templateType &m00, templateType &m01, templateType &m02, templateType &m10, templateType &m11, templateType &m12, templateType &m20, templateType &m21, templateType &m22) |
| Bidirectional serialize/deserialize an orthogonal matrix by creating a quaternion, and writing 3 components of the quaternion in 2 bytes each. | |
| template<class templateType > | |
| bool | SerializeVector (bool writeToBitstream, templateType &x, templateType &y, templateType &z) |
| Bidirectional serialize/deserialize a vector, using 10 bytes instead of 12. | |
| void | SetData (unsigned char *inByteArray) |
| void | SetNumberOfBitsAllocated (const BitSize_t lengthInBits) |
| Use this if you pass a pointer copy to the constructor (_copyData==false) and want to overallocate to prevent reallocation. | |
| void | SetReadOffset (const BitSize_t newReadOffset) |
| Sets the read bit index. | |
| void | SetWriteOffset (const BitSize_t offset) |
| Move the write pointer to a position on the array. | |
| void | Write (BitStream &bitStream, BitSize_t numberOfBits) |
| void | Write (const char *inputByteArray, const unsigned int numberOfBytes) |
| Write an array or casted stream or raw data. This does NOT do endian swapping. | |
| void | Write (const wchar_t *const inStringVar) |
| void | Write (BitStream *bitStream, BitSize_t numberOfBits) |
| Write one bitstream to another. | |
| void | Write (unsigned char *const inTemplateVar) |
| template<> | |
| void | Write (const bool &inTemplateVar) |
| Write a bool to a bitstream. | |
| void | Write (BitStream *bitStream) |
| void | Write (const char *const inStringVar) |
| template<> | |
| void | Write (const wchar_t *const &inStringVar) |
| template<> | |
| void | Write (const unsigned char *const &inTemplateVar) |
| template<> | |
| void | Write (const RakWString &inTemplateVar) |
| template<class templateType > | |
| void | Write (const templateType &inTemplateVar) |
| Write any integral type to a bitstream. | |
| template<> | |
| void | Write (const uint24_t &inTemplateVar) |
| void | Write (char *const inTemplateVar) |
| template<> | |
| void | Write (const char *const &inStringVar) |
| template<> | |
| void | Write (const RakString &inTemplateVar) |
| Write a string to a bitstream. | |
| template<> | |
| void | Write (const RakNetGUID &inTemplateVar) |
| template<> | |
| void | Write (char *const &inTemplateVar) |
| template<> | |
| void | Write (const SystemAddress &inTemplateVar) |
| Write a systemAddress to a bitstream. | |
| void | Write (const unsigned char *const inTemplateVar) |
| void | Write (BitStream &bitStream) |
| template<> | |
| void | Write (unsigned char *const &inTemplateVar) |
| void | Write0 (void) |
| Write a 0. | |
| void | Write1 (void) |
| Write a 1. | |
| void | WriteAlignedBytes (const unsigned char *inByteArray, const unsigned int numberOfBytesToWrite) |
| Align the bitstream to the byte boundary and then write the specified number of bits. | |
| void | WriteAlignedBytesSafe (const char *inByteArray, const unsigned int inputLength, const unsigned int maxBytesToWrite) |
| Aligns the bitstream, writes inputLength, and writes input. Won't write beyond maxBytesToWrite. | |
| void | WriteAlignedVar16 (const char *inByteArray) |
| void | WriteAlignedVar32 (const char *inByteArray) |
| void | WriteAlignedVar8 (const char *inByteArray) |
| void | WriteBits (const unsigned char *inByteArray, BitSize_t numberOfBitsToWrite, const bool rightAlignedBits=true) |
| Write numberToWrite bits from the input source. | |
| template<class templateType , class rangeType > | |
| void | WriteBitsFromIntegerRange (const templateType value, const rangeType minimum, const rangeType maximum, const int requiredBits, bool allowOutsideRange=false) |
| template<class templateType , class rangeType > | |
| void | WriteBitsFromIntegerRange (const templateType value, const rangeType minimum, const rangeType maximum, bool allowOutsideRange=false) |
| template<class serializationType , class sourceType > | |
| void | WriteCasted (const sourceType &value) |
| template<> | |
| void | WriteCompressed (const RakNetGUID &inTemplateVar) |
| template<> | |
| void | WriteCompressed (char *const &inTemplateVar) |
| template<> | |
| void | WriteCompressed (unsigned char *const &inTemplateVar) |
| template<> | |
| void | WriteCompressed (const SystemAddress &inTemplateVar) |
| template<> | |
| void | WriteCompressed (const char *const &inStringVar) |
| void | WriteCompressed (const char *const inStringVar) |
| void | WriteCompressed (const unsigned char *const inTemplateVar) |
| template<> | |
| void | WriteCompressed (const float &inTemplateVar) |
| For values between -1 and 1. | |
| void | WriteCompressed (char *const inTemplateVar) |
| template<> | |
| void | WriteCompressed (const double &inTemplateVar) |
| For values between -1 and 1. | |
| template<> | |
| void | WriteCompressed (const uint24_t &var) |
| template<> | |
| void | WriteCompressed (const wchar_t *const &inStringVar) |
| template<> | |
| void | WriteCompressed (const RakWString &inTemplateVar) |
| void | WriteCompressed (unsigned char *const inTemplateVar) |
| template<> | |
| void | WriteCompressed (const RakString &inTemplateVar) |
| Compress the string. | |
| template<> | |
| void | WriteCompressed (const unsigned char *const &inTemplateVar) |
| void | WriteCompressed (const wchar_t *const inStringVar) |
| template<class templateType > | |
| void | WriteCompressed (const templateType &inTemplateVar) |
| Write any integral type to a bitstream. | |
| template<> | |
| void | WriteCompressed (const bool &inTemplateVar) |
| template<class templateType > | |
| void | WriteCompressedDelta (const templateType ¤tValue) |
| Save as WriteCompressedDelta(const templateType ¤tValue, const templateType &lastValue) when we have an unknown second parameter. | |
| template<class templateType > | |
| void | WriteCompressedDelta (const templateType ¤tValue, const templateType &lastValue) |
| Write any integral type to a bitstream. | |
| template<> | |
| void | WriteCompressedDelta (const bool ¤tValue) |
| Save as WriteCompressedDelta(bool currentValue, const templateType &lastValue) when we have an unknown second bool. | |
| template<> | |
| void | WriteCompressedDelta (const bool ¤tValue, const bool &lastValue) |
| Write a bool delta. Same thing as just calling Write. | |
| template<> | |
| void | WriteDelta (const bool ¤tValue, const bool &lastValue) |
| Write a bool delta. Same thing as just calling Write. | |
| template<class templateType > | |
| void | WriteDelta (const templateType ¤tValue, const templateType &lastValue) |
| Write any integral type to a bitstream. | |
| template<class templateType > | |
| void | WriteDelta (const templateType ¤tValue) |
| WriteDelta when you don't know what the last value is, or there is no last value. | |
| void | WriteFloat16 (float x, float floatMin, float floatMax) |
| Write a float into 2 bytes, spanning the range between floatMin and floatMax. | |
| template<class templateType > | |
| void | WriteNormQuat (templateType w, templateType x, templateType y, templateType z) |
| Write a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes. Slightly lossy. | |
| template<class templateType > | |
| void | WriteNormVector (templateType x, templateType y, templateType z) |
| Write a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes. | |
| template<class templateType > | |
| void | WriteOrthMatrix (templateType m00, templateType m01, templateType m02, templateType m10, templateType m11, templateType m12, templateType m20, templateType m21, templateType m22) |
| Write an orthogonal matrix by creating a quaternion, and writing 3 components of the quaternion in 2 bytes each. | |
| template<class templateType > | |
| void | WritePtr (templateType *inTemplateVar) |
| Write the dereferenced pointer to any integral type to a bitstream. | |
| template<class templateType > | |
| void | WriteVector (templateType x, templateType y, templateType z) |
| Write a vector, using 10 bytes instead of 12. | |
| ~BitStream () | |
Static Public Member Functions | |
| static void | DestroyInstance (BitStream *i) |
| static bool | DoEndianSwap (void) |
| static BitStream * | GetInstance (void) |
| static bool | IsBigEndian (void) |
| static bool | IsNetworkOrder (void) |
| static bool | IsNetworkOrderInternal (void) |
| static int | NumberOfLeadingZeroes (uint32_t x) |
| static int | NumberOfLeadingZeroes (uint16_t x) |
| static int | NumberOfLeadingZeroes (int16_t x) |
| static int | NumberOfLeadingZeroes (int32_t x) |
| static int | NumberOfLeadingZeroes (uint8_t x) |
| static int | NumberOfLeadingZeroes (int8_t x) |
| static int | NumberOfLeadingZeroes (int64_t x) |
| static int | NumberOfLeadingZeroes (uint64_t x) |
| static void | ReverseBytes (unsigned char *inByteArray, unsigned char *inOutByteArray, const unsigned int length) |
| static void | ReverseBytesInPlace (unsigned char *inOutData, const unsigned int length) |
Private Member Functions | |
| BitStream (const BitStream &invalid) | |
| bool | ReadCompressed (unsigned char *inOutByteArray, const unsigned int size, const bool unsignedData) |
| Assume the input source points to a compressed native type. Decompress and read it. | |
| void | WriteCompressed (const unsigned char *inByteArray, const unsigned int size, const bool unsignedData) |
| Assume the input source points to a native type, compress and write it. | |
Private Attributes | |
| bool | copyData |
| true if the internal buffer is copy of the data passed to the constructor | |
| unsigned char * | data |
| BitSize_t | numberOfBitsAllocated |
| BitSize_t | numberOfBitsUsed |
| BitSize_t | readOffset |
| unsigned char | stackData [256] |
| BitStreams that use less than BITSTREAM_STACK_ALLOCATION_SIZE use the stack, rather than the heap to store data. It switches over if BITSTREAM_STACK_ALLOCATION_SIZE is exceeded. | |
This class allows you to write and read native types as a string of bits. BitStream is used extensively throughout RakNet and is designed to be used by users as well.
Definition at line 40 of file BitStream.h.
| RakNet::BitStream::BitStream | ( | ) |
| RakNet::BitStream::BitStream | ( | const unsigned int | initialBytesToAllocate | ) |
There is no benefit to calling this, unless you know exactly how many bytes you need and it is greater than BITSTREAM_STACK_ALLOCATION_SIZE. In that case all it does is save you one or more realloc calls.
| [in] | initialBytesToAllocate | the number of bytes to pre-allocate. |
| RakNet::BitStream::BitStream | ( | unsigned char * | _data, |
| const unsigned int | lengthInBytes, | ||
| bool | _copyData | ||
| ) |
Set _copyData to true if you want to make an internal copy of the data you are passing. Set it to false to just save a pointer to the data. You shouldn't call Write functions with _copyData as false, as this will write to unallocated memory 99% of the time you will use this function to cast Packet::data to a bitstream for reading, in which case you should write something as follows:
RakNet::BitStream bs(packet->data, packet->length, false);
| [in] | _data | An array of bytes. |
| [in] | lengthInBytes | Size of the _data. |
| [in] | _copyData | true or false to make a copy of _data or not. |
| RakNet::BitStream::~BitStream | ( | ) |
| RakNet::BitStream::BitStream | ( | const BitStream & | invalid | ) | [inline, private] |
| void RakNet::BitStream::AddBitsAndReallocate | ( | const BitSize_t | numberOfBitsToWrite | ) |
Referenced by Write().
| void RakNet::BitStream::AlignReadToByteBoundary | ( | void | ) | [inline] |
This can be used to 'waste' bits to byte align for efficiency reasons It can also be used to force coalesced bitstreams to start on byte boundaries so so WriteAlignedBits and ReadAlignedBits both calculate the same offset when aligning.
Definition at line 587 of file BitStream.h.
Referenced by DataStructures::RangeList< range_type >::Deserialize(), and Read().
{readOffset += 8 - ( (( readOffset - 1 ) & 7 ) + 1 );}
| void RakNet::BitStream::AlignWriteToByteBoundary | ( | void | ) | [inline] |
This can be used to 'waste' bits to byte align for efficiency reasons It can also be used to force coalesced bitstreams to start on byte boundaries so so WriteAlignedBits and ReadAlignedBits both calculate the same offset when aligning.
Definition at line 580 of file BitStream.h.
Referenced by DataStructures::RangeList< range_type >::Serialize(), and Write().
{numberOfBitsUsed += 8 - ( (( numberOfBitsUsed - 1 ) & 7) + 1 );}
| void RakNet::BitStream::AssertCopyData | ( | void | ) |
| void RakNet::BitStream::AssertStreamEmpty | ( | void | ) |
| BitSize_t RakNet::BitStream::CopyData | ( | unsigned char ** | _data | ) | const |
| [out] | _data | The allocated copy of GetData() |
| static void RakNet::BitStream::DestroyInstance | ( | BitStream * | i | ) | [static] |
| static bool RakNet::BitStream::DoEndianSwap | ( | void | ) | [inline, static] |
---- Member function template specialization declarations ----
Definition at line 877 of file BitStream.h.
Referenced by Read(), ReadCompressed(), Write(), WriteCompressed(), and WritePtr().
{
#ifndef __BITSTREAM_NATIVE_END
return IsNetworkOrder()==false;
#else
return false;
#endif
}
| void RakNet::BitStream::EndianSwapBytes | ( | int | byteOffset, |
| int | length | ||
| ) |
| unsigned char* RakNet::BitStream::GetData | ( | void | ) | const [inline] |
Gets the data that BitStream is writing to / reading from. Partial bytes are left aligned.
Definition at line 522 of file BitStream.h.
Referenced by RakNet::VariableListDeltaTracker::WriteVar().
{return data;}
| static BitStream* RakNet::BitStream::GetInstance | ( | void | ) | [static] |
| BitSize_t RakNet::BitStream::GetNumberOfBitsAllocated | ( | void | ) | const |
| BitSize_t RakNet::BitStream::GetNumberOfBitsUsed | ( | void | ) | const [inline] |
Definition at line 494 of file BitStream.h.
Referenced by DataStructures::RangeList< range_type >::Serialize().
{return GetWriteOffset();}
| BitSize_t RakNet::BitStream::GetNumberOfBytesUsed | ( | void | ) | const [inline] |
Definition at line 498 of file BitStream.h.
References BITS_TO_BYTES.
Referenced by RakNet::VariableListDeltaTracker::WriteVar().
{return BITS_TO_BYTES( numberOfBitsUsed );}
| BitSize_t RakNet::BitStream::GetNumberOfUnreadBits | ( | void | ) | const [inline] |
Definition at line 507 of file BitStream.h.
{return numberOfBitsUsed - readOffset;}
| BitSize_t RakNet::BitStream::GetReadOffset | ( | void | ) | const [inline] |
Definition at line 501 of file BitStream.h.
{return readOffset;}
| BitSize_t RakNet::BitStream::GetWriteOffset | ( | void | ) | const [inline] |
Definition at line 495 of file BitStream.h.
Referenced by DataStructures::RangeList< range_type >::Serialize().
{return numberOfBitsUsed;}
| void RakNet::BitStream::IgnoreBits | ( | const BitSize_t | numberOfBits | ) |
| [in] | numberOfBits | The number of bits to ignore |
| void RakNet::BitStream::IgnoreBytes | ( | const unsigned int | numberOfBytes | ) |
| [in] | numberOfBits | The number of bytes to ignore |
| static bool RakNet::BitStream::IsBigEndian | ( | void | ) | [inline, static] |
Definition at line 884 of file BitStream.h.
Referenced by Read(), ReadBitsFromIntegerRange(), Write(), and WriteBitsFromIntegerRange().
{
return IsNetworkOrder();
}
| static bool RakNet::BitStream::IsNetworkOrder | ( | void | ) | [inline, static] |
Definition at line 888 of file BitStream.h.
{static const bool r = IsNetworkOrderInternal(); return r;}
| static bool RakNet::BitStream::IsNetworkOrderInternal | ( | void | ) | [static] |
| static int RakNet::BitStream::NumberOfLeadingZeroes | ( | uint8_t | x | ) | [static] |
Get the number of leading zeros for a number
| [in] | x | Number to test |
Referenced by ReadBitsFromIntegerRange(), SerializeBitsFromIntegerRange(), and WriteBitsFromIntegerRange().
| static int RakNet::BitStream::NumberOfLeadingZeroes | ( | uint16_t | x | ) | [static] |
| static int RakNet::BitStream::NumberOfLeadingZeroes | ( | uint32_t | x | ) | [static] |
| static int RakNet::BitStream::NumberOfLeadingZeroes | ( | uint64_t | x | ) | [static] |
| static int RakNet::BitStream::NumberOfLeadingZeroes | ( | int8_t | x | ) | [static] |
| static int RakNet::BitStream::NumberOfLeadingZeroes | ( | int16_t | x | ) | [static] |
| static int RakNet::BitStream::NumberOfLeadingZeroes | ( | int32_t | x | ) | [static] |
| static int RakNet::BitStream::NumberOfLeadingZeroes | ( | int64_t | x | ) | [static] |
| void RakNet::BitStream::PadWithZeroToByteLength | ( | unsigned int | bytes | ) |
| void RakNet::BitStream::PrintBits | ( | char * | out | ) | const |
| void RakNet::BitStream::PrintBits | ( | void | ) | const |
| void RakNet::BitStream::PrintHex | ( | char * | out | ) | const |
| void RakNet::BitStream::PrintHex | ( | void | ) | const |
| [in] | outTemplateVar | The value to read |
Definition at line 1461 of file BitStream.h.
References data, numberOfBitsUsed, and readOffset.
{
if ( readOffset + 1 > numberOfBitsUsed )
return false;
if ( data[ readOffset >> 3 ] & ( 0x80 >> ( readOffset & 7 ) ) ) // Is it faster to just write it out here?
outTemplateVar = true;
else
outTemplateVar = false;
// Has to be on a different line for Mac
readOffset++;
return true;
}
| bool RakNet::BitStream::Read | ( | SystemAddress & | outTemplateVar | ) | [inline] |
| [in] | outTemplateVar | The value to read |
Definition at line 1480 of file BitStream.h.
References RakNet::SystemAddress::address, RakNet::SystemAddress::debugPort, Read(), and ReadBits().
{
unsigned char ipVersion;
Read(ipVersion);
if (ipVersion==4)
{
outTemplateVar.address.addr4.sin_family=AF_INET;
// Read(var.binaryAddress);
// Don't endian swap the address or port
uint32_t binaryAddress;
ReadBits( ( unsigned char* ) & binaryAddress, sizeof(binaryAddress) * 8, true );
// Unhide the IP address, done to prevent routers from changing it
outTemplateVar.address.addr4.sin_addr.s_addr=~binaryAddress;
bool b = ReadBits(( unsigned char* ) & outTemplateVar.address.addr4.sin_port, sizeof(outTemplateVar.address.addr4.sin_port) * 8, true);
outTemplateVar.debugPort=ntohs(outTemplateVar.address.addr4.sin_port);
return b;
}
else
{
#if RAKNET_SUPPORT_IPV6==1
bool b = ReadBits((unsigned char*) &outTemplateVar.address.addr6, sizeof(outTemplateVar.address.addr6)*8, true);
outTemplateVar.debugPort=ntohs(outTemplateVar.address.addr6.sin6_port);
return b;
#else
return false;
#endif
}
}
Definition at line 1510 of file BitStream.h.
References AlignReadToByteBoundary(), data, IsBigEndian(), numberOfBitsUsed, readOffset, and RakNet::uint24_t::val.
{
AlignReadToByteBoundary();
if ( readOffset + 3*8 > numberOfBitsUsed )
return false;
if (IsBigEndian()==false)
{
((char *)&outTemplateVar.val)[0]=data[ (readOffset >> 3) + 0];
((char *)&outTemplateVar.val)[1]=data[ (readOffset >> 3) + 1];
((char *)&outTemplateVar.val)[2]=data[ (readOffset >> 3) + 2];
((char *)&outTemplateVar.val)[3]=0;
}
else
{
((char *)&outTemplateVar.val)[3]=data[ (readOffset >> 3) + 0];
((char *)&outTemplateVar.val)[2]=data[ (readOffset >> 3) + 1];
((char *)&outTemplateVar.val)[1]=data[ (readOffset >> 3) + 2];
((char *)&outTemplateVar.val)[0]=0;
}
readOffset+=3*8;
return true;
}
| bool RakNet::BitStream::Read | ( | RakNetGUID & | outTemplateVar | ) | [inline] |
Definition at line 1537 of file BitStream.h.
References RakNet::RakNetGUID::g, and Read().
{
return Read(outTemplateVar.g);
}
Definition at line 1544 of file BitStream.h.
References RakNet::RakString::Deserialize().
{
return outTemplateVar.Deserialize(this);
}
| bool RakNet::BitStream::Read | ( | RakWString & | outTemplateVar | ) | [inline] |
Definition at line 1549 of file BitStream.h.
{
return outTemplateVar.Deserialize(this);
}
| bool RakNet::BitStream::Read | ( | char *& | varString | ) | [inline] |
Definition at line 1554 of file BitStream.h.
References RakNet::RakString::Deserialize().
{
return RakString::Deserialize(varString,this);
}
| bool RakNet::BitStream::Read | ( | wchar_t *& | varString | ) | [inline] |
Definition at line 1559 of file BitStream.h.
{
return RakWString::Deserialize(varString,this);
}
| bool RakNet::BitStream::Read | ( | unsigned char *& | varString | ) | [inline] |
Definition at line 1564 of file BitStream.h.
References RakNet::RakString::Deserialize().
{
return RakString::Deserialize((char*) varString,this);
}
| bool RakNet::BitStream::Read | ( | char * | varString | ) |
| bool RakNet::BitStream::Read | ( | char * | output, |
| const unsigned int | numberOfBytes | ||
| ) |
The array is raw data. There is no automatic endian conversion with this function
| [in] | output | The result byte array. It should be larger than numberOfBytes. |
| [in] | numberOfBytes | The number of byte to read |
| bool RakNet::BitStream::Read | ( | unsigned char * | varString | ) |
| [in] | numberOfBits | bits to read |
| bitStream | the bitstream to read into from |
| bool RakNet::BitStream::Read | ( | templateType & | outTemplateVar | ) | [inline] |
Read any integral type from a bitstream. Define __BITSTREAM_NATIVE_END if you need endian swapping.
Define __BITSTREAM_NATIVE_END if you need endian swapping.
| [in] | outTemplateVar | The value to read |
| [in] | outTemplateVar | The value to read |
Definition at line 1429 of file BitStream.h.
References DoEndianSwap(), ReadBits(), and ReverseBytes().
Referenced by SraNetwork::SraServerInfo::Deserialize(), SraNetwork::SraPacket::Deserialize(), SraNetwork::SendMessageToPlayerPacket::Deserialize(), SraNetwork::SendMessageToChannelPacket::Deserialize(), SraNetwork::ReplyPacket::Deserialize(), SraNetwork::LoginReplyPacket::Deserialize(), SraNetwork::LoginPacket::Deserialize(), SraNetwork::LeaveChannelPacket::Deserialize(), SraNetwork::JoinChannelPacket::Deserialize(), SraNetwork::GetServerListPacket::Deserialize(), SraNetwork::GetClientCharactersPacket::Deserialize(), DataStructures::RangeList< range_type >::Deserialize(), SraNetwork::ConnectToServerPacket::Deserialize(), SraNetwork::ChatMessage::Deserialize(), SraNetwork::BasicCharacterInfo::Deserialize(), operator>>(), RakNet::operator>>(), Read(), ReadBitsFromIntegerRange(), ReadCasted(), ReadCompressed(), ReadCompressedDelta(), ReadDelta(), ReadNormQuat(), RakNet::VariableListDeltaTracker::ReadVarFromBitstream(), ReadVector(), and Serialize().
{
#ifdef _MSC_VER
#pragma warning(disable:4127) // conditional expression is constant
#endif
if (sizeof(outTemplateVar)==1)
return ReadBits( ( unsigned char* ) &outTemplateVar, sizeof(templateType) * 8, true );
else
{
#ifndef __BITSTREAM_NATIVE_END
#ifdef _MSC_VER
#pragma warning(disable:4244) // '=' : conversion from 'unsigned long' to 'unsigned short', possible loss of data
#endif
if (DoEndianSwap())
{
unsigned char output[sizeof(templateType)];
if (ReadBits( ( unsigned char* ) output, sizeof(templateType) * 8, true ))
{
ReverseBytes(output, (unsigned char*)&outTemplateVar, sizeof(templateType));
return true;
}
return false;
}
else
#endif
return ReadBits( ( unsigned char* ) & outTemplateVar, sizeof(templateType) * 8, true );
}
}
| bool RakNet::BitStream::ReadAlignedBytes | ( | unsigned char * | inOutByteArray, |
| const unsigned int | numberOfBytesToRead | ||
| ) |
Note that the modulus 8 starting offset of the sequence must be the same as was used with WriteBits. This will be a problem with packet coalescence unless you byte align the coalesced packets.
| [in] | inOutByteArray | The byte array larger than numberOfBytesToRead |
| [in] | numberOfBytesToRead | The number of byte to read from the internal state |
| bool RakNet::BitStream::ReadAlignedBytesSafe | ( | char * | inOutByteArray, |
| unsigned int & | inputLength, | ||
| const unsigned int | maxBytesToRead | ||
| ) |
| bool RakNet::BitStream::ReadAlignedBytesSafe | ( | char * | inOutByteArray, |
| int & | inputLength, | ||
| const int | maxBytesToRead | ||
| ) |
| [in] | inOutByteArray | The data |
| [in] | maxBytesToRead | Maximum number of bytes to read |
| bool RakNet::BitStream::ReadAlignedBytesSafeAlloc | ( | char ** | outByteArray, |
| int & | inputLength, | ||
| const unsigned int | maxBytesToRead | ||
| ) |
| [in] | outByteArray | outByteArray will be deleted if it is not a pointer to 0 |
| bool RakNet::BitStream::ReadAlignedBytesSafeAlloc | ( | char ** | outByteArray, |
| unsigned int & | inputLength, | ||
| const unsigned int | maxBytesToRead | ||
| ) |
| bool RakNet::BitStream::ReadAlignedVar16 | ( | char * | inOutByteArray | ) |
| bool RakNet::BitStream::ReadAlignedVar32 | ( | char * | inOutByteArray | ) |
| bool RakNet::BitStream::ReadAlignedVar8 | ( | char * | inOutByteArray | ) |
| bool RakNet::BitStream::ReadBit | ( | void | ) |
| bool RakNet::BitStream::ReadBits | ( | unsigned char * | inOutByteArray, |
| BitSize_t | numberOfBitsToRead, | ||
| const bool | alignBitsToRight = true |
||
| ) |
alignBitsToRight should be set to true to convert internal bitstream data to userdata. It should be false if you used WriteBits with rightAlignedBits false
| [in] | inOutByteArray | The resulting bits array |
| [in] | numberOfBitsToRead | The number of bits to read |
| [in] | alignBitsToRight | if true bits will be right aligned. |
Referenced by Read(), ReadBitsFromIntegerRange(), and SerializeBits().
| bool RakNet::BitStream::ReadBitsFromIntegerRange | ( | templateType & | value, |
| const rangeType | minimum, | ||
| const rangeType | maximum, | ||
| bool | allowOutsideRange = false |
||
| ) |
Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range Then read only those bits
| [in] | value | Integer value to read, which should be between minimum and maximum |
| [in] | minimum | Minimum value of value |
| [in] | maximum | Maximum value of value |
| [in] | allowOutsideRange | If true, all sends will take an extra bit, however value can deviate from outside minimum and maximum. If false, will assert if the value deviates. This should match the corresponding value passed to Write(). |
Definition at line 1861 of file BitStream.h.
References BYTES_TO_BITS, and NumberOfLeadingZeroes().
Referenced by SerializeBitsFromIntegerRange().
{
static int requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum));
return ReadBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);
}
| bool RakNet::BitStream::ReadBitsFromIntegerRange | ( | templateType & | value, |
| const rangeType | minimum, | ||
| const rangeType | maximum, | ||
| const int | requiredBits, | ||
| bool | allowOutsideRange = false |
||
| ) |
| [in] | requiredBits | Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum |
Definition at line 1867 of file BitStream.h.
References IsBigEndian(), RakAssert, Read(), ReadBits(), and ReverseBytesInPlace().
{
RakAssert(maximum>=minimum);
if (allowOutsideRange)
{
bool isOutsideRange;
Read(isOutsideRange);
if (isOutsideRange)
return Read(value);
}
unsigned char output[sizeof(templateType)];
memset(output,0,sizeof(output));
bool success = ReadBits(output,requiredBits);
if (success)
{
if (IsBigEndian()==true)
ReverseBytesInPlace(output,sizeof(output));
memcpy(&value,output,sizeof(output));
value+=minimum;
}
return success;
}
| bool RakNet::BitStream::ReadCasted | ( | sourceType & | value | ) |
Read one type serialized to another (smaller) type, to save bandwidth serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t Example: int num; ReadCasted<uint8_t>(num); would read 1 bytefrom the stream, and put the value in an integer
| [in] | value | The value to write |
Definition at line 1852 of file BitStream.h.
References Read().
| bool RakNet::BitStream::ReadCompressed | ( | unsigned char * | inOutByteArray, |
| const unsigned int | size, | ||
| const bool | unsignedData | ||
| ) | [private] |
Definition at line 1652 of file BitStream.h.
References Read().
| bool RakNet::BitStream::ReadCompressed | ( | RakWString & | outTemplateVar | ) | [inline] |
Definition at line 1683 of file BitStream.h.
{
return outTemplateVar.Deserialize(this);
}
| bool RakNet::BitStream::ReadCompressed | ( | RakNetGUID & | outTemplateVar | ) | [inline] |
| bool RakNet::BitStream::ReadCompressed | ( | SystemAddress & | outTemplateVar | ) | [inline] |
| bool RakNet::BitStream::ReadCompressed | ( | double & | outTemplateVar | ) | [inline] |
Definition at line 1665 of file BitStream.h.
References Read().
| bool RakNet::BitStream::ReadCompressed | ( | wchar_t *& | outTemplateVar | ) | [inline] |
Definition at line 1693 of file BitStream.h.
{
return RakWString::Deserialize(outTemplateVar,this);
}
| bool RakNet::BitStream::ReadCompressed | ( | unsigned char *& | outTemplateVar | ) | [inline] |
Definition at line 1698 of file BitStream.h.
References RakNet::RakString::DeserializeCompressed().
{
return RakString::DeserializeCompressed((char*) outTemplateVar,this,false);
}
| bool RakNet::BitStream::ReadCompressed | ( | char *& | outTemplateVar | ) | [inline] |
Definition at line 1688 of file BitStream.h.
References RakNet::RakString::DeserializeCompressed().
{
return RakString::DeserializeCompressed(outTemplateVar,this,false);
}
| bool RakNet::BitStream::ReadCompressed | ( | templateType & | outTemplateVar | ) | [inline] |
Undefine __BITSTREAM_NATIVE_END if you need endian swapping. For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte
| [in] | outTemplateVar | The value to read |
Undefine __BITSTREAM_NATIVE_END if you need endian swapping. For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte
| [in] | outTemplateVar | The value to read |
Definition at line 1600 of file BitStream.h.
References DoEndianSwap(), and ReverseBytes().
Referenced by ReadCompressedDelta(), ReadVector(), and SerializeCompressed().
{
#ifdef _MSC_VER
#pragma warning(disable:4127) // conditional expression is constant
#endif
if (sizeof(outTemplateVar)==1)
return ReadCompressed( ( unsigned char* ) &outTemplateVar, sizeof(templateType) * 8, true );
else
{
#ifndef __BITSTREAM_NATIVE_END
if (DoEndianSwap())
{
unsigned char output[sizeof(templateType)];
if (ReadCompressed( ( unsigned char* ) output, sizeof(templateType) * 8, true ))
{
ReverseBytes(output, (unsigned char*)&outTemplateVar, sizeof(templateType));
return true;
}
return false;
}
else
#endif
return ReadCompressed( ( unsigned char* ) & outTemplateVar, sizeof(templateType) * 8, true );
}
}
Definition at line 1678 of file BitStream.h.
References RakNet::RakString::DeserializeCompressed().
{
return outTemplateVar.DeserializeCompressed(this,false);
}
| [in] | outTemplateVar | The value to read |
Definition at line 1726 of file BitStream.h.
References Read().
{
return Read(outTemplateVar);
}
| bool RakNet::BitStream::ReadCompressedDelta | ( | templateType & | outTemplateVar | ) | [inline] |
If the written value differed from the value compared against in the write function, var will be updated. Otherwise it will retain the current value. the current value will be updated. For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte ReadCompressedDelta is only valid from a previous call to WriteDelta
| [in] | outTemplateVar | The value to read |
If the written value differed from the value compared against in the write function, var will be updated. Otherwise it will retain the current value. the current value will be updated. For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte ReadCompressedDelta is only valid from a previous call to WriteDelta
| [in] | outTemplateVar | The value to read |
Definition at line 1713 of file BitStream.h.
References Read(), and ReadCompressed().
Referenced by SerializeCompressedDelta().
{
bool dataWritten;
bool success;
success=Read(dataWritten);
if (dataWritten)
success=ReadCompressed(outTemplateVar);
return success;
}
| bool RakNet::BitStream::ReadDelta | ( | templateType & | outTemplateVar | ) | [inline] |
If the written value differed from the value compared against in the write function, var will be updated. Otherwise it will retain the current value. ReadDelta is only valid from a previous call to WriteDelta
| [in] | outTemplateVar | The value to read |
If the written value differed from the value compared against in the write function, var will be updated. Otherwise it will retain the current value. ReadDelta is only valid from a previous call to WriteDelta
| [in] | outTemplateVar | The value to read |
Definition at line 1575 of file BitStream.h.
References Read().
Referenced by SerializeDelta().
| [in] | outTemplateVar | The value to read |
Definition at line 1588 of file BitStream.h.
References Read().
{
return Read(outTemplateVar);
}
| [in] | outFloat | The float to read |
| [in] | floatMin | Predetermined minimum value of f |
| [in] | floatMax | Predetermined maximum value of f |
Referenced by ReadNormVector().
| bool RakNet::BitStream::ReadNormQuat | ( | templateType & | w, |
| templateType & | x, | ||
| templateType & | y, | ||
| templateType & | z | ||
| ) |
| [in] | w | w |
| [in] | x | x |
| [in] | y | y |
| [in] | z | z |
Definition at line 1943 of file BitStream.h.
References Read().
Referenced by ReadOrthMatrix(), and SerializeNormQuat().
{
bool cwNeg=false, cxNeg=false, cyNeg=false, czNeg=false;
unsigned short cx,cy,cz;
Read(cwNeg);
Read(cxNeg);
Read(cyNeg);
Read(czNeg);
Read(cx);
Read(cy);
if (!Read(cz))
return false;
// Calculate w from x,y,z
x=(templateType)(cx/65535.0);
y=(templateType)(cy/65535.0);
z=(templateType)(cz/65535.0);
if (cxNeg) x=-x;
if (cyNeg) y=-y;
if (czNeg) z=-z;
float difference = 1.0f - x*x - y*y - z*z;
if (difference < 0.0f)
difference=0.0f;
w = (templateType)(sqrt(difference));
if (cwNeg)
w=-w;
return true;
}
| bool RakNet::BitStream::ReadNormVector | ( | templateType & | x, |
| templateType & | y, | ||
| templateType & | z | ||
| ) |
Will further compress y or z axis aligned vectors. Accurate to 1/32767.5.
| [in] | x | x |
| [in] | y | y |
| [in] | z | z |
Definition at line 1893 of file BitStream.h.
References ReadFloat16().
Referenced by SerializeNormVector().
{
float xIn,yIn,zIn;
ReadFloat16(xIn,-1.0f,1.0f);
ReadFloat16(yIn,-1.0f,1.0f);
ReadFloat16(zIn,-1.0f,1.0f);
x=xIn;
y=yIn;
z=zIn;
return true;
}
| bool RakNet::BitStream::ReadOrthMatrix | ( | templateType & | m00, |
| templateType & | m01, | ||
| templateType & | m02, | ||
| templateType & | m10, | ||
| templateType & | m11, | ||
| templateType & | m12, | ||
| templateType & | m20, | ||
| templateType & | m21, | ||
| templateType & | m22 | ||
| ) |
Use 6 bytes instead of 36 Lossy, although the result is renormalized
Definition at line 1974 of file BitStream.h.
References ReadNormQuat().
Referenced by SerializeOrthMatrix().
{
float qw,qx,qy,qz;
if (!ReadNormQuat(qw,qx,qy,qz))
return false;
// Quat to orthogonal rotation matrix
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/index.htm
double sqw = (double)qw*(double)qw;
double sqx = (double)qx*(double)qx;
double sqy = (double)qy*(double)qy;
double sqz = (double)qz*(double)qz;
m00 = (templateType)(sqx - sqy - sqz + sqw); // since sqw + sqx + sqy + sqz =1
m11 = (templateType)(-sqx + sqy - sqz + sqw);
m22 = (templateType)(-sqx - sqy + sqz + sqw);
double tmp1 = (double)qx*(double)qy;
double tmp2 = (double)qz*(double)qw;
m10 = (templateType)(2.0 * (tmp1 + tmp2));
m01 = (templateType)(2.0 * (tmp1 - tmp2));
tmp1 = (double)qx*(double)qz;
tmp2 = (double)qy*(double)qw;
m20 =(templateType)(2.0 * (tmp1 - tmp2));
m02 = (templateType)(2.0 * (tmp1 + tmp2));
tmp1 = (double)qy*(double)qz;
tmp2 = (double)qx*(double)qw;
m21 = (templateType)(2.0 * (tmp1 + tmp2));
m12 = (templateType)(2.0 * (tmp1 - tmp2));
return true;
}
| bool RakNet::BitStream::ReadVector | ( | templateType & | x, |
| templateType & | y, | ||
| templateType & | z | ||
| ) |
Loses accuracy to about 3/10ths and only saves 2 bytes, so only use if accuracy is not important.
| [in] | x | x |
| [in] | y | y |
| [in] | z | z |
Definition at line 1906 of file BitStream.h.
References Read(), and ReadCompressed().
Referenced by SerializeVector().
{
float magnitude;
//unsigned short sx,sy,sz;
if (!Read(magnitude))
return false;
if (magnitude>0.00001f)
{
// Read(sx);
// Read(sy);
// if (!Read(sz))
// return false;
// x=((float)sx / 32767.5f - 1.0f) * magnitude;
// y=((float)sy / 32767.5f - 1.0f) * magnitude;
// z=((float)sz / 32767.5f - 1.0f) * magnitude;
float cx,cy,cz;
ReadCompressed(cx);
ReadCompressed(cy);
if (!ReadCompressed(cz))
return false;
x=cx;
y=cy;
z=cz;
x*=magnitude;
y*=magnitude;
z*=magnitude;
}
else
{
x=0.0;
y=0.0;
z=0.0;
}
return true;
}
| void RakNet::BitStream::Reset | ( | void | ) |
| void RakNet::BitStream::ResetReadPointer | ( | void | ) |
| void RakNet::BitStream::ResetWritePointer | ( | void | ) |
| static void RakNet::BitStream::ReverseBytes | ( | unsigned char * | inByteArray, |
| unsigned char * | inOutByteArray, | ||
| const unsigned int | length | ||
| ) | [static] |
Referenced by Read(), ReadCompressed(), Write(), WriteBitsFromIntegerRange(), WriteCompressed(), and WritePtr().
| static void RakNet::BitStream::ReverseBytesInPlace | ( | unsigned char * | inOutData, |
| const unsigned int | length | ||
| ) | [static] |
Referenced by ReadBitsFromIntegerRange().
| bool RakNet::BitStream::Serialize | ( | bool | writeToBitstream, |
| templateType & | inOutTemplateVar | ||
| ) | [inline] |
Undefine __BITSTREAM_NATIVE_END if you need endian swapping.
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | inOutTemplateVar | The value to write |
Definition at line 924 of file BitStream.h.
References Read(), and Write().
Referenced by Write(), and WriteCompressed().
| bool RakNet::BitStream::Serialize | ( | bool | writeToBitstream, |
| char * | inOutByteArray, | ||
| const unsigned int | numberOfBytes | ||
| ) | [inline] |
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | inOutByteArray | a byte buffer |
| [in] | numberOfBytes | the size of input in bytes |
Definition at line 983 of file BitStream.h.
| bool RakNet::BitStream::SerializeBits | ( | bool | writeToBitstream, |
| unsigned char * | inOutByteArray, | ||
| const BitSize_t | numberOfBitsToSerialize, | ||
| const bool | rightAlignedBits = true |
||
| ) | [inline] |
Right aligned data means in the case of a partial byte, the bits are aligned from the right (bit 0) rather than the left (as in the normal internal representation) You would set this to true when writing user data, and false when copying bitstream data, such as writing one bitstream to another
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | inOutByteArray | The data |
| [in] | numberOfBitsToSerialize | The number of bits to write |
| [in] | rightAlignedBits | if true data will be right aligned |
Definition at line 1058 of file BitStream.h.
References ReadBits(), and WriteBits().
| bool RakNet::BitStream::SerializeBitsFromIntegerRange | ( | bool | writeToBitstream, |
| templateType & | value, | ||
| const rangeType | minimum, | ||
| const rangeType | maximum, | ||
| bool | allowOutsideRange = false |
||
| ) |
Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range Then serialize only those bits
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | value | Integer value to write, which should be between minimum and maximum |
| [in] | minimum | Minimum value of value |
| [in] | maximum | Maximum value of value |
| [in] | allowOutsideRange | If true, all sends will take an extra bit, however value can deviate from outside minimum and maximum. If false, will assert if the value deviates |
Definition at line 1001 of file BitStream.h.
References BYTES_TO_BITS, and NumberOfLeadingZeroes().
{
static int requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum));
return SerializeBitsFromIntegerRange(writeToBitstream,value,minimum,maximum,requiredBits,allowOutsideRange);
}
| bool RakNet::BitStream::SerializeBitsFromIntegerRange | ( | bool | writeToBitstream, |
| templateType & | value, | ||
| const rangeType | minimum, | ||
| const rangeType | maximum, | ||
| const int | requiredBits, | ||
| bool | allowOutsideRange = false |
||
| ) |
| [in] | requiredBits | Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum |
Definition at line 1007 of file BitStream.h.
References ReadBitsFromIntegerRange(), and WriteBitsFromIntegerRange().
{
if (writeToBitstream) WriteBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);
else return ReadBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);
return true;
}
| bool RakNet::BitStream::SerializeCasted | ( | bool | writeToBitstream, |
| sourceType & | value | ||
| ) |
Serialize one type casted to another (smaller) type, to save bandwidth serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t Example: int num=53; SerializeCasted<uint8_t>(true, num); would use 1 byte to write what would otherwise be an integer (4 or 8 bytes)
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | value | The value to serialize |
Definition at line 993 of file BitStream.h.
| bool RakNet::BitStream::SerializeCompressed | ( | bool | writeToBitstream, |
| templateType & | inOutTemplateVar | ||
| ) | [inline] |
Undefine __BITSTREAM_NATIVE_END if you need endian swapping. If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | inOutTemplateVar | The value to write |
Definition at line 954 of file BitStream.h.
References ReadCompressed(), and WriteCompressed().
Referenced by WriteCompressed().
{
if (writeToBitstream)
WriteCompressed(inOutTemplateVar);
else
return ReadCompressed(inOutTemplateVar);
return true;
}
| bool RakNet::BitStream::SerializeCompressedDelta | ( | bool | writeToBitstream, |
| templateType & | inOutCurrentValue, | ||
| const templateType & | lastValue | ||
| ) | [inline] |
If the current value is different from the last value the current value will be written. Otherwise, a single bit will be written For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | inOutCurrentValue | The current value to write |
| [in] | lastValue | The last value to compare against. Only used if writeToBitstream is true. |
Definition at line 964 of file BitStream.h.
References ReadCompressedDelta(), and WriteCompressedDelta().
{
if (writeToBitstream)
WriteCompressedDelta(inOutCurrentValue,lastValue);
else
return ReadCompressedDelta(inOutCurrentValue);
return true;
}
| bool RakNet::BitStream::SerializeCompressedDelta | ( | bool | writeToBitstream, |
| templateType & | inOutTemplateVar | ||
| ) | [inline] |
Definition at line 974 of file BitStream.h.
References ReadCompressedDelta(), and WriteCompressedDelta().
{
if (writeToBitstream)
WriteCompressedDelta(inOutCurrentValue);
else
return ReadCompressedDelta(inOutCurrentValue);
return true;
}
| bool RakNet::BitStream::SerializeDelta | ( | bool | writeToBitstream, |
| templateType & | inOutCurrentValue, | ||
| const templateType & | lastValue | ||
| ) | [inline] |
If the current value is different from the last value the current value will be written. Otherwise, a single bit will be written
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | inOutCurrentValue | The current value to write |
| [in] | lastValue | The last value to compare against. Only used if writeToBitstream is true. |
Definition at line 934 of file BitStream.h.
References ReadDelta(), and WriteDelta().
{
if (writeToBitstream)
WriteDelta(inOutCurrentValue, lastValue);
else
return ReadDelta(inOutCurrentValue);
return true;
}
| bool RakNet::BitStream::SerializeDelta | ( | bool | writeToBitstream, |
| templateType & | inOutCurrentValue | ||
| ) | [inline] |
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | inOutCurrentValue | The current value to write |
Definition at line 944 of file BitStream.h.
References ReadDelta(), and WriteDelta().
{
if (writeToBitstream)
WriteDelta(inOutCurrentValue);
else
return ReadDelta(inOutCurrentValue);
return true;
}
| bool RakNet::BitStream::SerializeFloat16 | ( | bool | writeToBitstream, |
| float & | inOutFloat, | ||
| float | floatMin, | ||
| float | floatMax | ||
| ) |
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | inOutFloat | The float to write |
| [in] | floatMin | Predetermined minimum value of f |
| [in] | floatMax | Predetermined maximum value of f |
| bool RakNet::BitStream::SerializeNormQuat | ( | bool | writeToBitstream, |
| templateType & | w, | ||
| templateType & | x, | ||
| templateType & | y, | ||
| templateType & | z | ||
| ) | [inline] |
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | w | w |
| [in] | x | x |
| [in] | y | y |
| [in] | z | z |
Definition at line 1035 of file BitStream.h.
References ReadNormQuat(), and WriteNormQuat().
{
if (writeToBitstream)
WriteNormQuat(w,x,y,z);
else
return ReadNormQuat(w,x,y,z);
return true;
}
| bool RakNet::BitStream::SerializeNormVector | ( | bool | writeToBitstream, |
| templateType & | x, | ||
| templateType & | y, | ||
| templateType & | z | ||
| ) | [inline] |
Will further compress y or z axis aligned vectors. Accurate to 1/32767.5.
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | x | x |
| [in] | y | y |
| [in] | z | z |
Definition at line 1015 of file BitStream.h.
References ReadNormVector(), and WriteNormVector().
{
if (writeToBitstream)
WriteNormVector(x,y,z);
else
return ReadNormVector(x,y,z);
return true;
}
| bool RakNet::BitStream::SerializeOrthMatrix | ( | bool | writeToBitstream, |
| templateType & | m00, | ||
| templateType & | m01, | ||
| templateType & | m02, | ||
| templateType & | m10, | ||
| templateType & | m11, | ||
| templateType & | m12, | ||
| templateType & | m20, | ||
| templateType & | m21, | ||
| templateType & | m22 | ||
| ) | [inline] |
Use 6 bytes instead of 36 Lossy, although the result is renormalized
Definition at line 1045 of file BitStream.h.
References ReadOrthMatrix(), and WriteOrthMatrix().
{
if (writeToBitstream)
WriteOrthMatrix(m00,m01,m02,m10,m11,m12,m20,m21,m22);
else
return ReadOrthMatrix(m00,m01,m02,m10,m11,m12,m20,m21,m22);
return true;
}
| bool RakNet::BitStream::SerializeVector | ( | bool | writeToBitstream, |
| templateType & | x, | ||
| templateType & | y, | ||
| templateType & | z | ||
| ) | [inline] |
Loses accuracy to about 3/10ths and only saves 2 bytes, so only use if accuracy is not important.
| [in] | writeToBitstream | true to write from your data to this bitstream. False to read from this bitstream and write to your data |
| [in] | x | x |
| [in] | y | y |
| [in] | z | z |
Definition at line 1025 of file BitStream.h.
References ReadVector(), and WriteVector().
{
if (writeToBitstream)
WriteVector(x,y,z);
else
return ReadVector(x,y,z);
return true;
}
| void RakNet::BitStream::SetData | ( | unsigned char * | inByteArray | ) |
| void RakNet::BitStream::SetNumberOfBitsAllocated | ( | const BitSize_t | lengthInBits | ) |
| void RakNet::BitStream::SetReadOffset | ( | const BitSize_t | newReadOffset | ) | [inline] |
Definition at line 504 of file BitStream.h.
{readOffset=newReadOffset;}
| void RakNet::BitStream::SetWriteOffset | ( | const BitSize_t | offset | ) |
| [in] | offset | the offset from the start of the array. |
Dangerous if you don't know what you are doing! For efficiency reasons you can only write mid-stream if your data is byte aligned.
| void RakNet::BitStream::Write | ( | unsigned char *const & | inTemplateVar | ) | [inline] |
Definition at line 1211 of file BitStream.h.
References Write().
{
Write((const char*)inTemplateVar);
}
| void RakNet::BitStream::Write | ( | const templateType & | inTemplateVar | ) | [inline] |
Undefine __BITSTREAM_NATIVE_END if you need endian swapping.
| [in] | inTemplateVar | The value to write |
Definition at line 1068 of file BitStream.h.
References DoEndianSwap(), ReverseBytes(), and WriteBits().
Referenced by operator<<(), RakNet::operator<<(), SraNetwork::SraServerInfo::Serialize(), SraNetwork::SraPacket::Serialize(), SraNetwork::SendMessageToPlayerPacket::Serialize(), SraNetwork::SendMessageToChannelPacket::Serialize(), SraNetwork::ReplyPacket::Serialize(), SraNetwork::LoginReplyPacket::Serialize(), SraNetwork::LoginPacket::Serialize(), SraNetwork::LeaveChannelPacket::Serialize(), SraNetwork::JoinChannelPacket::Serialize(), SraNetwork::GetServerListPacket::Serialize(), SraNetwork::GetClientCharactersPacket::Serialize(), DataStructures::RangeList< range_type >::Serialize(), SraNetwork::ConnectToServerPacket::Serialize(), SraNetwork::ChatMessage::Serialize(), Serialize(), SraNetwork::BasicCharacterInfo::Serialize(), RakNet::VariableDeltaSerializer::SerializeVariable(), Write(), WriteBitsFromIntegerRange(), WriteCasted(), WriteCompressed(), WriteCompressedDelta(), WriteDelta(), WriteNormQuat(), RakNet::VariableListDeltaTracker::WriteVar(), RakNet::VariableListDeltaTracker::WriteVarToBitstream(), and WriteVector().
{
#ifdef _MSC_VER
#pragma warning(disable:4127) // conditional expression is constant
#endif
if (sizeof(inTemplateVar)==1)
WriteBits( ( unsigned char* ) & inTemplateVar, sizeof( templateType ) * 8, true );
else
{
#ifndef __BITSTREAM_NATIVE_END
if (DoEndianSwap())
{
unsigned char output[sizeof(templateType)];
ReverseBytes((unsigned char*)&inTemplateVar, output, sizeof(templateType));
WriteBits( ( unsigned char* ) output, sizeof(templateType) * 8, true );
}
else
#endif
WriteBits( ( unsigned char* ) & inTemplateVar, sizeof(templateType) * 8, true );
}
}
| void RakNet::BitStream::Write | ( | const RakString & | inTemplateVar | ) | [inline] |
| [in] | var | The value to write |
Definition at line 1181 of file BitStream.h.
References RakNet::RakString::Serialize().
{
inTemplateVar.Serialize(this);
}
| void RakNet::BitStream::Write | ( | const wchar_t *const | inStringVar | ) | [inline] |
Definition at line 659 of file BitStream.h.
{
RakWString::Serialize(inStringVar, this);
}
| void RakNet::BitStream::Write | ( | const unsigned char *const & | inTemplateVar | ) | [inline] |
Definition at line 1201 of file BitStream.h.
References Write().
{
Write((const char*)inTemplateVar);
}
| void RakNet::BitStream::Write | ( | const char * | inputByteArray, |
| const unsigned int | numberOfBytes | ||
| ) |
| [in] | inputByteArray | a byte buffer |
| [in] | numberOfBytes | the size of input in bytes |
| void RakNet::BitStream::Write | ( | const unsigned char *const | inTemplateVar | ) | [inline] |
Definition at line 663 of file BitStream.h.
{
Write((const char*)inTemplateVar);
}
| [in] | numberOfBits | bits to write |
| bitStream | the bitstream to copy from |
| void RakNet::BitStream::Write | ( | BitStream * | bitStream | ) |
| void RakNet::BitStream::Write | ( | const RakNetGUID & | inTemplateVar | ) | [inline] |
Definition at line 1173 of file BitStream.h.
References RakNet::RakNetGUID::g, and Write().
{
Write(inTemplateVar.g);
}
| void RakNet::BitStream::Write | ( | char *const & | inTemplateVar | ) | [inline] |
Definition at line 1206 of file BitStream.h.
References Write().
{
Write((const char*)inTemplateVar);
}
| void RakNet::BitStream::Write | ( | const char *const & | inStringVar | ) | [inline] |
Definition at line 1191 of file BitStream.h.
References Serialize().
{
RakString::Serialize(inStringVar, this);
}
| void RakNet::BitStream::Write | ( | const wchar_t *const & | inStringVar | ) | [inline] |
Definition at line 1196 of file BitStream.h.
References Serialize().
{
RakWString::Serialize(inStringVar, this);
}
| void RakNet::BitStream::Write | ( | const SystemAddress & | inTemplateVar | ) | [inline] |
| [in] | inTemplateVar | The value to write |
Definition at line 1128 of file BitStream.h.
References RakNet::SystemAddress::address, RakNet::SystemAddress::GetIPVersion(), RakNet::SystemAddress::GetPortNetworkOrder(), skilltest::var2, Write(), and WriteBits().
{
Write(inTemplateVar.GetIPVersion());
if (inTemplateVar.GetIPVersion()==4)
{
// Hide the address so routers don't modify it
SystemAddress var2=inTemplateVar;
uint32_t binaryAddress=~inTemplateVar.address.addr4.sin_addr.s_addr;
// Don't endian swap the address or port
WriteBits((unsigned char*)&binaryAddress, sizeof(binaryAddress)*8, true);
unsigned short p = var2.GetPortNetworkOrder();
WriteBits((unsigned char*)&p, sizeof(unsigned short)*8, true);
}
else
{
#if RAKNET_SUPPORT_IPV6==1
// Don't endian swap
WriteBits((const unsigned char*) &inTemplateVar.address.addr6, sizeof(inTemplateVar.address.addr6)*8, true);
#endif
}
}
| void RakNet::BitStream::Write | ( | const char *const | inStringVar | ) | [inline] |
Definition at line 655 of file BitStream.h.
References RakNet::RakString::Serialize().
{
RakString::Serialize(inStringVar, this);
}
| void RakNet::BitStream::Write | ( | const RakWString & | inTemplateVar | ) | [inline] |
Definition at line 1186 of file BitStream.h.
{
inTemplateVar.Serialize(this);
}
| void RakNet::BitStream::Write | ( | unsigned char *const | inTemplateVar | ) | [inline] |
Definition at line 671 of file BitStream.h.
{
Write((const char*)inTemplateVar);
}
| void RakNet::BitStream::Write | ( | BitStream & | bitStream | ) |
| void RakNet::BitStream::Write | ( | const uint24_t & | inTemplateVar | ) | [inline] |
Definition at line 1151 of file BitStream.h.
References AddBitsAndReallocate(), AlignWriteToByteBoundary(), data, IsBigEndian(), numberOfBitsUsed, and RakNet::uint24_t::val.
{
AlignWriteToByteBoundary();
AddBitsAndReallocate(3*8);
if (IsBigEndian()==false)
{
data[( numberOfBitsUsed >> 3 ) + 0] = ((char *)&inTemplateVar.val)[0];
data[( numberOfBitsUsed >> 3 ) + 1] = ((char *)&inTemplateVar.val)[1];
data[( numberOfBitsUsed >> 3 ) + 2] = ((char *)&inTemplateVar.val)[2];
}
else
{
data[( numberOfBitsUsed >> 3 ) + 0] = ((char *)&inTemplateVar.val)[3];
data[( numberOfBitsUsed >> 3 ) + 1] = ((char *)&inTemplateVar.val)[2];
data[( numberOfBitsUsed >> 3 ) + 2] = ((char *)&inTemplateVar.val)[1];
}
numberOfBitsUsed+=3*8;
}
| void RakNet::BitStream::Write | ( | const bool & | inTemplateVar | ) | [inline] |
| void RakNet::BitStream::Write | ( | char *const | inTemplateVar | ) | [inline] |
Definition at line 667 of file BitStream.h.
{
Write((const char*)inTemplateVar);
}
| void RakNet::BitStream::Write0 | ( | void | ) |
Referenced by Write().
| void RakNet::BitStream::Write1 | ( | void | ) |
Referenced by Write().
| void RakNet::BitStream::WriteAlignedBytes | ( | const unsigned char * | inByteArray, |
| const unsigned int | numberOfBytesToWrite | ||
| ) |
This is faster than WriteBits but wastes the bits to do the alignment and requires you to call ReadAlignedBits at the corresponding read position.
| [in] | inByteArray | The data |
| [in] | numberOfBytesToWrite | The size of input. |
| void RakNet::BitStream::WriteAlignedBytesSafe | ( | const char * | inByteArray, |
| const unsigned int | inputLength, | ||
| const unsigned int | maxBytesToWrite | ||
| ) |
| [in] | inByteArray | The data |
| [in] | inputLength | The size of input. |
| [in] | maxBytesToWrite | Max bytes to write |
| void RakNet::BitStream::WriteAlignedVar16 | ( | const char * | inByteArray | ) |
| void RakNet::BitStream::WriteAlignedVar32 | ( | const char * | inByteArray | ) |
| void RakNet::BitStream::WriteAlignedVar8 | ( | const char * | inByteArray | ) |
| void RakNet::BitStream::WriteBits | ( | const unsigned char * | inByteArray, |
| BitSize_t | numberOfBitsToWrite, | ||
| const bool | rightAlignedBits = true |
||
| ) |
Right aligned data means in the case of a partial byte, the bits are aligned from the right (bit 0) rather than the left (as in the normal internal representation) You would set this to true when writing user data, and false when copying bitstream data, such as writing one bitstream to another.
| [in] | inByteArray | The data |
| [in] | numberOfBitsToWrite | The number of bits to write |
| [in] | rightAlignedBits | if true data will be right aligned |
Referenced by SerializeBits(), Write(), WriteBitsFromIntegerRange(), and WritePtr().
| void RakNet::BitStream::WriteBitsFromIntegerRange | ( | const templateType | value, |
| const rangeType | minimum, | ||
| const rangeType | maximum, | ||
| bool | allowOutsideRange = false |
||
| ) |
Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range Then write only those bits
| [in] | value | Integer value to write, which should be between minimum and maximum |
| [in] | minimum | Minimum value of value |
| [in] | maximum | Maximum value of value |
| [in] | allowOutsideRange | If true, all sends will take an extra bit, however value can deviate from outside minimum and maximum. If false, will assert if the value deviates. This should match the corresponding value passed to Read(). |
Definition at line 1739 of file BitStream.h.
References BYTES_TO_BITS, and NumberOfLeadingZeroes().
Referenced by SerializeBitsFromIntegerRange().
{
static int requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum));
WriteBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);
}
| void RakNet::BitStream::WriteBitsFromIntegerRange | ( | const templateType | value, |
| const rangeType | minimum, | ||
| const rangeType | maximum, | ||
| const int | requiredBits, | ||
| bool | allowOutsideRange = false |
||
| ) |
| [in] | requiredBits | Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum |
Definition at line 1745 of file BitStream.h.
References IsBigEndian(), RakAssert, ReverseBytes(), Write(), and WriteBits().
{
RakAssert(maximum>=minimum);
RakAssert(allowOutsideRange==true || (value>=minimum && value<=maximum));
if (allowOutsideRange)
{
if (value<minimum || value>maximum)
{
Write(true);
Write(value);
return;
}
Write(false);
}
templateType valueOffMin=value-minimum;
if (IsBigEndian()==true)
{
unsigned char output[sizeof(templateType)];
ReverseBytes((unsigned char*)&valueOffMin, output, sizeof(templateType));
WriteBits(output,requiredBits);
}
else
{
WriteBits((unsigned char*) &valueOffMin,requiredBits);
}
}
| void RakNet::BitStream::WriteCasted | ( | const sourceType & | value | ) |
Write one type serialized as another (smaller) type, to save bandwidth serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t Example: int num=53; WriteCasted<uint8_t>(num); would use 1 byte to write what would otherwise be an integer (4 or 8 bytes)
| [in] | value | The value to write |
Definition at line 1732 of file BitStream.h.
References Write().
| void RakNet::BitStream::WriteCompressed | ( | const unsigned char *const & | inTemplateVar | ) | [inline] |
Definition at line 1360 of file BitStream.h.
References WriteCompressed().
{
WriteCompressed((const char*) inTemplateVar);
}
| void RakNet::BitStream::WriteCompressed | ( | const wchar_t *const | inStringVar | ) | [inline] |
Definition at line 679 of file BitStream.h.
{
RakWString::Serialize(inStringVar,this);
}
| void RakNet::BitStream::WriteCompressed | ( | const unsigned char *const | inTemplateVar | ) | [inline] |
Definition at line 683 of file BitStream.h.
{
WriteCompressed((const char*) inTemplateVar);
}
| void RakNet::BitStream::WriteCompressed | ( | const RakNetGUID & | inTemplateVar | ) | [inline] |
| void RakNet::BitStream::WriteCompressed | ( | const unsigned char * | inByteArray, |
| const unsigned int | size, | ||
| const bool | unsignedData | ||
| ) | [private] |
| void RakNet::BitStream::WriteCompressed | ( | const float & | inTemplateVar | ) | [inline] |
| void RakNet::BitStream::WriteCompressed | ( | unsigned char *const | inTemplateVar | ) | [inline] |
Definition at line 691 of file BitStream.h.
{
WriteCompressed((const char*) inTemplateVar);
}
| void RakNet::BitStream::WriteCompressed | ( | const RakString & | inTemplateVar | ) | [inline] |
Definition at line 1340 of file BitStream.h.
References RakNet::RakString::SerializeCompressed().
{
inTemplateVar.SerializeCompressed(this,0,false);
}
| void RakNet::BitStream::WriteCompressed | ( | const templateType & | inTemplateVar | ) | [inline] |
Undefine __BITSTREAM_NATIVE_END if you need endian swapping. If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type
| [in] | inTemplateVar | The value to write |
Undefine __BITSTREAM_NATIVE_END if you need endian swapping. For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte
| [in] | inTemplateVar | The value to write |
Definition at line 1262 of file BitStream.h.
References DoEndianSwap(), and ReverseBytes().
Referenced by SerializeCompressed(), WriteCompressed(), WriteCompressedDelta(), and WriteVector().
{
#ifdef _MSC_VER
#pragma warning(disable:4127) // conditional expression is constant
#endif
if (sizeof(inTemplateVar)==1)
WriteCompressed( ( unsigned char* ) & inTemplateVar, sizeof( templateType ) * 8, true );
else
{
#ifndef __BITSTREAM_NATIVE_END
#ifdef _MSC_VER
#pragma warning(disable:4244) // '=' : conversion from 'unsigned long' to 'unsigned short', possible loss of data
#endif
if (DoEndianSwap())
{
unsigned char output[sizeof(templateType)];
ReverseBytes((unsigned char*)&inTemplateVar, output, sizeof(templateType));
WriteCompressed( ( unsigned char* ) output, sizeof(templateType) * 8, true );
}
else
#endif
WriteCompressed( ( unsigned char* ) & inTemplateVar, sizeof(templateType) * 8, true );
}
}
| void RakNet::BitStream::WriteCompressed | ( | const wchar_t *const & | inStringVar | ) | [inline] |
Definition at line 1355 of file BitStream.h.
References Serialize().
{
RakWString::Serialize(inStringVar,this);
}
| void RakNet::BitStream::WriteCompressed | ( | const SystemAddress & | inTemplateVar | ) | [inline] |
| void RakNet::BitStream::WriteCompressed | ( | const char *const & | inStringVar | ) | [inline] |
Definition at line 1350 of file BitStream.h.
References SerializeCompressed().
{
RakString::SerializeCompressed(inStringVar,this,0,false);
}
| void RakNet::BitStream::WriteCompressed | ( | const char *const | inStringVar | ) | [inline] |
Definition at line 675 of file BitStream.h.
References RakNet::RakString::SerializeCompressed().
{
RakString::SerializeCompressed(inStringVar,this,0,false);
}
| void RakNet::BitStream::WriteCompressed | ( | const double & | inTemplateVar | ) | [inline] |
| void RakNet::BitStream::WriteCompressed | ( | const bool & | inTemplateVar | ) | [inline] |
| void RakNet::BitStream::WriteCompressed | ( | const RakWString & | inTemplateVar | ) | [inline] |
Definition at line 1345 of file BitStream.h.
{
inTemplateVar.Serialize(this);
}
| void RakNet::BitStream::WriteCompressed | ( | char *const & | inTemplateVar | ) | [inline] |
Definition at line 1365 of file BitStream.h.
References WriteCompressed().
{
WriteCompressed((const char*) inTemplateVar);
}
| void RakNet::BitStream::WriteCompressed | ( | char *const | inTemplateVar | ) | [inline] |
Definition at line 687 of file BitStream.h.
{
WriteCompressed((const char*) inTemplateVar);
}
| void RakNet::BitStream::WriteCompressed | ( | unsigned char *const & | inTemplateVar | ) | [inline] |
Definition at line 1370 of file BitStream.h.
References WriteCompressed().
{
WriteCompressed((const char*) inTemplateVar);
}
| void RakNet::BitStream::WriteCompressed | ( | const uint24_t & | var | ) | [inline] |
| void RakNet::BitStream::WriteCompressedDelta | ( | const templateType & | currentValue, |
| const templateType & | lastValue | ||
| ) | [inline] |
If the current value is different from the last value the current value will be written. Otherwise, a single bit will be written For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte
| [in] | currentValue | The current value to write |
| [in] | lastValue | The last value to compare against |
Definition at line 1385 of file BitStream.h.
References Write(), and WriteCompressed().
Referenced by SerializeCompressedDelta().
{
if (currentValue==lastValue)
{
Write(false);
}
else
{
Write(true);
WriteCompressed(currentValue);
}
}
| void RakNet::BitStream::WriteCompressedDelta | ( | const bool & | currentValue | ) | [inline] |
| void RakNet::BitStream::WriteCompressedDelta | ( | const bool & | currentValue, |
| const bool & | lastValue | ||
| ) | [inline] |
| [in] | currentValue | The current value to write |
| [in] | lastValue | The last value to compare against |
Definition at line 1402 of file BitStream.h.
References Write().
{
(void) lastValue;
Write(currentValue);
}
| void RakNet::BitStream::WriteCompressedDelta | ( | const templateType & | currentValue | ) | [inline] |
Definition at line 1412 of file BitStream.h.
References Write(), and WriteCompressed().
{
Write(true);
WriteCompressed(currentValue);
}
| void RakNet::BitStream::WriteDelta | ( | const templateType & | currentValue | ) | [inline] |
| [in] | currentValue | The current value to write |
Definition at line 1249 of file BitStream.h.
References Write().
| void RakNet::BitStream::WriteDelta | ( | const bool & | currentValue, |
| const bool & | lastValue | ||
| ) | [inline] |
| [in] | currentValue | The current value to write |
| [in] | lastValue | The last value to compare against |
Definition at line 1239 of file BitStream.h.
References Write().
{
(void) lastValue;
Write(currentValue);
}
| void RakNet::BitStream::WriteDelta | ( | const templateType & | currentValue, |
| const templateType & | lastValue | ||
| ) | [inline] |
If the current value is different from the last value the current value will be written. Otherwise, a single bit will be written
| [in] | currentValue | The current value to write |
| [in] | lastValue | The last value to compare against |
Definition at line 1222 of file BitStream.h.
References Write().
Referenced by SerializeDelta().
| [in] | x | The float to write |
| [in] | floatMin | Predetermined minimum value of f |
| [in] | floatMax | Predetermined maximum value of f |
Referenced by WriteNormVector().
| void RakNet::BitStream::WriteNormQuat | ( | templateType | w, |
| templateType | x, | ||
| templateType | y, | ||
| templateType | z | ||
| ) |
| [in] | w | w |
| [in] | x | x |
| [in] | y | y |
| [in] | z | z |
Definition at line 1801 of file BitStream.h.
References Write().
Referenced by SerializeNormQuat(), and WriteOrthMatrix().
| void RakNet::BitStream::WriteNormVector | ( | templateType | x, |
| templateType | y, | ||
| templateType | z | ||
| ) |
Will further compress y or z axis aligned vectors. Accurate to 1/32767.5.
| [in] | x | x |
| [in] | y | y |
| [in] | z | z |
Definition at line 1773 of file BitStream.h.
References RakAssert, and WriteFloat16().
Referenced by SerializeNormVector().
{
#ifdef _DEBUG
RakAssert(x <= 1.01 && y <= 1.01 && z <= 1.01 && x >= -1.01 && y >= -1.01 && z >= -1.01);
#endif
WriteFloat16((float)x,-1.0f,1.0f);
WriteFloat16((float)y,-1.0f,1.0f);
WriteFloat16((float)z,-1.0f,1.0f);
}
| void RakNet::BitStream::WriteOrthMatrix | ( | templateType | m00, |
| templateType | m01, | ||
| templateType | m02, | ||
| templateType | m10, | ||
| templateType | m11, | ||
| templateType | m12, | ||
| templateType | m20, | ||
| templateType | m21, | ||
| templateType | m22 | ||
| ) |
Use 6 bytes instead of 36 Lossy, although the result is renormalized
Definition at line 1814 of file BitStream.h.
References _copysign, and WriteNormQuat().
Referenced by SerializeOrthMatrix().
{
double qw;
double qx;
double qy;
double qz;
// Convert matrix to quat
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/
float sum;
sum = 1 + m00 + m11 + m22;
if (sum < 0.0f) sum=0.0f;
qw = sqrt( sum ) / 2;
sum = 1 + m00 - m11 - m22;
if (sum < 0.0f) sum=0.0f;
qx = sqrt( sum ) / 2;
sum = 1 - m00 + m11 - m22;
if (sum < 0.0f) sum=0.0f;
qy = sqrt( sum ) / 2;
sum = 1 - m00 - m11 + m22;
if (sum < 0.0f) sum=0.0f;
qz = sqrt( sum ) / 2;
if (qw < 0.0) qw=0.0;
if (qx < 0.0) qx=0.0;
if (qy < 0.0) qy=0.0;
if (qz < 0.0) qz=0.0;
qx = _copysign( (double) qx, (double) (m21 - m12) );
qy = _copysign( (double) qy, (double) (m02 - m20) );
qz = _copysign( (double) qz, (double) (m10 - m01) );
WriteNormQuat(qw,qx,qy,qz);
}
| void RakNet::BitStream::WritePtr | ( | templateType * | inTemplateVar | ) | [inline] |
Undefine __BITSTREAM_NATIVE_END if you need endian swapping.
| [in] | inTemplateVar | The value to write |
Definition at line 1091 of file BitStream.h.
References DoEndianSwap(), ReverseBytes(), and WriteBits().
{
#ifdef _MSC_VER
#pragma warning(disable:4127) // conditional expression is constant
#endif
if (sizeof(templateType)==1)
WriteBits( ( unsigned char* ) inTemplateVar, sizeof( templateType ) * 8, true );
else
{
#ifndef __BITSTREAM_NATIVE_END
if (DoEndianSwap())
{
unsigned char output[sizeof(templateType)];
ReverseBytes((unsigned char*) inTemplateVar, output, sizeof(templateType));
WriteBits( ( unsigned char* ) output, sizeof(templateType) * 8, true );
}
else
#endif
WriteBits( ( unsigned char* ) inTemplateVar, sizeof(templateType) * 8, true );
}
}
| void RakNet::BitStream::WriteVector | ( | templateType | x, |
| templateType | y, | ||
| templateType | z | ||
| ) |
Loses accuracy to about 3/10ths and only saves 2 bytes, so only use if accuracy is not important.
| [in] | x | x |
| [in] | y | y |
| [in] | z | z |
Definition at line 1785 of file BitStream.h.
References Write(), and WriteCompressed().
Referenced by SerializeVector().
{
templateType magnitude = sqrt(x * x + y * y + z * z);
Write((float)magnitude);
if (magnitude > 0.00001f)
{
WriteCompressed((float)(x/magnitude));
WriteCompressed((float)(y/magnitude));
WriteCompressed((float)(z/magnitude));
// Write((unsigned short)((x/magnitude+1.0f)*32767.5f));
// Write((unsigned short)((y/magnitude+1.0f)*32767.5f));
// Write((unsigned short)((z/magnitude+1.0f)*32767.5f));
}
}
bool RakNet::BitStream::copyData [private] |
Definition at line 917 of file BitStream.h.
unsigned char* RakNet::BitStream::data [private] |
Definition at line 914 of file BitStream.h.
Definition at line 910 of file BitStream.h.
BitSize_t RakNet::BitStream::numberOfBitsUsed [private] |
Definition at line 908 of file BitStream.h.
BitSize_t RakNet::BitStream::readOffset [private] |
Definition at line 912 of file BitStream.h.
Referenced by Read().
unsigned char RakNet::BitStream::stackData[256] [private] |
Definition at line 920 of file BitStream.h.
Copyright © 2007-2010 by The Shadowrun: Awakened Team. This work is licensed under the GNU Lesser General Public License 3.