#ifndef _QUEUE_HPP #define _QUEUE_HPP template class QueueIterator; template class Queue { public: Queue() : firstIterator(0) {} virtual ~Queue() {} virtual void put(const Item &i) =0; virtual Item get() =0; virtual Item peek() const =0; virtual void clear() =0; virtual int isEmpty() const =0; virtual unsigned length() const =0; virtual const Item& itemAt(unsigned at) const =0; private: QueueIterator *firstIterator; protected: void cleared(); void itemInserted(unsigned before); void itemAppended(unsigned after); void itemRemoved(unsigned at, unsigned ql); friend class QueueIterator; class QLock { Queue *q; public: QLock(const Queue *queue) : q((Queue*)queue) { q->lock(); } ~QLock() { q->unlock(); } }; friend class QLock; virtual lock() {} virtual unlock() {} }; template class QueueIterator { QueueIterator(const QueueIterator&); //dont copy operator=(const QueueIterator&); //dont copy public: QueueIterator(const Queue &queue); virtual ~QueueIterator(); virtual int isDone(); virtual const Item* currentItem(); virtual int advance(); virtual void reset(); private: QueueIterator *prev,*next; const Queue &q; int currentIndex,nextIndex; friend class Queue; void queueCleared(); void queueItemInserted(unsigned before); void queueItemAppended(unsigned after); void queueItemRemoved(unsigned at, unsigned ql); }; #include "queue.cpp" #endif