diff options
Diffstat (limited to 'common/simplebitstring.h')
| -rw-r--r-- | common/simplebitstring.h | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/common/simplebitstring.h b/common/simplebitstring.h new file mode 100644 index 0000000..7d42d67 --- /dev/null +++ b/common/simplebitstring.h @@ -0,0 +1,159 @@ + +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// The copyright to the contents herein is the property of Valve, L.L.C. +// The contents may be used and/or copied only with the written permission of +// Valve, L.L.C., or in accordance with the terms and conditions stipulated in +// the agreement/contract under which the contents have been supplied. +// +//***************************************************************************** +// +// Contents: +// +// CSimpleBitString +// +// Authors: +// +// Target restrictions: +// +// Tool restrictions: +// +// Things to do: +// +// +// +//***************************************************************************** + +#ifndef INCLUDED_COMMON_SIMPLEBITSTRING_H +#define INCLUDED_COMMON_SIMPLEBITSTRING_H + +#if defined(_MSC_VER) && (_MSC_VER > 1000) +#pragma once +#endif + + +//***************************************************************************** +// +// Include files required by this header. +// +// Note: Do NOT place any 'using' directives or declarations in header files - +// put them at the top of the source files that require them. +// Use fully-qualified names in header files. +// +//***************************************************************************** + +// All precompiled headers (Stable.h) include this first to give use a common +// place for including order-dependent library headers (things that need to go first). + + + + + +class CSimpleBitString +{ +public: + explicit CSimpleBitString( uint32 ReserveNumBits = 0 ) + : + m_uNumBits( 0 ), + m_vecU8() + { + m_vecU8.EnsureCapacity( (ReserveNumBits / 8) + 1 ); + m_vecU8[ m_vecU8.AddToTail() ] = 0x00; // always need 1 byte + } + + void clear() + { + m_uNumBits = 0; + m_vecU8.RemoveAll(); + m_vecU8[ m_vecU8.AddToTail() ] = 0x00; // always need 1 byte + } + + void AppendBits( uint64 data, uint32 NumSignificantLowBitsOfData ); + void AppendBits( const uint8 * pData, uint32 NumBitsOfData ); + + void ReversiblyObfusticateBitsFromStart( uint32 NumBits, const uint8 * pObfusticationData, size_t uSizeOfObfusticationData ); + uint8 GetByteChecksumFromStart( uint32 NumBits ) const; + + uint GetCurrNumBits() const + { + return m_uNumBits; + } + + const uint8 * data() const + { + return & m_vecU8[0]; + } + + size_t size() const + { + return m_vecU8.Count(); + } + +private: + uint32 m_uNumBits; + CUtlVector<uint8> m_vecU8; + +public: + + // Iterator class for retrieving bits + class iterator + { + public: + explicit iterator( const CSimpleBitString & bs ) + : + m_rSimpleBitString( bs ), + m_uNextBitIdx( 0 ) + { + } + + void ResetToStart() + { + m_uNextBitIdx = 0; + } + + uint32 GetNumConsumedBits() const + { + return m_uNextBitIdx; + } + + uint32 GetNumRemainingBits() const + { + return m_rSimpleBitString.m_uNumBits - m_uNextBitIdx; + } + + uint32 GetNextBits( uint32 NumBitsToGet ); + uint64 GetNextBits64( uint32 NumBitsToGet ); + + void SkipNextBits( uint32 NumBitsToSkip ) + { + if ( m_uNextBitIdx + NumBitsToSkip > m_rSimpleBitString.m_uNumBits ) + { + AssertMsg( false, "Not enough bits in CSimpleBitString" ); + NumBitsToSkip = 0; + } + + m_uNextBitIdx += NumBitsToSkip; + } + + bool operator ==( const iterator & other ) const + { + return (& m_rSimpleBitString == & other.m_rSimpleBitString) + && m_uNextBitIdx == other.m_uNextBitIdx; + } + + void DoAssertClassInvariant() const; + + private: + const CSimpleBitString & m_rSimpleBitString; //lint !e1725 reference + uint32 m_uNextBitIdx; + }; + + friend class iterator; + +}; + + + + + +#endif |