Leaked source code of windows server 2003
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.
|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
priolist.hxx
Abstract:
Contains Prioritized serialized list class definitions
Author:
Richard L Firth (rfirth) 03-May-1997
Revision History:
03-May-1997 rfirth Created
--*/
//
// classes
//
//
// CPriorityListEntry - prioritized list entry
//
class CPriorityListEntry {
public:
LIST_ENTRY m_ListEntry;
private:
LONG m_lPriority;
public:
CPriorityListEntry(LONG lPriority) { #if INET_DEBUG
m_ListEntry.Flink = m_ListEntry.Blink = NULL; #endif
m_lPriority = lPriority; }
~CPriorityListEntry() {
INET_ASSERT((m_ListEntry.Flink == NULL) && (m_ListEntry.Blink == NULL));
}
PLIST_ENTRY List(VOID) { return &m_ListEntry; }
PLIST_ENTRY Next(VOID) { return m_ListEntry.Flink; }
PLIST_ENTRY Prev(VOID) { return m_ListEntry.Blink; }
LONG GetPriority(VOID) const { return m_lPriority; }
VOID SetPriority(LONG lPriority) { m_lPriority = lPriority; }
VOID Remove(VOID) { RemoveEntryList(&m_ListEntry); #if INET_DEBUG
m_ListEntry.Flink = m_ListEntry.Blink = NULL; #endif
} };
//
// CPriorityList - maintains serialized list of CPriorityListEntry's
//
class CPriorityList {
private:
SERIALIZED_LIST m_List;
public:
CPriorityList() { InitializeSerializedList(&m_List); }
~CPriorityList() { TerminateSerializedList(&m_List); }
LPSERIALIZED_LIST List(VOID) { return &m_List; }
PLIST_ENTRY Self(VOID) { return (PLIST_ENTRY)&m_List.List.Flink; }
PLIST_ENTRY Head(VOID) { return m_List.List.Flink; }
BOOL Acquire(VOID) { return LockSerializedList(&m_List); }
VOID Release(VOID) { UnlockSerializedList(&m_List); }
BOOL IsEmpty(VOID) { return IsSerializedListEmpty(&m_List); }
LONG Count(VOID) { return ElementsOnSerializedList(&m_List); }
DWORD Insert( IN CPriorityListEntry * pEntry, IN LONG lPriority ) { pEntry->SetPriority(lPriority); return Insert(pEntry); }
DWORD Insert( IN CPriorityListEntry * pEntry );
DWORD Remove( IN CPriorityListEntry * pEntry );
CPriorityListEntry * RemoveHead(VOID) { return (CPriorityListEntry * )SlDequeueHead(&m_List); } };
template <class TData> class CTList { protected:
struct CTListItem { struct CTListItem *_pNext; TData _Data; CTListItem(const TData &data, CTListItem *pNext) : _Data(data), _pNext(pNext){} };
ULONG _nItems; struct CTListItem *_pHead; struct CTListItem *_pTail;
public: CTList() { _nItems = 0; _pHead = NULL; _pTail = NULL; }
ULONG GetCount() { return _nItems; }
BOOL AddAtHead(TData Data) { struct CTListItem *pNewItem = New CTListItem(Data, _pHead);
if (pNewItem) { _pHead = pNewItem; if (_nItems == 0) _pTail = _pHead; ++_nItems; return TRUE; } return FALSE; }
BOOL AddToTail(TData Data) { struct CTListItem *pNewItem = New CTListItem(Data, NULL);
if (pNewItem) { if (_pTail) { _pTail->_pNext = pNewItem; } else { _pHead = pNewItem; } _pTail = pNewItem; ++_nItems; return TRUE; } return FALSE; } BOOL DequeueHead(TData *pData) { if (_pHead && pData) { struct CTListItem *pItem = _pHead; *pData = _pHead->_Data; _pHead = _pHead->_pNext; if (--_nItems == 0) _pTail = NULL; delete pItem; return TRUE; } else { return FALSE; } }
VOID RemoveAll() { struct CTListItem *pItem = _pHead;
while (pItem) { pItem = _pHead->_pNext; delete _pHead; _pHead = pItem; } _pTail = NULL; _nItems = 0; } ~CTList() { RemoveAll(); } };
|