Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= 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
|