00001 #ifndef CITERATOR_H 00002 #define CITERATOR_H 00003 00009 #include <deque> 00010 00011 #include <assert.h> 00012 00022 template<class T> class CIterator { 00023 public: 00025 virtual void first() = 0; 00027 virtual void next() = 0; 00029 virtual T *current_item() = 0; 00031 virtual int is_done() = 0; 00032 }; 00033 00036 template<class T> class CDequeForwardIterator : public CIterator<T> { 00037 private: 00038 std::deque<T *> *list; 00039 unsigned int index; 00040 public: 00041 CDequeForwardIterator(std::deque<T *> &list) : index(0) { this->list = &list; } 00042 void first() { index = 0; } 00043 void next() { index++; } 00044 T *current_item() { assert(!is_done()); return (*list)[index]; } 00045 int is_done() { return (list->empty() || index >= list->size()); } 00046 }; 00047 00050 template<class T> class CDequeBackwardIterator : public CIterator<T> { 00051 private: 00052 std::deque<T *> *list; 00053 int index; 00054 00055 public: 00056 CDequeBackwardIterator(std::deque<T *> &list) : index(0) { this->list = &list; first(); } 00057 void first() { index = (unsigned int) list->size() - 1; } 00058 void next() { index--; } 00059 T *current_item() { assert(!is_done()); return (*list)[index]; } 00060 int is_done() { return (list->empty() || index < 0); } 00061 }; 00062 00063 #endif
1.3.3