mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
7.9 KiB
273 lines
7.9 KiB
#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 <windows.h>
|
|
#endif
|
|
#ifndef _INC_COMMCTRL
|
|
# include <commctrl.h>
|
|
#endif
|
|
#ifndef _INC_COMCTRLP
|
|
# include <comctrlp.h>
|
|
#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
|