windows-nt/Source/XPSP1/NT/net/rras/cm/cmmon/arrayptr.h
2020-09-26 16:20:57 +08:00

107 lines
2.8 KiB
C++

//+----------------------------------------------------------------------------
//
// File: ArrayPtr.h
//
// Module: CMMON32.EXE
//
// Synopsis: Implement class CPtrArray, a array of void*, which grows dynamicly
// This class is exactly the same as the one defined by MFC.
// Help on the class also comes with vc help
//
// Copyright (c) 1998-1999 Microsoft Corporation
//
// Author: fengsun Created 2/17/98
//
//+----------------------------------------------------------------------------
#ifndef ARRAYPTR_H
#define ARRAYPTR_H
#include "windows.h"
#include "CmDebug.h"
class CPtrArray
{
public:
// Construction
CPtrArray();
~CPtrArray();
// Attributes
int GetSize() const;
int GetUpperBound() const;
void SetSize(int nNewSize, int nGrowBy = -1);
// Operations
// Clean up
void FreeExtra();
void RemoveAll();
// Accessing elements
void* GetAt(int nIndex) const;
void SetAt(int nIndex, void* newElement);
void*& ElementAt(int nIndex);
// Direct Access to the element data (may return NULL)
const void** GetData() const;
void** GetData();
// Potentially growing the array
void SetAtGrow(int nIndex, void* newElement);
int Add(void* newElement);
int Append(const CPtrArray& src);
void Copy(const CPtrArray& src);
// overloaded operator helpers
void* operator[](int nIndex) const;
void*& operator[](int nIndex);
// Operations that move elements around
void InsertAt(int nIndex, void* newElement, int nCount = 1);
void RemoveAt(int nIndex, int nCount = 1);
void InsertAt(int nStartIndex, CPtrArray* pNewArray);
// Implementation
protected:
void** m_pData; // the actual array of data
int m_nSize; // # of elements (upperBound - 1)
int m_nMaxSize; // max allocated
int m_nGrowBy; // grow amount
public:
#ifdef DEBUG
void AssertValid() const; //assert this is valid, for debugging
#endif
};
inline int CPtrArray::GetSize() const
{ return m_nSize; }
inline int CPtrArray::GetUpperBound() const
{ return m_nSize-1; }
inline void CPtrArray::RemoveAll()
{ SetSize(0); }
inline void* CPtrArray::GetAt(int nIndex) const
{ MYDBGASSERT(nIndex >= 0 && nIndex < m_nSize);
return m_pData[nIndex]; }
inline void CPtrArray::SetAt(int nIndex, void* newElement)
{ MYDBGASSERT(nIndex >= 0 && nIndex < m_nSize);
m_pData[nIndex] = newElement; }
inline void*& CPtrArray::ElementAt(int nIndex)
{ MYDBGASSERT(nIndex >= 0 && nIndex < m_nSize);
return m_pData[nIndex]; }
inline int CPtrArray::Add(void* newElement)
{ int nIndex = m_nSize;
SetAtGrow(nIndex, newElement);
return nIndex; }
inline void* CPtrArray::operator[](int nIndex) const
{ return GetAt(nIndex); }
inline void*& CPtrArray::operator[](int nIndex)
{ return ElementAt(nIndex); }
#endif