diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /public/dt_utlvector_common.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'public/dt_utlvector_common.h')
| -rw-r--r-- | public/dt_utlvector_common.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/public/dt_utlvector_common.h b/public/dt_utlvector_common.h new file mode 100644 index 0000000..681ce04 --- /dev/null +++ b/public/dt_utlvector_common.h @@ -0,0 +1,85 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef DT_UTLVECTOR_COMMON_H +#define DT_UTLVECTOR_COMMON_H +#ifdef _WIN32 +#pragma once +#endif + + +#include "utlvector.h" + + +typedef void (*EnsureCapacityFn)( void *pVoid, int offsetToUtlVector, int len ); +typedef void (*ResizeUtlVectorFn)( void *pVoid, int offsetToUtlVector, int len ); + +template< class T > +void UtlVector_InitializeAllocatedElements( T *pBase, int count ) +{ + memset( reinterpret_cast<void*>( pBase ), 0, count * sizeof( T ) ); +} + +template< class T, class A > +class UtlVectorTemplate +{ +public: + static void ResizeUtlVector( void *pStruct, int offsetToUtlVector, int len ) + { + CUtlVector<T,A> *pVec = (CUtlVector<T,A>*)((char*)pStruct + offsetToUtlVector); + if ( pVec->Count() < len ) + pVec->AddMultipleToTail( len - pVec->Count() ); + else if ( pVec->Count() > len ) + pVec->RemoveMultiple( len, pVec->Count()-len ); + + // Ensure capacity + pVec->EnsureCapacity( len ); + + int nNumAllocated = pVec->NumAllocated(); + + // This is important to do because EnsureCapacity doesn't actually call the constructors + // on the elements, but we need them to be initialized, otherwise it'll have out-of-range + // values which will piss off the datatable encoder. + UtlVector_InitializeAllocatedElements( pVec->Base() + pVec->Count(), nNumAllocated - pVec->Count() ); + } + + static void EnsureCapacity( void *pStruct, int offsetToUtlVector, int len ) + { + CUtlVector<T,A> *pVec = (CUtlVector<T,A>*)((char*)pStruct + offsetToUtlVector); + + pVec->EnsureCapacity( len ); + + int nNumAllocated = pVec->NumAllocated(); + + // This is important to do because EnsureCapacity doesn't actually call the constructors + // on the elements, but we need them to be initialized, otherwise it'll have out-of-range + // values which will piss off the datatable encoder. + UtlVector_InitializeAllocatedElements( pVec->Base() + pVec->Count(), nNumAllocated - pVec->Count() ); + } +}; + +template< class T, class A > +inline ResizeUtlVectorFn GetResizeUtlVectorTemplate( CUtlVector<T,A> &vec ) +{ + return &UtlVectorTemplate<T,A>::ResizeUtlVector; +} + +template< class T, class A > +inline EnsureCapacityFn GetEnsureCapacityTemplate( CUtlVector<T,A> &vec ) +{ + return &UtlVectorTemplate<T,A>::EnsureCapacity; +} + + +// Format and allocate a string. +char* AllocateStringHelper( PRINTF_FORMAT_STRING const char *pFormat, ... ); + +// Allocates a string for a data table name. Data table names must be unique, so this will +// assert if you try to allocate a duplicate. +char* AllocateUniqueDataTableName( bool bSendTable, PRINTF_FORMAT_STRING const char *pFormat, ... ); + + +#endif // DT_UTLVECTOR_COMMON_H |