windows-nt/Source/XPSP1/NT/admin/pchealth/client/include/pfarray.h
2020-09-26 16:20:57 +08:00

126 lines
2.8 KiB
C++

/********************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name:
PFArray.cpp
Abstract:
dynamic array table definition.
Revision History:
DerekM created 03/14/00
********************************************************************/
#ifndef PFARRAY_H
#define PFARRAY_H
#include "util.h"
typedef void (*pfnPFArrayDelete)(LPVOID pv);
typedef LPVOID (*pfnPFArrayAllocCopy)(LPVOID pv);
/////////////////////////////////////////////////////////////////////////////
// CPFArray definition
class CPFArrayBase : public CPFPrivHeapGenericClassBase
{
protected:
// member data
pfnPFArrayAllocCopy m_pfnAlloc;
pfnPFArrayDelete m_pfnDelete;
LPVOID *m_rgpv;
DWORD m_cSlots;
DWORD m_iHighest;
// internal methods
virtual void DeleteItem(LPVOID pv)
{
if (m_pfnDelete != NULL && pv != NULL)
(*m_pfnDelete)(pv);
}
virtual LPVOID AllocItemCopy(LPVOID pv)
{
return (m_pfnAlloc != NULL && pv != NULL) ? ((*m_pfnAlloc)(pv)) : NULL;
}
HRESULT CompressArray(DWORD iStart, DWORD iEnd);
HRESULT Grow(DWORD iMinLast);
HRESULT internalCopyFrom(CPFArrayBase *rg);
public:
// construction
CPFArrayBase(void);
virtual ~CPFArrayBase(void);
// exposed methods
void SetDeleteMethod(pfnPFArrayDelete pfnDelete) { m_pfnDelete = pfnDelete; }
void SetAllocMethod(pfnPFArrayAllocCopy pfnAlloc) { m_pfnAlloc = pfnAlloc; }
LPVOID &operator [](DWORD index);
HRESULT Init(DWORD cSlots);
DWORD get_Highest(void) { return m_iHighest; }
HRESULT Append(LPVOID pv);
HRESULT Remove(DWORD iItem, LPVOID *ppvOld = NULL);
HRESULT RemoveAll(void);
HRESULT get_Item(DWORD iItem, LPVOID *ppv);
HRESULT put_Item(DWORD iItem, LPVOID pv, LPVOID *ppvOld = NULL);
};
/////////////////////////////////////////////////////////////////////////////
// CPFArrayBSTR definition
class CPFArrayBSTR : public CPFArrayBase
{
private:
void DeleteItem(LPVOID pv)
{
SysFreeString((BSTR)pv);
}
LPVOID AllocItemCopy(LPVOID pv)
{
return (pv != NULL) ? ((LPVOID)SysAllocString((BSTR)pv)) : NULL;
}
public:
HRESULT CopyFrom(CPFArrayBSTR *prg)
{
return internalCopyFrom(prg);
}
};
/////////////////////////////////////////////////////////////////////////////
// CPFArrayUnk definition
class CPFArrayUnknown : public CPFArrayBase
{
private:
void DeleteItem(LPVOID pv)
{
if (pv != NULL)
((LPUNKNOWN)pv)->Release();
}
LPVOID AllocItemCopy(LPVOID pv)
{
if (pv != NULL)
((LPUNKNOWN)pv)->AddRef();
return pv;
}
public:
HRESULT CopyFrom(CPFArrayUnknown *prg)
{
return internalCopyFrom(prg);
}
};
#endif