Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

241 lines
4.4 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992-2001.
//
// File: LIST . H
//
// Contents:
//
// Notes: List manipulation functions.
//
//----------------------------------------------------------------------------
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
template<class X, class Y> class List {
struct Node {
X item;
Y key;
Node *next;
};
Node *m_head;
DWORD m_dwNodeCount;
public:
List ();
virtual ~List();
HRESULT Insert (X item,
Y key);
HRESULT Remove (X *item);
HRESULT RemoveThis (X item);
HRESULT RemoveByKey (Y key,
X *item);
VOID RemoveAll(VOID);
HRESULT Find (DWORD dwIndex,
X *item);
HRESULT FindByKey (Y key,
X *item);
DWORD ListCount (VOID);
};
template<class X, class Y> List<X, Y>::List ()
{
m_head = NULL;
m_dwNodeCount = 0;
}
template<class X, class Y> List<X, Y>::~List ()
{
RemoveAll();
}
template<class X, class Y> HRESULT List<X, Y>::Insert (X item,
Y key)
{
Node *pNewNode;
pNewNode = new Node;
if ( pNewNode ) {
pNewNode->item = item;
pNewNode->key = key;
pNewNode->next = NULL;
if ( m_dwNodeCount ) {
pNewNode->next = m_head;
}
m_head = pNewNode;
m_dwNodeCount++;
}
return ( pNewNode ) ? S_OK : HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
}
template<class X, class Y> HRESULT List<X, Y>::Remove (X *item)
{
Node *temp;
if ( m_dwNodeCount == 0 ) {
return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
}
*item = m_head->item;
temp = m_head;
m_head = m_head->next;
delete temp;
m_dwNodeCount--;
return S_OK;
}
template<class X, class Y> HRESULT List<X, Y>::RemoveThis (X item)
{
Node *temp;
Node *nodeToFind;
if ( m_dwNodeCount == 0 ) {
return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
}
if ( m_head->item == item ) {
nodeToFind = m_head;
m_head = m_head->next;
}
else {
for (temp = m_head; temp->next && (temp->next->item != item); ) {
temp = temp->next;
}
if ( temp->next ) {
nodeToFind = temp->next;
temp->next = temp->next->next;
}
else
nodeToFind = NULL;
}
if ( nodeToFind ) {
delete nodeToFind;
m_dwNodeCount--;
return S_OK;
}
else
return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
}
template<class X, class Y> HRESULT List<X, Y>::RemoveByKey (Y key,
X *item)
{
Node *temp;
Node *nodeToFind;
if ( m_dwNodeCount == 0 ) {
return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
}
if ( m_head->key == key ) {
nodeToFind = m_head;
m_head = m_head->next;
}
else {
for (temp = m_head; temp->next && (temp->next->key != key); ) {
temp = temp->next;
}
if ( temp->next ) {
nodeToFind = temp->next;
temp->next = temp->next->next;
}
else
nodeToFind = NULL;
}
if ( nodeToFind ) {
*item = nodeToFind->item;
delete nodeToFind;
m_dwNodeCount--;
return S_OK;
}
else
return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
}
template<class X, class Y> VOID List<X, Y>::RemoveAll (VOID)
{
Node *temp;
for (; m_dwNodeCount; --m_dwNodeCount) {
temp = m_head;
m_head = m_head->next;
delete temp;
}
return;
}
template<class X, class Y> HRESULT List<X, Y>::Find (DWORD dwIndex,
X *item)
{
Node *temp;
DWORD i;
if ( (m_dwNodeCount == 0) || (dwIndex > m_dwNodeCount) ) {
return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
}
for (i=0, temp = m_head; i < dwIndex; ++i) {
temp = temp->next;
}
*item = temp->item;
return S_OK;
}
template<class X, class Y> HRESULT List<X, Y>::FindByKey (Y key,
X *item)
{
Node *temp;
for (temp = m_head; temp && (temp->key != key); )
temp = temp->next;
if ( temp ) {
*item = temp->item;
return S_OK;
}
else {
return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
}
}
template<class X, class Y> DWORD List<X, Y>::ListCount (VOID)
{
return m_dwNodeCount;
}
#endif