mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-20 20:46:03 +08:00
Update from SDK 2013
This commit is contained in:

committed by
Nicholas Hastings

parent
6d5c024820
commit
94b660e16e
159
common/simplebitstring.h
Normal file
159
common/simplebitstring.h
Normal file
@ -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
|
Reference in New Issue
Block a user