summaryrefslogtreecommitdiff
path: root/common/simplebitstring.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/simplebitstring.h')
-rw-r--r--common/simplebitstring.h159
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