BALL  1.4.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
elementColumnIterator.h
Go to the documentation of this file.
1 #ifndef BALL_LINALG_ELEMENTCOLUMNITERATOR_H
2 #define BALL_LINALG_ELEMENTCOLUMNITERATOR_H
3 
4 #ifndef BALL_LINALG_MATRIX_IH
5 # include <BALL/MATHS/LINALG/matrix.ih>
6 #endif
7 
8 #ifndef BALL_CONCEPT_RANDOMACCESSITERATOR_H
10 #endif
11 
12 namespace BALL {
13 
14  // forward declaration
15  template <class valuetype, class mtraits>
16  class Matrix;
17 
18 
19  template <class valuetype, class mtraits=StandardTraits>
21  {
22 
25  typedef valuetype ValueType;
26 
29  typedef valuetype* PointerType;
30 
33  typedef int IteratorPosition;
34 
37  typedef int Distance;
38 
41  typedef int Index;
42 
43  friend class Matrix<valuetype, mtraits>;
44  public:
45 
47  {
48  }
49 
51  : bound_(0),
52  position_(0)
53  {
54  }
55 
57  : bound_(const_cast<Matrix<valuetype, mtraits>*>(&matrix)),
58  position_(0)
59  {
60  }
61 
63  : bound_(traits.bound_),
64  position_(traits.position_)
65  {
66  }
67 
69  {
70  bound_ = traits.bound_;
71  position_ = traits.position_;
72 
73  return *this;
74  }
75 
77  {
78  return bound_;
79  }
80 
82  {
83  return bound_;
84  }
85 
86  bool isSingular() const
87  {
88  return (bound_ == 0);
89  }
90 
92  {
93  return position_;
94  }
95 
97  {
98  return position_;
99  }
100 
101  bool operator == (const ElementColumnIteratorTraits& traits) const
102  {
103  return (position_ == traits.position_);
104  }
105 
106  bool operator != (const ElementColumnIteratorTraits& traits) const
107  {
108  return (position_ != traits.position_);
109  }
110 
111  bool operator < (const ElementColumnIteratorTraits& traits) const
112  {
113  return (position_ < traits.position_);
114  }
115 
117  {
118  return (Distance)(position_ - traits.position_);
119  }
120 
121  bool isValid() const
122  {
123  return ((bound_ != 0) && (position_ >= 0) && (position_ < (int)bound_->data_.size()));
124  }
125 
126  void invalidate()
127  {
128  bound_ = 0;
129  position_ = -1;
130  }
131 
132  void toBegin()
133  {
134  position_ = 0;
135  }
136 
137  bool isBegin() const
138  {
139  return ( position_ == 0 );
140  }
141 
142  void toEnd()
143  {
144  position_ = bound_->data_.size();
145  }
146 
147  bool isEnd() const
148  {
149  return ( position_ == (int)bound_->data_.size());
150  }
151 
153  {
154  return (*bound_)[position_];
155  }
156 
157  const ValueType& getData() const
158  {
159  return (*bound_)[position_];
160  }
161 
162  void forward()
163  {
164  if (bound_->row_major_)
165  {
166  if ((uint)(position_+1) == bound_->data_.size())
167  {
168  position_++;
169  return;
170  }
171  position_ += bound_->m_;
172  if ((uint)position_ >= bound_->data_.size())
173  position_ = (position_ % bound_->n_) + 1;
174  }
175  else
176  {
177  position_++;
178  }
179  }
180 
181  friend std::ostream& operator << (std::ostream& s, const ElementColumnIteratorTraits& traits)
182  {
183  return (s << traits.position_ << ' ');
184  }
185 
186  void dump(std::ostream& s) const
187  {
188  s << position_ << std::endl;
189  }
190 
191  void toRBegin()
192  {
193  position_ = bound_->data_.size() - 1;
194  }
195 
196  bool isRBegin() const
197  {
198  return (position_ == bound_->data_.size() - 1);
199  }
200 
201  void toREnd()
202  {
203  position_ = -1;
204  }
205 
206  bool isREnd() const
207  {
208  return (position_ <= -1);
209  }
210 
211  void backward()
212  {
213  if (bound_->row_major_)
214  {
215  if (position_ == 0)
216  {
217  position_--;
218  return;
219  }
220  position_ -= bound_->m_;
221  if (position_ < 0)
222  position_ = (int)(bound_->data_.size()) - 1 + position_;
223  }
224  else
225  {
226  position_--;
227  }
228  }
229 
230  void backward(Distance distance)
231  {
232  if (bound_->row_major_)
233  {
234  for (int i=0; i<distance; i++)
235  {
236  if (position_ == 0)
237  {
238  position_--;
239  return;
240  }
241  position_ -= bound_->m_;
242  if (position_ < 0)
243  position_ = (int)(bound_->data_.size()) - 1 + position_;
244  }
245  }
246  else
247  {
248  position_ -= distance;
249  }
250  }
251 
252  void forward(Distance distance)
253  {
254  if (bound_->row_major_)
255  {
256  for (int i=0; i<distance; i++)
257  {
258  if ((uint)(position_+1) == bound_->data_.size())
259  {
260  position_++;
261  return;
262  }
263  position_ += bound_->m_;
264  if ((uint)position_ >= bound_->data_.size())
265  position_ = (position_ % bound_->n_) + 1;
266  }
267  }
268  else
269  {
270  position_ += distance;
271  }
272  }
273 
275  {
276  return (*bound_)[index];
277  }
278 
279  const ValueType& getData(Index index) const
280  {
281  return (*bound_)[index];
282  }
283 
284 
285  protected:
286 
289  };
290 
291 
292 } // namespace BALL
293 
294 #endif