/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS HTTP Daemon * FILE: list.cpp * PURPOSE: A doubly linked list implementation * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) * REVISIONS: * CSH 01/09/2000 Created * NOTES: The linked list does it's own heap management for * better performance * TODO: - InsertBefore(), InsertAfter(), Move() */ #include #include // **************************** CListNode **************************** HANDLE CListNode::hHeap = NULL; INT CListNode::nRef = 0; // Default constructor CListNode::CListNode() { Element = NULL; Next = NULL; Prev = NULL; } // Constructor with element and next as starter values CListNode::CListNode(PVOID element, CListNode *next, CListNode *prev) { Element = element; Next = next; Prev = prev; } void* CListNode::operator new(/*size_t*/ UINT size) { PVOID p; if (hHeap == NULL) { SYSTEM_INFO inf; GetSystemInfo(&inf); hHeap = HeapCreate(0, inf.dwAllocationGranularity, 0); } if ((p = HeapAlloc(hHeap, 0, size)) != NULL) nRef++; return p; } VOID CListNode::operator delete(void* p) { if (HeapFree(hHeap, 0, p) != FALSE) nRef--; if (nRef == 0) { HeapDestroy(hHeap); hHeap = NULL; } } // Set element VOID CListNode::SetElement(PVOID element) { Element = element; } // Set pointer to next node in list VOID CListNode::SetNext(CListNode *next) { Next = next; } // Set pointer to previous node in list VOID CListNode::SetPrev(CListNode *prev) { Prev = prev; } // Get element of node PVOID CListNode::GetElement() { return Element; } // Get pointer to next node in list CListNode *CListNode::GetNext() { return Next; } // Get pointer to previous node in list CListNode *CListNode::GetPrev() { return Prev; }