diff --git a/amxmodx/datastructs.cpp b/amxmodx/datastructs.cpp index 420ca22113..b7ba95a4c2 100644 --- a/amxmodx/datastructs.cpp +++ b/amxmodx/datastructs.cpp @@ -35,31 +35,25 @@ static cell AMX_NATIVE_CALL ArrayCreate(AMX* amx, cell* params) return -1; } + if (reserved < 0) + { + reserved = 0; + } + // Scan through the vector list to see if any are NULL. // NULL means the vector was previously destroyed. for (unsigned int i=0; i < VectorHolder.length(); ++i) { if (VectorHolder[i]==NULL) { - VectorHolder[i] = new CellArray(cellsize); - - if (reserved > 0) - { - VectorHolder[i]->resize(reserved); - } - + VectorHolder[i] = new CellArray(cellsize, reserved); return i + 1; } } // None are NULL, create a new vector - CellArray* NewVector = new CellArray(cellsize); + CellArray* NewVector = new CellArray(cellsize, reserved); - if (reserved > 0) - { - NewVector->resize(reserved); - } - VectorHolder.append(NewVector); return VectorHolder.length(); diff --git a/amxmodx/datastructs.h b/amxmodx/datastructs.h index d72bb147a7..90ce018d0c 100644 --- a/amxmodx/datastructs.h +++ b/amxmodx/datastructs.h @@ -15,7 +15,7 @@ class CellArray { public: - CellArray(size_t blocksize) : m_Data(NULL), m_BlockSize(blocksize), m_AllocSize(0), m_Size(0) + CellArray(size_t blocksize, size_t basesize = 0) : m_Data(NULL), m_BlockSize(blocksize), m_AllocSize(0), m_BaseSize(basesize > 0 ? basesize : 8), m_Size(0) { } @@ -160,7 +160,7 @@ class CellArray /* Set a base allocation size of 8 items */ if (!m_AllocSize) { - m_AllocSize = 8; + m_AllocSize = m_BaseSize; } /* If it's not enough, keep doubling */ while (m_Size + count > m_AllocSize) @@ -181,6 +181,7 @@ class CellArray cell *m_Data; size_t m_BlockSize; size_t m_AllocSize; + size_t m_BaseSize; size_t m_Size; };