00001
00002
00003
00004
00014 #ifndef StiKTNIterator_HH
00015 #define StiKTNIterator_HH
00016
00017 #include <assert.h>
00018 #include "StiKalmanTrackNode.h"
00019 typedef StiKalmanTrackNode KTN_t;
00020 class StiKTNIterator;
00021 typedef StiKTNIterator StiKTNBidirectionalIterator;
00022
00023
00024
00025 class StiKTNIterator
00026 {
00027 public:
00028
00030 StiKTNIterator(KTN_t* leaf=0,int dir=0) : mDir(dir),mNode( leaf) {};
00031 StiKTNIterator(KTN_t& leaf ,int dir=0) : mDir(dir),mNode(&leaf) {};
00032 StiKTNIterator begin();
00033 StiKTNIterator rbegin();
00034
00036 bool operator==(const StiKTNIterator& rhs) const;
00037
00039 bool operator!=(const StiKTNIterator& rhs) const;
00040
00042 KTN_t& operator*();
00043 KTN_t* operator()();
00044
00046 StiKTNIterator& operator++ ();
00047
00049 StiKTNIterator operator++(int);
00050
00052 StiKTNIterator& operator-- ();
00053
00055 StiKTNIterator operator--(int);
00056
00058 static const StiKTNIterator& end();
00059 static const StiKTNIterator& rend();
00060
00061 static StiKTNIterator begin(KTN_t* fist);
00062 static StiKTNIterator rbegin(KTN_t* last);
00063
00064
00065 private:
00066 int mDir;
00067 KTN_t* mNode;
00068 };
00069
00070 class StiKTNForwardIterator: public StiKTNIterator{
00071 public:
00072 StiKTNForwardIterator(KTN_t* leaf=0) : StiKTNIterator(leaf,1){};
00073 StiKTNForwardIterator(KTN_t& leaf ) : StiKTNIterator(leaf,1){};
00074 static const StiKTNForwardIterator& end();
00075 };
00076
00077
00078
00079 inline bool StiKTNIterator::operator==(const StiKTNIterator& rhs) const
00080 {
00081 return mNode==rhs.mNode;
00082 }
00083
00084 inline bool StiKTNIterator::operator!=(const StiKTNIterator& rhs) const
00085 {
00086 return !(mNode==rhs.mNode);
00087 }
00088
00089 inline KTN_t& StiKTNIterator::operator*()
00090 {
00091 return *mNode;
00092 }
00093 inline KTN_t* StiKTNIterator::operator()()
00094 {
00095 return mNode;
00096 }
00097
00098
00102 inline StiKTNIterator& StiKTNIterator::operator-- ()
00103 {
00104 mDir = !mDir;
00105 ++(*this);
00106 mDir = !mDir;
00107 return *this;
00108 }
00109
00110
00111
00115 inline StiKTNIterator StiKTNIterator::operator++(int)
00116 {
00117 StiKTNIterator temp = *this;
00118 ++(*this);
00119 return temp;
00120 }
00121
00122
00126 inline StiKTNIterator& StiKTNIterator::operator++ ()
00127 {
00128 assert(mNode);
00129 if(!mDir) {
00130
00131 mNode = static_cast<KTN_t*>(mNode->getNextNode());
00132
00133 } else {
00134
00135 mNode = static_cast<KTN_t*>(mNode->getPrevNode());
00136 }
00137
00138 return *this;
00139 }
00140
00141
00145 inline StiKTNIterator StiKTNIterator::operator--(int)
00146 {
00147 StiKTNIterator temp = *this;
00148 --(*this);
00149 return temp;
00150 }
00151
00152
00153 inline StiKTNIterator StiKTNIterator::begin(KTN_t* fist)
00154 {
00155 return StiKTNIterator(fist,0);
00156 }
00157
00158 inline StiKTNIterator StiKTNIterator::rbegin(KTN_t* last)
00159 {
00160 return StiKTNIterator(last,1);
00161 }
00162 inline StiKTNIterator StiKTNIterator::begin()
00163 {
00164 assert(mNode);
00165 KTN_t* fist = (KTN_t*)mNode->getFirstNode();
00166 return StiKTNIterator(fist,0);
00167 }
00168
00169 inline StiKTNIterator StiKTNIterator::rbegin()
00170 {
00171 assert(mNode);
00172 KTN_t* last = (KTN_t*)mNode->getLastNode();
00173 return StiKTNIterator(last,1);
00174 }
00175
00176 #endif