#ifndef _SLIST_H #define _SLIST_H ////////////////////////////////////////////////////////////////////// // // slist.h: template for the SingleList class. // ////////////////////////////////////////////////////////////////////// #include "csem.h" #include "sitem.h" template class CSingleList : public CCriticalSection { public: CSingleList( void ); ~CSingleList( void ); BOOL Insert ( T); BOOL Delete ( T); virtual T Find (T ); private: CSingleItem m_Dummy; }; ////////////////////////////////////////////////////////////////////// // Template for CSIngleList ////////////////////////////////////////////////////////////////////// template CSingleList::CSingleList(void) :m_Dummy () { } template CSingleList::~CSingleList(void) { CSingleItem *pItem = m_Dummy.GetNext(); CSingleItem *pNext; while (pItem) { pNext = pItem->GetNext(); delete pItem; pItem = pNext; } } template BOOL CSingleList::Insert (T item) { BOOL bRet = FALSE; Lock(); CSingleItem *pNewItem = new CSingleItem (item, m_Dummy.GetNext()); if (pNewItem) { m_Dummy.SetNext (pNewItem); bRet = TRUE; } Unlock(); return bRet; } template BOOL CSingleList::Delete (T item) { CSingleItem *pHead = &m_Dummy; CSingleItem *pItem; BOOL bRet = FALSE; Lock(); while (pItem = pHead->GetNext()) { if (pItem->IsSame (item)) { // Delete it pHead->SetNext (pItem->GetNext ()); delete (pItem); bRet = TRUE; break; } pHead = pHead->GetNext(); } Unlock(); return FALSE; } template T CSingleList::Find (T item) { Lock(); CSingleItem *pItem = m_Dummy.GetNext(); while (pItem) { if (pItem->IsSame (item)) { Unlock (); return pItem->GetData(); } pItem = pItem->GetNext(); } Unlock (); return NULL; } #endif