#ifndef _INC_DSKQUOTA_DYNARRAY_H #define _INC_DSKQUOTA_DYNARRAY_H /////////////////////////////////////////////////////////////////////////////// /* File: dynarray.h Description: Wrapper classes around the DPA_xxxxxxx and DSA_xxxxxx functions provided by the common control's library. The classes add value by providing multi-threaded protection, iterators and automatic cleanup semantics. Revision History: Date Description Programmer -------- --------------------------------------------------- ---------- 06/14/96 Initial creation. BrianAu 09/03/96 Added exception handling. BrianAu */ /////////////////////////////////////////////////////////////////////////////// #ifndef _WINDOWS_ # include #endif #ifndef _INC_COMMCTRL # include #endif #ifndef _INC_COMCTRLP # include #endif #ifndef _INC_DSKQUOTA_EXCEPT_H # include "except.h" #endif /////////////////////////////////////////////////////////////////////////////// // CONTAINER EXCEPTIONS /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // POINTER LIST /////////////////////////////////////////////////////////////////////////////// class PointerList { private: HDPA m_hdpa; CRITICAL_SECTION m_cs; public: PointerList(INT cItemGrow = 0); virtual ~PointerList(void); UINT Count(void); VOID Insert(LPVOID pvItem, UINT index); VOID Insert(LPVOID pvItem) { Insert(pvItem, 0); } VOID Append(LPVOID pvItem, UINT index) { Insert(pvItem, index + 1); } VOID Append(LPVOID pvItem); BOOL Remove(LPVOID *ppvItem, UINT index); BOOL RemoveFirst(LPVOID *ppvItem) { return Remove(ppvItem, 0); } BOOL RemoveLast(LPVOID *ppvItem); BOOL Retrieve(LPVOID *ppvItem, UINT index); BOOL RetrieveFirst(LPVOID *ppvItem) { return Retrieve(ppvItem, 0); } BOOL RetrieveLast(LPVOID *ppvItem); BOOL Replace(LPVOID pvItem, UINT index); BOOL FindIndex(LPVOID pvItem, INT *pIndex); BOOL Sort(PFNDPACOMPARE pfnCompare, LPARAM lParam); BOOL Search(LPVOID pvKey, PFNDPACOMPARE pfnCompare, UINT uOptions = 0, INT iStart = 0, LPARAM lParam = 0); void Lock(void) { EnterCriticalSection(&m_cs); } void ReleaseLock(void) { LeaveCriticalSection(&m_cs); } friend class PointerListIterator; friend class AutoLock; }; /////////////////////////////////////////////////////////////////////////////// // POINTER LIST ITERATOR /////////////////////////////////////////////////////////////////////////////// class PointerListIterator { private: PointerList *m_pList; // Pointer to list being iterated. INT m_Index; // "Current" signed index into list. HRESULT Advance(LPVOID *ppvOut, BOOL bForward); public: enum { EndOfList = -1 }; PointerListIterator(PointerList& List) : m_pList(&List), m_Index(0) { } PointerListIterator(const PointerListIterator& rhs) : m_pList(rhs.m_pList), m_Index(rhs.m_Index) { } PointerListIterator& operator = (const PointerListIterator& rhs); HRESULT Next(LPVOID *ppvOut) { return Advance(ppvOut, TRUE); } HRESULT Prev(LPVOID *ppvOut) { return Advance(ppvOut, FALSE); } BOOL AtFirst(void) { return m_Index == 0; } BOOL AtLast(void) { return m_Index >= (INT)m_pList->Count() - 1; } void GotoFirst(void) { m_Index = 0; } void GotoLast(void) { m_Index = m_pList->Count() - 1; } void LockList(void) { m_pList->Lock(); } void ReleaseListLock(void) { m_pList->ReleaseLock(); } }; /////////////////////////////////////////////////////////////////////////////// // POINTER QUEUE /////////////////////////////////////////////////////////////////////////////// class PointerQueue : public PointerList { public: virtual ~PointerQueue(void) { } VOID Add(LPVOID pvItem) { PointerList::Append(pvItem); } BOOL Remove(LPVOID *ppvItem) { return PointerList::RemoveFirst(ppvItem); } }; /////////////////////////////////////////////////////////////////////////////// // STRUCTURE LIST // /////////////////////////////////////////////////////////////////////////////// class StructureList { private: HDSA m_hdsa; CRITICAL_SECTION m_cs; public: StructureList(INT cbItem, INT cItemGrow); virtual ~StructureList(void); UINT Count(void); VOID Insert(LPVOID pvItem, UINT index); VOID Insert(LPVOID pvItem) { Insert(pvItem, 0); } VOID Append(LPVOID pvItem, UINT index) { Insert(pvItem, index + 1); } VOID Append(LPVOID pvItem); BOOL Remove(LPVOID pvItem, UINT index); BOOL RemoveFirst(LPVOID pvItem) { return Remove(pvItem, 0); } BOOL RemoveLast(LPVOID pvItem); BOOL Retrieve(LPVOID pvItem, UINT index); BOOL RetrieveFirst(LPVOID pvItem) { return Retrieve(pvItem, 0); } BOOL RetrieveLast(LPVOID pvItem); BOOL Replace(LPVOID pvItem, UINT index); VOID Clear(VOID); void Lock(void) { EnterCriticalSection(&m_cs); } void ReleaseLock(void) { LeaveCriticalSection(&m_cs); } friend class StructureListIterator; friend class AutoLock; }; /////////////////////////////////////////////////////////////////////////////// // STRUCTURE LIST ITERATOR /////////////////////////////////////////////////////////////////////////////// class StructureListIterator { private: StructureList *m_pList; // Pointer to list being iterated. INT m_Index; // "Current" signed index into list. HRESULT Advance(LPVOID *ppvOut, BOOL bForward); public: enum { EndOfList = -1 }; StructureListIterator(StructureList& List) : m_pList(&List), m_Index(0) { } StructureListIterator(const StructureListIterator& rhs) : m_pList(rhs.m_pList), m_Index(rhs.m_Index) { } StructureListIterator& operator = (const StructureListIterator& rhs); HRESULT Next(LPVOID *ppvOut) { return Advance(ppvOut, TRUE); } HRESULT Prev(LPVOID *ppvOut) { return Advance(ppvOut, FALSE); } BOOL AtFirst(void) { return m_Index == 0; } BOOL AtLast(void) { return m_Index >= (INT)m_pList->Count() - 1; } void GotoFirst(void) { m_Index = 0; } void GotoLast(void) { m_Index = m_pList->Count() - 1; } void LockList(void) { m_pList->Lock(); } void ReleaseListLock(void) { m_pList->ReleaseLock(); } }; /////////////////////////////////////////////////////////////////////////////// // STRUCTURE QUEUE /////////////////////////////////////////////////////////////////////////////// class StructureQueue : public StructureList { public: StructureQueue(INT cbItem, INT cItemGrow) : StructureList(cbItem, cItemGrow) { } virtual ~StructureQueue(void) { } VOID Add(LPVOID pvItem) { StructureList::Append(pvItem); } BOOL Remove(LPVOID pvItem) { return StructureList::RemoveFirst(pvItem); } }; #endif // _INC_DSKQUOTA_DYNARRAY_H