#pragma once //forward references class DoublyLinkedList; class ILockable; class DoublyLinkedListItem { friend class DoublyLinkedList; private: DoublyLinkedListItem(void){}; public: DoublyLinkedListItem(DoublyLinkedList *list); DoublyLinkedListItem(DoublyLinkedList *list, int id); virtual ~DoublyLinkedListItem(void); // Id int Id; DoublyLinkedListItem* Next() { return pNextItem;} DoublyLinkedListItem* Prev() { return pPrevItem;} protected: // doubly linked list of objects of a given type DoublyLinkedListItem* pNextItem; DoublyLinkedListItem* pPrevItem; DoublyLinkedList *pList; }; class DoublyLinkedList { private: DoublyLinkedList(void){}; public: DoublyLinkedList(ILockable* locker); virtual ~DoublyLinkedList(void); void Add(DoublyLinkedListItem* object); void Remove(DoublyLinkedListItem* object, int deleteObj = 1); void Remove(int Id); DoublyLinkedListItem* Find(int Id); const DoublyLinkedListItem* First() const { return pFirstItem;} const DoublyLinkedListItem* Last() const { return pLastItem;} int Count() { return itemCount; } //CRITICAL_SECTION CriticalSection; protected: // Maintain a list of items DoublyLinkedListItem* pFirstItem; DoublyLinkedListItem* pLastItem; int disposed; int itemCount; ILockable* Locker; };