windows-nt/Source/XPSP1/NT/shell/inc/dpa.h
2020-09-26 16:20:57 +08:00

212 lines
6.6 KiB
C++

#ifndef GUARD_D70787804D9C11d28784F6E920524153
#define GUARD_D70787804D9C11d28784F6E920524153
#include "comctrlp.h"
// The Ex versions of EnumCallback, DestroyCallback, Sort, Search, etc.
// do stricter type checking to make sure that the reference data /
// parameter matches both on the calling side and the callback side.
template <class T> class CDPA
{
public:
// Typedefs
typedef int (CALLBACK *_PFNDPAENUMCALLBACK)(T *p, void *pData);
typedef int (CALLBACK *_PFNDPACOMPARE)(T *p1, T *p2, LPARAM lParam);
// Functions
CDPA(HDPA hdpa = NULL) {m_hdpa = hdpa;}
BOOL IsDPASet() {return m_hdpa != NULL; }
void Attach(const HDPA hdpa) {m_hdpa = hdpa;}
HDPA Detach() {HDPA hdpa = m_hdpa; m_hdpa = NULL; return hdpa;}
operator HDPA () { return m_hdpa; }
BOOL Create(int cItemGrow)
{return (m_hdpa = DPA_Create(cItemGrow)) != NULL;}
BOOL CreateEx(int cpGrow, HANDLE hheap)
{return (m_hdpa = DPA_CreateEx(cpGrow, hheap)) != NULL;}
BOOL Destroy()
{BOOL fRet = DPA_Destroy(m_hdpa); m_hdpa = NULL; return fRet;}
HDPA Clone(HDPA hdpaNew)
{return DPA_Clone(m_hdpa, hdpaNew);}
T* GetPtr(INT_PTR i)
{return (T*) DPA_GetPtr(m_hdpa, i);}
int GetPtrIndex(T* p)
{return DPA_GetPtrIndex(m_hdpa, (void *) p);}
BOOL Grow(int cp)
{return DPA_Grow(m_hdpa, cp);}
BOOL SetPtr(int i, T* p)
{return DPA_SetPtr(m_hdpa, i, (void *) p);}
int InsertPtr(int i, T* p)
{return DPA_InsertPtr(m_hdpa, i, (void *) p);}
T* DeletePtr(int i)
{return (T*) DPA_DeletePtr(m_hdpa, i);}
BOOL DeleteAllPtrs()
{return DPA_DeleteAllPtrs(m_hdpa);}
void EnumCallback(_PFNDPAENUMCALLBACK pfnCB, void *pData)
{DPA_EnumCallback(m_hdpa, (PFNDPAENUMCALLBACK)pfnCB, pData);}
template<class T2>
void EnumCallbackEx(int (CALLBACK *pfnCB)(T* p, T2 pData), T2 pData)
{EnumCallback((_PFNDPAENUMCALLBACK)pfnCB, reinterpret_cast<void *>(pData));}
void DestroyCallback(_PFNDPAENUMCALLBACK pfnCB, void *pData)
{DPA_DestroyCallback(m_hdpa, (PFNDPAENUMCALLBACK)pfnCB, pData); m_hdpa = NULL;}
template<class T2>
void DestroyCallbackEx(int (CALLBACK *pfnCB)(T* p, T2 pData), T2 pData)
{DestroyCallback((_PFNDPAENUMCALLBACK)pfnCB, reinterpret_cast<void *>(pData));}
int GetPtrCount()
{return DPA_GetPtrCount(m_hdpa);}
T* GetPtrPtr()
{return (T*)DPA_GetPtrPtr(m_hdpa);}
T*& FastGetPtr(int i)
{return (T*&)DPA_FastGetPtr(m_hdpa, i);}
int AppendPtr(T* pitem)
{return DPA_AppendPtr(m_hdpa, (void *) pitem);}
#ifdef __IStream_INTERFACE_DEFINED__
HRESULT LoadStream(PFNDPASTREAM pfn, IStream * pstream, void *pvInstData)
{return DPA_LoadStream(&m_hdpa, pfn, pstream, pvInstData);}
HRESULT SaveStream(PFNDPASTREAM pfn, IStream * pstream, void *pvInstData)
{return DPA_SaveStream(m_hdpa, pfn, pstream, pvInstData);}
#endif
BOOL Sort(_PFNDPACOMPARE pfnCompare, LPARAM lParam)
{return DPA_Sort(m_hdpa, (PFNDPACOMPARE)pfnCompare, lParam);}
template<class T2>
BOOL SortEx(int (CALLBACK *pfnCompare)(T *p1, T *p2, T2 lParam), T2 lParam)
{return Sort((_PFNDPACOMPARE)pfnCompare, reinterpret_cast<LPARAM>(lParam));}
// Merge not supported through this object; use DPA_Merge
int Search(T* pFind, int iStart, _PFNDPACOMPARE pfnCompare,
LPARAM lParam, UINT options)
{return DPA_Search(m_hdpa, (void *) pFind, iStart, (PFNDPACOMPARE)pfnCompare, lParam, options);}
template<class T2>
int SearchEx(T* pFind, int iStart,
int (CALLBACK *pfnCompare)(T *p1, T *p2, T2 lParam),
T2 lParam, UINT options)
{return Search(pFind, iStart, (_PFNDPACOMPARE)pfnCompare, reinterpret_cast<LPARAM>(lParam), options);}
int SortedInsertPtr(T* pFind, int iStart, _PFNDPACOMPARE pfnCompare,
LPARAM lParam, UINT options, T* pitem)
{return DPA_SortedInsertPtr(m_hdpa, (void *) pFind, iStart, (PFNDPACOMPARE)pfnCompare, lParam, options, (void *) pitem);}
template<class T2>
int SortedInsertPtrEx(T* pFind, int iStart,
int (CALLBACK *pfnCompare)(T *p1, T *p2, T2 lParam),
T2 lParam, UINT options, T* pitem)
{return SortedInsertPtr(pFind, iStart, (_PFNDPACOMPARE)pfnCompare,
reinterpret_cast<LPARAM>(lParam), options, pitem);}
private:
HDPA m_hdpa;
};
template <class T> class CDSA
{
public:
// Typedefs
typedef int (CALLBACK *_PFNDSAENUMCALLBACK)(T *p, void *pData);
typedef int (CALLBACK *_PFNDSACOMPARE)(T *p1, T *p2, LPARAM lParam);
// Functions
CDSA(HDSA hdsa = NULL) {m_hdsa = hdsa;}
void Attach(const HDSA hdsa) {m_hdsa = hdsa;}
HDSA Detach() { HDSA hdsa = m_hdsa; m_hdsa = NULL; return hdsa; }
operator HDSA () { return m_hdsa; }
BOOL Create(int cItemGrow)
{return (m_hdsa = DSA_Create(sizeof(T), cItemGrow)) != NULL;}
BOOL Destroy()
{BOOL fRet = DSA_Destroy(m_hdsa); m_hdsa = NULL; return fRet;}
BOOL GetItem(int i, T* pitem)
{return DSA_GetItem(m_hdsa, i, (void *)pitem);}
T* GetItemPtr(int i)
{return (T*)DSA_GetItemPtr(m_hdsa, i);}
BOOL SetItem(int i, T* pitem)
{return DSA_SetItem(m_hdsa, i, (void *)pitem);}
int InsertItem(int i, T* pitem)
{return DSA_InsertItem(m_hdsa, i, (void *)pitem);}
virtual BOOL DeleteItem(int i)
{return DSA_DeleteItem(m_hdsa, i);}
virtual BOOL DeleteAllItems()
{return DSA_DeleteAllItems(m_hdsa);}
void EnumCallback(_PFNDSAENUMCALLBACK pfnCB, void *pData)
{DSA_EnumCallback(m_hdsa, (PFNDSAENUMCALLBACK)pfnCB, pData);}
template<class T2>
void EnumCallbackEx(int (CALLBACK *pfnCB)(T *p, T2 pData), T2 pData)
{EnumCallback((_PFNDSAENUMCALLBACK)pfnCB, reinterpret_cast<void *>(pData));}
void DestroyCallback(_PFNDSAENUMCALLBACK pfnCB, void *pData)
{DSA_DestroyCallback(m_hdsa, (PFNDSAENUMCALLBACK)pfnCB, pData); m_hdsa = NULL;}
template<class T2>
void DestroyCallbackEx(int (CALLBACK *pfnCB)(T *p, T2 pData), T2 pData)
{DestroyCallback((_PFNDSAENUMCALLBACK)pfnCB, reinterpret_cast<void *>(pData));}
int GetItemCount()
{return DSA_GetItemCount(m_hdsa);}
int AppendItem(T* pitem)
{return DSA_AppendItem(m_hdsa, (void *)pitem);}
private:
HDSA m_hdsa;
};
template <class T>
CDSA<T>* CDSA_Create(int cItemGrow)
{
CDSA<T> *pdsa = new CDSA<T>();
if (pdsa)
{
if (!pdsa->Create(cItemGrow))
{
delete pdsa;
pdsa = NULL;
}
}
return pdsa;
}
#endif // !GUARD_D70787804D9C11d28784F6E920524153