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.
 
 
 
 
 
 

102 lines
2.3 KiB

//
// ptrary.h
//
// CPtrArray -- growable pointer array
//
#ifndef PTRARY_H
#define PTRARY_H
#include "private.h"
class CVoidPtrArray
{
public:
CVoidPtrArray()
{
_cElems = 0;
_rgpv = NULL;
_iSize = 0;
}
virtual ~CVoidPtrArray() { cicMemFree(_rgpv); }
inline void Set(int iIndex, void *pv)
{
Assert(iIndex >= 0);
Assert(iIndex < _cElems);
_rgpv[iIndex] = pv;
}
inline void *Get(int iIndex) { return *GetPtr(iIndex); }
inline void **GetPtr(int iIndex)
{
Assert(iIndex >= 0);
Assert(iIndex <= _cElems); // there's code that uses the first invalid offset for loop termination
return &_rgpv[iIndex];
}
BOOL Insert(int iIndex, int cElems);
void Remove(int iIndex, int cElems);
int Move(int iIndexNew, int iIndexOld);
void **Append(int cElems)
{
return Insert(Count(), cElems) ? GetPtr(Count()-cElems) : NULL;
}
void SetCount(int cElems)
{
Assert(cElems >= 0);
Assert(cElems <= _iSize);
_cElems = cElems;
}
int Count() { return _cElems; }
void Clear() { cicMemFree(_rgpv); _rgpv = NULL; _cElems = _iSize = 0; }
void CompactSize(int iSizeNew)
{
void **ppv;
Assert(iSizeNew <= _iSize);
Assert(_cElems <= iSizeNew);
if (iSizeNew == _iSize) // MemReAlloc will actually re-alloc! Don't let it.
return;
if ((ppv = (void **)cicMemReAlloc(_rgpv, iSizeNew*sizeof(void *))) != NULL)
{
_rgpv = ppv;
_iSize = iSizeNew;
}
}
void CompactSize() { CompactSize(_cElems); }
private:
void **_rgpv; // the array
int _cElems; // num eles in the array
int _iSize; // actual size (in void *'s) of the array
};
//
// typesafe version
//
template<class T>
class CPtrArray : public CVoidPtrArray
{
public:
CPtrArray() {}
void Set(int iIndex, T *pT) { CVoidPtrArray::Set(iIndex, pT); }
T *Get(int iIndex) { return (T *)CVoidPtrArray::Get(iIndex); }
T **GetPtr(int iIndex) { return (T **)CVoidPtrArray::GetPtr(iIndex); }
T **Append(int cElems) { return (T **)CVoidPtrArray::Append(cElems); }
};
#endif // PTRARY_H