#ifndef _LIST_H_ #define _LIST_H_ #include "mutex.h" template class Iterator { public: virtual ~Iterator() {} virtual bool hasNext() =0; virtual T* next() =0; virtual void remove() =0; virtual void reset() =0; protected: Iterator() {} Iterator(const Iterator& it); Iterator& operator=(const Iterator& it); }; template class NullIterator : public Iterator { public: NullIterator() {} virtual ~NullIterator() {} virtual bool hasNext() { return false; } virtual T* next() { return NULL; } virtual void remove() {} virtual void reset() {} }; template class ListEntry; template class ListIterator; template class List { friend class ListIterator; public: List() : head(0), tail(0) {} ~List() {} void add(T* entry) { ListEntry* tmp = (ListEntry*)entry; tmp->next = NULL; if (!head) head = tmp; if (tail) tail->next = tmp; tail = tmp; } T* get() { ListEntry* retval = head; if (head) head = head->next; if (!head) tail = NULL; return (T*)retval; } T* peekHead() { return (T*)head; } T* peekTail() { return (T*)tail; } bool isEmpty() { return (head == NULL); } Iterator* createIterator() { return new ListIterator(this); } protected: List(const List& l); List& operator=(const List& l); private: ListEntry *head; ListEntry *tail; }; template class ListIterator : public Iterator { public: ListIterator(List* list) : list(list) { reset(); } virtual ~ListIterator() {} virtual bool hasNext() { return (pos == NULL) ? (list->head != NULL) : (pos->next != NULL); } virtual T* next() { prev = pos; pos = (pos == NULL) ? list->head : pos->next; return (T*)pos; } virtual void remove() { // remove pre-head -> bail out if (pos == NULL) return; // remove first if (pos == list->head) list->head = pos->next; // remove middle if (prev) prev->next = pos->next; // remove last if (pos == list->tail) list->tail = (prev == NULL) ? NULL : prev; pos = prev; } virtual void reset() { pos = NULL; prev = NULL; } protected: ListIterator(const ListIterator& li); ListIterator& operator=(const ListIterator& li); List* list; private: ListEntry* pos; ListEntry* prev; }; template class ListEntry { friend class List; friend class ListIterator; public: ListEntry() {} ~ListEntry() {} private: ListEntry* next; }; template class LockedListIterator; template class LockedList : private List { friend class LockedListIterator; public: LockedList() {} ~LockedList() {} void add(T* entry) { AutoMutex am(mutex); List::add(entry); } T* get() { AutoMutex am(mutex); return List::get(); } T* peekFirst() { return NULL; // not with lockedlist } T* peekLast() { return NULL; // not with lockedlist } bool isEmpty() { AutoMutex am(mutex); return List::isEmpty(); } Iterator* createIterator() { return new LockedListIterator(this); } private: Mutex mutex; }; template class LockedListIterator : public ListIterator { public: LockedListIterator(LockedList* list) : ListIterator(list) { list->mutex.lock(); } virtual ~LockedListIterator() { ((LockedList*)list)->mutex.unlock(); } }; #endif //_LIST_H_