00001 #ifndef STAR_STBITREEITER
00002 #define STAR_STBITREEITER
00003 #include <StBiTree.h>
00004 #include <iterator>
00005
00006
00007 namespace std {
00008 template <class T> class StBiTree;
00009
00010 template <>
00011 template <class T>
00012 class iterator<input_iterator_tag, class StBiTree<T> > {
00013 private:
00014 StBiTree<T> *p;
00015 int fCurrentBranch;
00016 iterator<input_iterator_tag, class StBiTree<T> > *fCurrentIterator;
00017 iterator& operator++(int) { return *this; }
00018 public:
00019 iterator():p(), fCurrentBranch(StBiTree<T>::kLeaf),fCurrentIterator() {}
00020 iterator(StBiTree<T>* x):p(x), fCurrentBranch(StBiTree<T>::kLeaf),fCurrentIterator()
00021 {
00022 if (p && !(p->IsLeaf() || p->IsEmpty() ) ) fCurrentBranch = 0;
00023 }
00024 iterator(const iterator& mit) : p(mit.p), fCurrentBranch(mit.fCurrentBranch),
00025 fCurrentIterator(mit.fCurrentIterator ? new iterator(*(mit.fCurrentIterator)) : 0) {}
00026 ~iterator() { delete fCurrentIterator; fCurrentIterator = 0; }
00027 bool operator==(const iterator& rhs) {return p==rhs.p;}
00028 bool operator!=(const iterator& rhs) {return p!=rhs.p;}
00029 StBiTree<T>& operator*() {
00030 return fCurrentIterator ? fCurrentIterator->operator*():
00031 (fCurrentBranch == StBiTree<T>::kLeaf) ?
00032 *(p)
00033 :
00034 *(p->Branch(fCurrentBranch? StBiTree<T>::kRight:StBiTree<T>::kLeft));
00035 }
00036 iterator& next(int direction) {
00037 if (p) {
00038 if (fCurrentBranch == StBiTree<T>::kLeaf ) {
00039 delete fCurrentIterator; fCurrentIterator = 0;
00040 } else {
00041 int newDirection = direction ? StBiTree<T>::kRight: StBiTree<T>::kLeft;
00042 if (newDirection != fCurrentBranch) {
00043 delete fCurrentIterator; fCurrentIterator = 0;
00044 fCurrentBranch = newDirection;
00045 }
00046 if (!fCurrentIterator) {
00047 StBiTree<T> *b = fCurrentBranch ? p->Right() : p->Left();
00048 if (b) fCurrentIterator = b->CreateIterator();
00049 } else if (*fCurrentIterator != p->end() ) fCurrentIterator->next();
00050 if ( fCurrentIterator && (*fCurrentIterator == p->end() ) && fCurrentBranch == StBiTree<T>::kLeft ) {
00051 delete fCurrentIterator; fCurrentIterator = 0;
00052 fCurrentBranch = StBiTree<T>::kRight;
00053 StBiTree<T> *b = p->Right();
00054 fCurrentIterator = b? b->CreateIterator():0;
00055 }
00056 }
00057 if (!fCurrentIterator) p=0;
00058 }
00059 return *this;
00060 }
00061 iterator& next() { return next(fCurrentBranch); }
00062 iterator& operator++() { return next(); }
00063
00064 };
00065
00066 }
00067 #endif