212 lines
6.6 KiB
C
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
|