StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
StiKTNIterator.h
1 //StiKTNIterator.h
2 //M.L. Miller (Yale Software)
3 //12/01
4 
14 #ifndef StiKTNIterator_HH
15 #define StiKTNIterator_HH
16 
17 #include <assert.h>
18 #include "StiKalmanTrackNode.h"
20 class StiKTNIterator;
22 
23 
24 //This is a temp hack to get around old gcc ansi-non-compliant STL implementation
26 {
27 public:
28 
30  StiKTNIterator(KTN_t* leaf=0,int dir=0) : mDir(dir),mNode( leaf) {};
31  StiKTNIterator(KTN_t& leaf ,int dir=0) : mDir(dir),mNode(&leaf) {};
32  StiKTNIterator begin();
33  StiKTNIterator rbegin();
34 
36  bool operator==(const StiKTNIterator& rhs) const;
37 
39  bool operator!=(const StiKTNIterator& rhs) const;
40 
42  KTN_t& operator*();
43  KTN_t* operator()();
44 
47 
50 
53 
56 
58 static const StiKTNIterator& end();
59 static const StiKTNIterator& rend();
60 
61 static StiKTNIterator begin(KTN_t* fist);
62 static StiKTNIterator rbegin(KTN_t* last);
63 
64 
65 private:
66  int mDir;
67  KTN_t* mNode;
68 };
69 
71 public:
72  StiKTNForwardIterator(KTN_t* leaf=0) : StiKTNIterator(leaf,1){};
73  StiKTNForwardIterator(KTN_t& leaf ) : StiKTNIterator(leaf,1){};
74 static const StiKTNForwardIterator& end();
75 };
76 
77 //inlines --
78 
79 inline bool StiKTNIterator::operator==(const StiKTNIterator& rhs) const
80 {
81  return mNode==rhs.mNode;
82 }
83 
84 inline bool StiKTNIterator::operator!=(const StiKTNIterator& rhs) const
85 {
86  return !(mNode==rhs.mNode);
87 }
88 
89 inline KTN_t& StiKTNIterator::operator*()
90 {
91  return *mNode;
92 }
93 inline KTN_t* StiKTNIterator::operator()()
94 {
95  return mNode;
96 }
97 
98 //prefix
103 {
104  mDir = !mDir;
105  ++(*this);
106  mDir = !mDir;
107  return *this;
108 }
109 
110 
111 //postfix
116 {
117  StiKTNIterator temp = *this;
118  ++(*this);
119  return temp;
120 }
121 
122 //prefix
127 {
128  assert(mNode);
129  if(!mDir) { //forward direction
130 
131  mNode = static_cast<KTN_t*>(mNode->getNextNode());
132 
133  } else { //backward direction
134 
135  mNode = static_cast<KTN_t*>(mNode->getPrevNode());
136  }
137 
138  return *this;
139 }
140 
141 //postfix decrement
146 {
147  StiKTNIterator temp = *this;
148  --(*this);
149  return temp;
150 }
151 
152 
153 inline StiKTNIterator StiKTNIterator::begin(KTN_t* fist)
154 {
155  return StiKTNIterator(fist,0);
156 }
157 
158 inline StiKTNIterator StiKTNIterator::rbegin(KTN_t* last)
159 {
160  return StiKTNIterator(last,1);
161 }
162 inline StiKTNIterator StiKTNIterator::begin()
163 {
164  assert(mNode);
165  KTN_t* fist = (KTN_t*)mNode->getFirstNode();
166  return StiKTNIterator(fist,0);
167 }
168 
169 inline StiKTNIterator StiKTNIterator::rbegin()
170 {
171  assert(mNode);
172  KTN_t* last = (KTN_t*)mNode->getLastNode();
173  return StiKTNIterator(last,1);
174 }
175 
176 #endif
StiTreeNode * getNextNode() const
Returns the node that follows this node in a preorder traversal of this.
static const StiKTNIterator & end()
We demarcate the end of the traversal via a singular iterator.
bool operator!=(const StiKTNIterator &rhs) const
inequlity
StiKTNIterator(KTN_t *leaf=0, int dir=0)
ctr-dstr
bool operator==(const StiKTNIterator &rhs) const
equality:
StiKTNIterator & operator--()
prefix
StiKTNIterator & operator++()
prefix