BALL  1.4.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
MATHS/LINALG/forwardIterator.h
Go to the documentation of this file.
1 #ifndef BALL_LINALG_FORWARDITERATOR_H
2 #define BALL_LINALG_FORWARDITERATOR_H
3 
4 #ifndef BALL_LINALG_BASEITERATOR_H
6 #endif
7 
10 
11 namespace BALL
12 {
13 
17 
20  template <typename Container, typename DataType, typename Position, typename Traits>
21  class ConstForwardIterator
22  : public BaseIterator<Container, DataType, Position, Traits>
23  {
24  public:
25 
29 
31  typedef std::forward_iterator_tag iterator_category;
32  // convenience typedef
35 
39 
42 
45  : BaseIterator<Container, DataType, Position, Traits>(iterator)
46  {
47  }
48 
51 
53 
57 
59  {
61  return *this;
62  }
63 
67 
71 
75  void toBegin();
76 
78  bool isBegin() const;
79 
83  void toEnd();
84 
86  bool isEnd() const;
87 
91  static ConstForwardIterator begin(const Container& container);
92 
96  static ConstForwardIterator end(const Container& container);
97 
102  {
103  if (!Base::isValid())
104  {
106  throw(e);
107  }
108  Base::getTraits().forward();
109  return *this;
110  }
111 
116  {
117  if (!Base::isValid())
118  {
120  throw(e);
121  }
122  ConstForwardIterator tmp(*this);
123  ++(*this);
124  return tmp;
125  }
126 
128 
129  protected:
130 
132  ConstForwardIterator(const Container& container)
133  : BaseIterator<Container, DataType, Position, Traits>(container)
134  {
135  }
136  };
138 
139  template <typename Container, typename DataType, typename Position, typename Traits>
141  {
142  if (Base::isSingular())
143  {
144  Exception::SingularIterator e;
145  throw(e);
146  }
147  Base::getTraits().toBegin();
148  }
149 
150  template <typename Container, typename DataType, typename Position, typename Traits>
151  ConstForwardIterator<Container, DataType, Position, Traits>
153  {
154  ConstForwardIterator<Container, DataType, Position, Traits> iterator(container);
155  iterator.toBegin();
156  return iterator;
157  }
158 
159  template <typename Container, typename DataType, typename Position, typename Traits>
161  {
162  if (Base::getTraits().isSingular())
163  {
164  return false;
165  }
166  return Base::getTraits().isBegin();
167  }
168 
169  template <typename Container, typename DataType, typename Position, typename Traits>
171  {
172  if (Base::isSingular())
173  {
174  Exception::SingularIterator e;
175  throw(e);
176  }
177  Base::getTraits().toEnd();
178  }
179 
180  template <typename Container, typename DataType, typename Position, typename Traits>
181  ConstForwardIterator<Container, DataType, Position, Traits>
183  {
184  ConstForwardIterator iterator(container);
185  iterator.toEnd();
186  return iterator;
187  }
188 
189  template <typename Container, typename DataType, typename Position, typename Traits>
191  {
192  if (Base::isSingular())
193  {
194  return false;
195  }
196  return Base::getTraits().isEnd();
197  }
198 
201  template <typename Container, typename DataType, typename Position, typename Traits>
202  class ForwardIterator
203  : public ConstForwardIterator<Container, DataType, Position, Traits>
204  {
205  public:
206 
210 
212  typedef DataType& reference;
214  typedef DataType* pointer;
215  // convenience typedef
218 
222 
225 
228  : ConstForwardIterator<Container, DataType, Position, Traits>(iterator)
229  {
230  }
231 
235 
239 
241  {
243  return *this;
244  }
245 
247  void swap(ForwardIterator& iterator) { std::swap(Base::getTraits(), iterator.getTraits()); }
249 
253 
257  static ForwardIterator begin(const Container& container);
258 
262  static ForwardIterator end(const Container& container);
263 
266  {
267  return (reference)Base::getTraits().getData();
268  }
269 
272  {
273  return (pointer)&Base::getTraits().getData();
274  }
275 
280  {
281  if (!Base::isValid())
282  {
284  throw(e);
285  }
286  Base::getTraits().forward();
287  return *this;
288  }
289 
294  {
295  if (!Base::isValid())
296  {
298  throw(e);
299  }
300  ForwardIterator tmp(*this);
301  ++(*this);
302  return tmp;
303  }
304 
306 
307  protected:
308 
310  ForwardIterator(const Container& container)
311  : Base(container)
312  {
313  }
314  };
315 
316 
317  template <typename Container, typename DataType, typename Position, typename Traits>
318  ForwardIterator<Container, DataType, Position, Traits>
320  {
321  ForwardIterator iterator(container);
322  iterator.toBegin();
323  return iterator;
324  }
325 
326  template <typename Container, typename DataType, typename Position, typename Traits>
327  ForwardIterator<Container, DataType, Position, Traits>
329  {
330  ForwardIterator iterator(container);
331  iterator.toEnd();
332  return iterator;
333  }
334 
335 
336 } // namespace BALL
337 
338 #endif // BALL_KERNEL_FORWARDITERATOR_H