Merge pull request #107 from Arkshine/Fix-array-compatibility-issue

Fix a compatibility issue with the "reserved" parameter.
This commit is contained in:
Vincent Herbet 2014-08-07 21:38:51 +02:00
commit a7d94a4859
2 changed files with 10 additions and 15 deletions

View File

@ -35,31 +35,25 @@ static cell AMX_NATIVE_CALL ArrayCreate(AMX* amx, cell* params)
return -1; return -1;
} }
if (reserved < 0)
{
reserved = 0;
}
// Scan through the vector list to see if any are NULL. // Scan through the vector list to see if any are NULL.
// NULL means the vector was previously destroyed. // NULL means the vector was previously destroyed.
for (unsigned int i=0; i < VectorHolder.length(); ++i) for (unsigned int i=0; i < VectorHolder.length(); ++i)
{ {
if (VectorHolder[i]==NULL) if (VectorHolder[i]==NULL)
{ {
VectorHolder[i] = new CellArray(cellsize); VectorHolder[i] = new CellArray(cellsize, reserved);
if (reserved > 0)
{
VectorHolder[i]->resize(reserved);
}
return i + 1; return i + 1;
} }
} }
// None are NULL, create a new vector // 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); VectorHolder.append(NewVector);
return VectorHolder.length(); return VectorHolder.length();

View File

@ -15,7 +15,7 @@
class CellArray class CellArray
{ {
public: 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 @@ private:
/* Set a base allocation size of 8 items */ /* Set a base allocation size of 8 items */
if (!m_AllocSize) if (!m_AllocSize)
{ {
m_AllocSize = 8; m_AllocSize = m_BaseSize;
} }
/* If it's not enough, keep doubling */ /* If it's not enough, keep doubling */
while (m_Size + count > m_AllocSize) while (m_Size + count > m_AllocSize)
@ -181,6 +181,7 @@ private:
cell *m_Data; cell *m_Data;
size_t m_BlockSize; size_t m_BlockSize;
size_t m_AllocSize; size_t m_AllocSize;
size_t m_BaseSize;
size_t m_Size; size_t m_Size;
}; };