//========= 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 void UtlVector_InitializeAllocatedElements(T *pBase, int count) { memset(reinterpret_cast(pBase), 0, count * sizeof(T)); } template class UtlVectorTemplate { public: static void ResizeUtlVector(void *pStruct, int offsetToUtlVector, int len) { CUtlVector *pVec = (CUtlVector *)((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 *pVec = (CUtlVector *)((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 inline ResizeUtlVectorFn GetResizeUtlVectorTemplate(CUtlVector &vec) { return &UtlVectorTemplate::ResizeUtlVector; } template inline EnsureCapacityFn GetEnsureCapacityTemplate(CUtlVector &vec) { return &UtlVectorTemplate::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