Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//
// strary.cpp
//
// CStructArray
//
#include "private.h"
#include "strary.h"
#include "mem.h"
#define StrPB(x) (_pb + ((x) * _iElemSize))
//+---------------------------------------------------------------------------
//
// Insert(int iIndex, int cElems)
//
// Grows the array to accomodate cElems at offset iIndex.
//
// The new cells are NOT initialized!
//
//----------------------------------------------------------------------------
BOOL CVoidStructArray::Insert(int iIndex, int cElems) { BYTE *pb; int iSizeNew;
Assert(iIndex >= 0); Assert(iIndex <= _cElems); Assert(cElems > 0);
// allocate space if necessary
if (_iSize < _cElems + cElems) { // allocate 1.5x what we need to avoid future allocs
iSizeNew = max(_cElems + cElems, _cElems + _cElems / 2);
if ((pb = (_pb == NULL) ? (BYTE *)cicMemAlloc(iSizeNew*_iElemSize) : (BYTE *)cicMemReAlloc(_pb, iSizeNew* _iElemSize)) == NULL) { return FALSE; }
_pb = pb; _iSize = iSizeNew; }
if (iIndex < _cElems) { // make room for the new addition
memmove(StrPB(iIndex + cElems), StrPB(iIndex), (_cElems - iIndex)*_iElemSize); #ifdef DEBUG
memset(StrPB(iIndex), 0xFE, cElems * _iElemSize); #endif
}
_cElems += cElems; Assert(_iSize >= _cElems);
return TRUE; }
//+---------------------------------------------------------------------------
//
// Remove(int Index, int cElems)
//
// Removes cElems at offset iIndex.
//
//----------------------------------------------------------------------------
void CVoidStructArray::Remove(int iIndex, int cElems) { BYTE *pb; int iSizeNew;
Assert(cElems > 0); Assert(iIndex >= 0); Assert(iIndex + cElems <= _cElems);
if (iIndex + cElems < _cElems) { // shift following eles left
memmove(StrPB(iIndex), StrPB(iIndex + cElems), (_cElems - iIndex - cElems) * _iElemSize); #ifdef DEBUG
memset(StrPB(_cElems - cElems), 0xFE, cElems * _iElemSize); #endif
}
_cElems -= cElems;
// free mem when array contents uses less than half alloc'd mem
iSizeNew = _iSize / 2; if (iSizeNew > _cElems) { if ((pb = (BYTE *)cicMemReAlloc(_pb, iSizeNew * _iElemSize)) != NULL) { _pb = pb; _iSize = iSizeNew; } } }
|