#ifndef __DEQUE_HPP #define __DEQUE_HPP template class Deque { public: Deque() : firstIterator(0) {} virtual ~Deque() {} virtual void putLeft(const Item &i) =0; virtual Item getLeft() =0; virtual Item peekLeft() const =0; virtual void putRight(const Item &i) =0; virtual Item getRight() =0; virtual Item peekRight() const =0; virtual int isEmpty() const =0; virtual unsigned length() const =0; private: QueueIterator *firstIterator; protected: void cleared(); void itemInserted(unsigned before); void itemAppended(unsigned after); void itemRemoved(unsigned at, unsigned ql); friend class DequeIterator; class DLock { Deque *d; public: DLock(const Deque *deque) : d((Deque*)deque) { d->lock(); } ~DLock() { d->unlock(); } }; friend class DLock; virtual lock() {} virtual unlock() {} }; template class DequeIterator { DequeIterator(const DequeIterator&); //dont copy operator=(const DequeIterator&); //dont copy public: DequeIterator(const Deque &queue); virtual ~DequeIterator(); virtual int isDone(); virtual const Item* currentItem(); virtual int advance(); virtual void reset(); private: DequeIterator *prev,*next; const Deque &d; int currentIndex,nextIndex; friend class Deque; void dequeCleared(); void dequeItemInserted(unsigned before); void dequeItemAppended(unsigned after); void dequeItemRemoved(unsigned at, unsigned ql); }; #include "deque.cpp" #endif