BALL  1.4.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
reverseIterator.h
Go to the documentation of this file.
1 #ifndef BALL_LINALG_REVERSEITERATOR_H
2 #define BALL_LINALG_REVERSEITERATOR_H
3 
4 #ifndef BALL_CONCEPT_RANDOMACCESSITERATOR_H
6 #endif
7 
9 
10 namespace BALL
11 {
13  typedef int Distance;
15  typedef int Index;
16 
21  template <typename Container, typename DataType, typename Position, typename Traits>
23  : public ConstRandomAccessIterator<Container, DataType, Position, Traits>
24  {
25  public:
26 
30 
32  typedef std::random_access_iterator_tag iterator_category;
33  // convenience typedef
36 
40 
43 
46  : Base(iterator)
47  {
48  }
49 
53 
54 
55 
59 
64 
69 
75 
82 
89  Distance operator - (const ConstReverseIterator& iterator) const;
90 
95  static ConstReverseIterator begin(const Container& container);
96 
101  static ConstReverseIterator end(const Container& container);
102 
107  static ConstReverseIterator rbegin(const Container& container);
108 
113  static ConstReverseIterator rend(const Container& container);
114 
119 
124 
129 
134 
135 
137 
141 
143  bool operator + () const { return Base::getTraits().isValid(); }
144 
146  bool operator - () const { return !Base::getTraits().isValid(); }
147 
154  bool operator < (const ConstReverseIterator& iterator) const;
155 
163  bool operator <= (const ConstReverseIterator& iterator) const;
164 
172  bool operator >= (const ConstReverseIterator& iterator) const;
173 
180  bool operator > (const ConstReverseIterator& iterator) const;
181 
183 
184 
185 
192  const DataType& operator [] (Index index) const;
194 
195  protected:
196 
197  ConstReverseIterator(const Container& container)
198  : Base(container)
199  {
200  }
201  };
203 
204  template <typename Container, typename DataType, typename Position, typename Traits>
205  ConstReverseIterator<Container, DataType, Position, Traits>&
207  {
208  if (!Base::getTraits().isValid())
209  {
211  throw(e);
212  }
213  Base::getTraits().backward();
214  return *this;
215  }
216 
217  template <typename Container, typename DataType, typename Position, typename Traits>
220  {
221  if (!Base::getTraits().isValid())
222  {
224  throw(e);
225  }
226  ConstReverseIterator iterator(*this);
227  ++(*this);
228  return iterator;
229  }
230 
231  template <typename Container, typename DataType, typename Position, typename Traits>
234  {
235  if (Base::getTraits().isSingular())
236  {
238  throw(e);
239  }
240  Base::getTraits().forward();
241  return *this;
242  }
243 
244  template <typename Container, typename DataType, typename Position, typename Traits>
247  {
248  if (Base::getTraits().isSingular())
249  {
251  throw(e);
252  }
253  ConstReverseIterator iterator(*this);
254  --(*this);
255  return iterator;
256  }
257 
263  template <typename Container, typename DataType, typename Position, typename Traits>
266  {
268  return (tmp_iterator += distance);
269  }
270 
277  template <typename Container, typename DataType, typename Position, typename Traits>
278  Distance ConstReverseIterator<Container, DataType, Position, Traits>::operator -
279  (const ConstReverseIterator<Container, DataType, Position, Traits>& b) const
280  {
281  if (!Base::getTraits().isValid())
282  {
283  Exception::InvalidIterator e;
284  throw e;
285  }
286  if (!b.getTraits().isValid())
287  {
288  Exception::InvalidIterator e;
289  throw e;
290  }
291  if (Base::getTraits().getContainer() != b.getTraits().getContainer())
292  {
293  Exception::IncompatibleIterators e;
294  throw e;
295  }
296  return Base::getTraits().getDistance(b.getTraits());
297  }
298 
299  template <typename Container, typename DataType, typename Position, typename Traits>
300  ConstReverseIterator<Container, DataType, Position, Traits>&
302  {
303  if (!Base::getTraits().isValid())
304  {
306  throw e;
307  }
308  if (distance < (Distance)0)
309  {
310  return (*this -= -distance);
311  }
312  Base::getTraits().backward(distance);
313  return *this;
314  }
315 
316  template <typename Container, typename DataType, typename Position, typename Traits>
319  {
320  if (Base::getTraits().isSingular())
321  {
323  throw e;
324  }
325  if (distance < (Distance)0)
326  {
327  return (*this += -distance);
328  }
329  if (Base::getTraits().isREnd() == true)
330  {
331  Base::getTraits().toBegin();
332  Base::getTraits().forward(distance - 1);
333  }
334  else
335  {
336  Base::getTraits().forward(distance);
337  }
338  return *this;
339  }
340 
341  template <typename Container, typename DataType, typename Position, typename Traits>
344  {
345  ConstReverseIterator iterator(*this);
346  return (iterator += distance);
347  }
348 
349  template <typename Container, typename DataType, typename Position, typename Traits>
352  {
353  ConstReverseIterator iterator(*this);
354  return (iterator -= distance);
355  }
356 
357  template <typename Container, typename DataType, typename Position, typename Traits>
359  (const ConstReverseIterator& iterator) const
360  {
361  if (!Base::getTraits().isValid())
362  {
364  throw e;
365  }
366  if (!iterator.isValid())
367  {
369  throw e;
370  }
371  if (Base::getTraits().getContainer() != iterator.getContainer())
372  {
374  throw e;
375  }
376 
377  return !(Base::getTraits().operator < (iterator.getTraits()));
378  }
379 
380  template <typename Container, typename DataType, typename Position, typename Traits>
382  (const ConstReverseIterator& iterator) const
383  {
384  if (!Base::getTraits().isValid())
385  {
387  throw e;
388  }
389  if (!iterator.isValid())
390  {
392  throw e;
393  }
394  if (Base::getTraits().getContainer() != iterator.getContainer())
395  {
397  throw e;
398  }
399  return (Base::getTraits().operator > (iterator.getTraits()));
400  }
401 
402  template <typename Container, typename DataType, typename Position, typename Traits>
404  (const ConstReverseIterator& iterator) const
405  {
406  if (!Base::getTraits().isValid())
407  {
409  throw e;
410  }
411  if (!iterator.isValid())
412  {
414  throw e;
415  }
416  if (Base::getTraits().getContainer() != iterator.getContainer())
417  {
419  throw e;
420  }
421 
422  return (Base::getTraits().operator < (iterator.getTraits()));
423  }
424 
425  template <typename Container, typename DataType, typename Position, typename Traits>
427  (const ConstReverseIterator& iterator) const
428  {
429  if (!Base::getTraits().isValid())
430  {
432  throw e;
433  }
434  if (!iterator.isValid())
435  {
437  throw e;
438  }
439  if (Base::getTraits().getContainer() != iterator.getContainer())
440  {
442  throw e;
443  }
444 
445  return !(Base::getTraits().operator > (iterator.getTraits()));
446  }
447 
448 
449  template <typename Container, typename DataType, typename Position, typename Traits>
451  {
452  if (!Base::getTraits().isValid())
453  {
455  throw e;
456  }
457 
458  return Base::getTraits().getData(index);
459  }
460 
461  template <typename Container, typename DataType, typename Position, typename Traits>
464  {
465  ConstReverseIterator iterator(container);
466  iterator.toRBegin();
467  return iterator;
468  }
469 
470  template <typename Container, typename DataType, typename Position, typename Traits>
473  {
474  ConstReverseIterator iterator(container);
475  iterator.toREnd();
476  return iterator;
477  }
478 
479  template <typename Container, typename DataType, typename Position, typename Traits>
482  {
483  ConstReverseIterator iterator(container);
484  iterator.toBegin();
485  return iterator;
486  }
487 
488  template <typename Container, typename DataType, typename Position, typename Traits>
491  {
492  ConstReverseIterator iterator(container);
493  iterator.toEnd();
494  return iterator;
495  }
496 
501 
504  template <typename Container, typename DataType, typename Position, typename Traits>
506  : public ConstReverseIterator<Container, DataType, Position, Traits>
507  {
508  public:
509 
513 
514  typedef DataType& reference;
516  typedef DataType* pointer;
520 
524 
527 
530  : Base(iterator)
531  {
532  }
533 
537 
544  reference operator [] (Index index) const { return const_cast<reference>(Base::getTraits().getData(index)); }
546  reference operator * () const { return const_cast<reference>(Base::getTraits().getData()); }
548  pointer operator -> () const { return const_cast<pointer>(&Base::getTraits().getData()); }
550 
558  static ReverseIterator begin(const Container& container);
559 
564  static ReverseIterator end(const Container& container);
565 
570  static ReverseIterator rbegin(const Container& container);
571 
576  static ReverseIterator rend(const Container& container);
578 
579  protected:
580 
581  ReverseIterator(const Container& container)
582  : Base(container)
583  {
584  }
585 
586  };
588 
589  template <typename Container, typename DataType, typename Position, typename Traits>
590  ReverseIterator<Container, DataType, Position, Traits>
592  {
593  ReverseIterator iterator(container);
594  iterator.toRBegin();
595  return iterator;
596  }
597 
598  template <typename Container, typename DataType, typename Position, typename Traits>
601  {
602  ReverseIterator iterator(container);
603  iterator.toREnd();
604  return iterator;
605  }
606 
607  template <typename Container, typename DataType, typename Position, typename Traits>
610  {
611  ReverseIterator iterator(container);
612  iterator.toBegin();
613  return iterator;
614  }
615 
616  template <typename Container, typename DataType, typename Position, typename Traits>
619  {
620  ReverseIterator iterator(container);
621  iterator.toEnd();
622  return iterator;
623  }
624 
625 } // namespace BALL
626 
627 #endif // BALL_KERNEL_REVERSEITERATOR_H