You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
3.4 KiB
159 lines
3.4 KiB
|
|
//========= 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
|
|
|