Skip to content

Commit c0907e8

Browse files
committed
tier1: Use x86-64 lengths for bitbuf APIs
1 parent 6e615e4 commit c0907e8

File tree

2 files changed

+58
-60
lines changed

2 files changed

+58
-60
lines changed

public/tier1/bitbuf.h

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -169,32 +169,31 @@ class bf_write
169169
void SetDebugName( const char *pDebugName );
170170

171171

172-
// Seek to a specific position.
173172
public:
174-
173+
// Seek to a specific position.
175174
void SeekToBit( intp bitPos );
176175

177176

178177
// Bit functions.
179178
public:
180179

181-
void WriteOneBit(int nValue);
182-
void WriteOneBitNoCheck(int nValue);
180+
void WriteOneBit( int nValue );
181+
void WriteOneBitNoCheck( int nValue );
183182
void WriteOneBitAt( int iBit, int nValue );
184183

185184
// Write signed or unsigned. Range is only checked in debug.
186-
void WriteUBitLong( unsigned int data, int numbits, bool bCheckRange=true );
187-
void WriteSBitLong( int data, int numbits );
185+
void WriteUBitLong( uint32 data, int numbits, bool bCheckRange=true );
186+
void WriteSBitLong( int32 data, int numbits );
188187

189188
// Tell it whether or not the data is unsigned. If it's signed,
190189
// cast to unsigned before passing in (it will cast back inside).
191-
void WriteBitLong(unsigned int data, int numbits, bool bSigned);
190+
void WriteBitLong( uint32 data, int numbits, bool bSigned );
192191

193192
// Write a list of bits in.
194-
bool WriteBits(const void *pIn, int nBits);
193+
bool WriteBits( const void *pIn, intp nBits );
195194

196195
// writes an unsigned integer with variable bit length
197-
void WriteUBitVar( unsigned int data );
196+
void WriteUBitVar( uint32 data );
198197

199198
// writes a varint encoded integer
200199
void WriteVarInt32( uint32 data );
@@ -208,12 +207,12 @@ class bf_write
208207

209208
// Copy the bits straight out of pIn. This seeks pIn forward by nBits.
210209
// Returns an error if this buffer or the read buffer overflows.
211-
bool WriteBitsFromBuffer( class bf_read *pIn, int nBits );
210+
bool WriteBitsFromBuffer( class bf_read *pIn, intp nBits );
212211

213212
void WriteBitAngle( float fAngle, int numbits );
214-
void WriteBitCoord (const float f);
213+
void WriteBitCoord( const float f );
215214
void WriteBitCoordMP( const float f, bool bIntegral, bool bLowPrecision );
216-
void WriteBitFloat(float val);
215+
void WriteBitFloat( float val );
217216
void WriteBitVec3Coord( const Vector& fa );
218217
void WriteBitNormal( float f );
219218
void WriteBitVec3Normal( const Vector& fa );
@@ -232,7 +231,7 @@ class bf_write
232231
void WriteLongLong(int64 val);
233232
void WriteULongLong(uint64 val);
234233
void WriteFloat(float val);
235-
bool WriteBytes( const void *pBuf, int nBytes );
234+
bool WriteBytes( const void *pBuf, intp nBytes );
236235

237236
// Returns false if it overflows the buffer.
238237
bool WriteString(const char *pStr);
@@ -247,8 +246,8 @@ class bf_write
247246
[[nodiscard]] intp GetMaxNumBits() const;
248247
[[nodiscard]] intp GetNumBitsLeft() const;
249248
[[nodiscard]] intp GetNumBytesLeft() const;
250-
[[nodiscard]] unsigned char* GetData();
251-
[[nodiscard]] const unsigned char* GetData() const;
249+
[[nodiscard]] byte* GetData();
250+
[[nodiscard]] const byte* GetData() const;
252251

253252
// Has the buffer overflowed?
254253
[[nodiscard]] bool CheckForOverflow(intp nBits);
@@ -306,14 +305,14 @@ inline intp bf_write::GetNumBytesLeft() const
306305
return GetNumBitsLeft() >> 3;
307306
}
308307

309-
inline unsigned char* bf_write::GetData() //-V524
308+
inline byte* bf_write::GetData() //-V524
310309
{
311-
return (unsigned char*) m_pData;
310+
return (byte*) m_pData;
312311
}
313312

314-
inline const unsigned char* bf_write::GetData() const
313+
inline const byte* bf_write::GetData() const
315314
{
316-
return (unsigned char*) m_pData;
315+
return (byte*) m_pData;
317316
}
318317

319318
BITBUF_INLINE bool bf_write::CheckForOverflow(intp nBits)
@@ -391,7 +390,7 @@ inline void bf_write::WriteOneBitAt( int iBit, int nValue )
391390
#endif
392391
}
393392

394-
BITBUF_INLINE void bf_write::WriteUBitLong( unsigned int curData, int numbits, [[maybe_unused]] bool bCheckRange )
393+
BITBUF_INLINE void bf_write::WriteUBitLong( uint32 curData, int numbits, [[maybe_unused]] bool bCheckRange )
395394
{
396395
#ifdef _DEBUG
397396
// Make sure it doesn't overflow.
@@ -444,7 +443,7 @@ BITBUF_INLINE void bf_write::WriteUBitLong( unsigned int curData, int numbits, [
444443
}
445444

446445
// writes an unsigned integer with variable bit length
447-
BITBUF_INLINE void bf_write::WriteUBitVar( unsigned int data )
446+
BITBUF_INLINE void bf_write::WriteUBitVar( uint32 data )
448447
{
449448
/* Reference:
450449
if ( data < 0x10u )
@@ -544,7 +543,7 @@ class bf_read
544543
// Get the base pointer.
545544
[[nodiscard]] const unsigned char* GetBasePointer() const { return m_pData; }
546545

547-
[[nodiscard]] BITBUF_INLINE intp TotalBytesAvailable( void ) const
546+
[[nodiscard]] BITBUF_INLINE intp TotalBytesAvailable() const
548547
{
549548
return m_nDataBytes;
550549
}
@@ -554,23 +553,23 @@ class bf_read
554553
// Read a list of bits in, but don't overrun the destination buffer.
555554
// Returns the number of bits read into the buffer. The remaining
556555
// bits are skipped over.
557-
int ReadBitsClamped_ptr(void *pOut, size_t outSizeBytes, size_t nBits);
556+
intp ReadBitsClamped_ptr(void *pOut, intp outSizeBytes, intp nBits);
558557
// Helper 'safe' template function that infers the size of the destination
559558
// array. This version of the function should be preferred.
560559
// Usage: char databuffer[100];
561560
// ReadBitsClamped( dataBuffer, msg->m_nLength );
562-
template <typename T, size_t N>
563-
int ReadBitsClamped( T (&pOut)[N], size_t nBits )
561+
template <typename T, intp N>
562+
intp ReadBitsClamped( T (&pOut)[N], intp nBits )
564563
{
565564
return ReadBitsClamped_ptr( pOut, N * sizeof(T), nBits );
566565
}
567566

568567
[[nodiscard]] float ReadBitAngle( int numbits );
569568

570-
[[nodiscard]] unsigned int ReadUBitLong( int numbits );
571-
[[nodiscard]] unsigned int ReadUBitLongNoInline( int numbits );
572-
[[nodiscard]] unsigned int PeekUBitLong( int numbits );
573-
[[nodiscard]] int ReadSBitLong( int numbits );
569+
[[nodiscard]] uint32 ReadUBitLong( int numbits );
570+
[[nodiscard]] uint32 ReadUBitLongNoInline( int numbits );
571+
[[nodiscard]] uint32 PeekUBitLong( int numbits );
572+
[[nodiscard]] int32 ReadSBitLong( int numbits );
574573

575574
// reads an unsigned integer with variable bit length
576575
[[nodiscard]] unsigned int ReadUBitVar();
@@ -792,7 +791,7 @@ BITBUF_INLINE unsigned int bf_read::ReadUBitVar()
792791
return sixbits >> 2;
793792
}
794793

795-
BITBUF_INLINE unsigned int bf_read::ReadUBitLong( int numbits )
794+
BITBUF_INLINE uint32 bf_read::ReadUBitLong( int numbits )
796795
{
797796
Assert( numbits > 0 && numbits <= 32 );
798797

tier1/bitbuf.cpp

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -193,12 +193,12 @@ void bf_write::SeekToBit( intp bitPos )
193193

194194

195195
// Sign bit comes first
196-
void bf_write::WriteSBitLong( int data, int numbits )
196+
void bf_write::WriteSBitLong( int32 data, int numbits )
197197
{
198198
// Force the sign-extension bit to be correct even in the case of overflow.
199-
int nValue = data;
200-
int nPreserveBits = ( 0x7FFFFFFF >> ( static_cast<int>(CHAR_BIT * sizeof(int32)) - numbits ) );
201-
int nSignExtension = ( nValue >> 31 ) & ~nPreserveBits;
199+
int32 nValue = data;
200+
int32 nPreserveBits = ( 0x7FFFFFFF >> ( static_cast<int32>(CHAR_BIT * sizeof(int32)) - numbits ) );
201+
int32 nSignExtension = ( nValue >> 31 ) & ~nPreserveBits;
202202
nValue &= nPreserveBits;
203203
nValue |= nSignExtension;
204204

@@ -423,22 +423,22 @@ int bf_write::ByteSizeSignedVarInt64( int64 data )
423423
return ByteSizeVarInt64( bitbuf::ZigZagEncode64( data ) );
424424
}
425425

426-
void bf_write::WriteBitLong(unsigned int data, int numbits, bool bSigned)
426+
void bf_write::WriteBitLong(uint32 data, int numbits, bool bSigned)
427427
{
428428
if(bSigned)
429-
WriteSBitLong((int)data, numbits);
429+
WriteSBitLong((int32)data, numbits);
430430
else
431431
WriteUBitLong(data, numbits);
432432
}
433433

434-
bool bf_write::WriteBits(const void *pInData, int nBits)
434+
bool bf_write::WriteBits(const void *pInData, intp nBits)
435435
{
436436
#if defined( BB_PROFILING )
437437
VPROF( "bf_write::WriteBits" );
438438
#endif
439439

440-
unsigned char *pOut = (unsigned char*)pInData;
441-
int nBitsLeft = nBits;
440+
const auto *pOut = (const unsigned char*)pInData;
441+
intp nBitsLeft = nBits;
442442

443443
// Bounds checking..
444444
if ( (m_iCurBit+nBits) > m_nDataBits )
@@ -459,8 +459,8 @@ bool bf_write::WriteBits(const void *pInData, int nBits)
459459
if ( (nBitsLeft >= 32) && (m_iCurBit & 7) == 0 )
460460
{
461461
// current bit is byte aligned, do block copy
462-
int numbytes = nBitsLeft / CHAR_BIT;
463-
int numbits = numbytes * CHAR_BIT;
462+
intp numbytes = nBitsLeft / CHAR_BIT;
463+
intp numbits = numbytes * CHAR_BIT;
464464

465465
Q_memcpy( (char*)m_pData+(m_iCurBit>>3), pOut, numbytes );
466466
pOut += numbytes;
@@ -513,14 +513,14 @@ bool bf_write::WriteBits(const void *pInData, int nBits)
513513
// write remaining bits
514514
if ( nBitsLeft )
515515
{
516-
WriteUBitLong( *pOut, nBitsLeft, false );
516+
WriteUBitLong( *pOut, static_cast<int>(nBitsLeft), false );
517517
}
518518

519519
return !IsOverflowed();
520520
}
521521

522522

523-
bool bf_write::WriteBitsFromBuffer( bf_read *pIn, int nBits )
523+
bool bf_write::WriteBitsFromBuffer( bf_read *pIn, intp nBits )
524524
{
525525
constexpr int kUint32Bits = CHAR_BIT * sizeof(uint32);
526526

@@ -531,7 +531,7 @@ bool bf_write::WriteBitsFromBuffer( bf_read *pIn, int nBits )
531531
nBits -= kUint32Bits;
532532
}
533533

534-
WriteUBitLong( pIn->ReadUBitLong( nBits ), nBits );
534+
WriteUBitLong( pIn->ReadUBitLong( static_cast<int>(nBits) ), static_cast<int>(nBits) );
535535
return !IsOverflowed() && !pIn->IsOverflowed();
536536
}
537537

@@ -766,7 +766,7 @@ void bf_write::WriteFloat(float val)
766766
WriteBits(&val, sizeof(val) * CHAR_BIT);
767767
}
768768

769-
bool bf_write::WriteBytes( const void *pBuf, int nBytes )
769+
bool bf_write::WriteBytes( const void *pBuf, intp nBytes )
770770
{
771771
return WriteBits(pBuf, nBytes * CHAR_BIT);
772772
}
@@ -887,7 +887,7 @@ void bf_read::ReadBits(void *pOutData, intp nBits)
887887
#endif
888888

889889
uint8 *pOut = static_cast<uint8 *>(pOutData);
890-
int nBitsLeft = nBits;
890+
intp nBitsLeft = nBits;
891891

892892
// align output to dword boundary
893893
while( ((size_t)pOut & 3) != 0 && nBitsLeft >= CHAR_BIT )
@@ -919,23 +919,22 @@ void bf_read::ReadBits(void *pOutData, intp nBits)
919919
// read remaining bits
920920
if ( nBitsLeft )
921921
{
922-
*pOut = static_cast<uint8>(ReadUBitLong(nBitsLeft));
922+
*pOut = static_cast<uint8>(ReadUBitLong(static_cast<int>(nBitsLeft)));
923923
}
924-
925924
}
926925

927-
int bf_read::ReadBitsClamped_ptr(void *pOutData, size_t outSizeBytes, size_t nBits)
926+
intp bf_read::ReadBitsClamped_ptr(void *pOutData, intp outSizeBytes, intp nBits)
928927
{
929-
size_t outSizeBits = outSizeBytes * CHAR_BIT;
930-
size_t readSizeBits = nBits;
931-
int skippedBits = 0;
928+
intp outSizeBits = outSizeBytes * CHAR_BIT;
929+
intp readSizeBits = nBits;
930+
intp skippedBits = 0;
932931
if ( readSizeBits > outSizeBits )
933932
{
934933
// Should we print a message when we clamp the data being read? Only
935934
// in debug builds I think.
936935
AssertMsg( 0, "Oversized network packet received, and clamped." );
937936
readSizeBits = outSizeBits;
938-
skippedBits = (int)( nBits - outSizeBits );
937+
skippedBits = nBits - outSizeBits;
939938
// What should we do in this case, which should only happen if nBits
940939
// is negative for some reason?
941940
//if ( skippedBits < 0 )
@@ -946,7 +945,7 @@ int bf_read::ReadBitsClamped_ptr(void *pOutData, size_t outSizeBytes, size_t nBi
946945
SeekRelative( skippedBits );
947946

948947
// Return the number of bits actually read.
949-
return (int)readSizeBits;
948+
return readSizeBits;
950949
}
951950

952951
float bf_read::ReadBitAngle( int numbits )
@@ -959,15 +958,15 @@ float bf_read::ReadBitAngle( int numbits )
959958
return fReturn;
960959
}
961960

962-
unsigned int bf_read::PeekUBitLong( int numbits )
961+
uint32 bf_read::PeekUBitLong( int numbits )
963962
{
964963
#ifdef BIT_VERBOSE
965964
int nShifts = numbits;
966965
#endif
967966

968967
bf_read savebf = *this; // Save current state info
969968

970-
unsigned r = 0;
969+
uint32 r = 0;
971970
for(int i=0; i < numbits; i++)
972971
{
973972
int nBitValue = ReadOneBit();
@@ -988,7 +987,7 @@ unsigned int bf_read::PeekUBitLong( int numbits )
988987
return r;
989988
}
990989

991-
unsigned int bf_read::ReadUBitLongNoInline( int numbits )
990+
uint32 bf_read::ReadUBitLongNoInline( int numbits )
992991
{
993992
return ReadUBitLong( numbits );
994993
}
@@ -1002,10 +1001,10 @@ unsigned int bf_read::ReadUBitVarInternal( int encodingType )
10021001
}
10031002

10041003
// Append numbits least significant bits from data to the current bit stream
1005-
int bf_read::ReadSBitLong( int numbits )
1004+
int32 bf_read::ReadSBitLong( int numbits )
10061005
{
1007-
unsigned int r = ReadUBitLong(numbits);
1008-
unsigned int s = 1 << (numbits-1);
1006+
uint32 r = ReadUBitLong(numbits);
1007+
uint32 s = 1 << (numbits-1);
10091008
if (r >= s)
10101009
{
10111010
// sign-extend by removing sign bit and then subtracting sign bit again

0 commit comments

Comments
 (0)