//+--------------------------------------------------------------------------- // // 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 #include #include template 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 List::List () { m_head = NULL; m_dwNodeCount = 0; } template List::~List () { RemoveAll(); } template HRESULT List::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 HRESULT List::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 HRESULT List::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 HRESULT List::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 VOID List::RemoveAll (VOID) { Node *temp; for (; m_dwNodeCount; --m_dwNodeCount) { temp = m_head; m_head = m_head->next; delete temp; } return; } template HRESULT List::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 HRESULT List::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 DWORD List::ListCount (VOID) { return m_dwNodeCount; } #endif