BALL  1.4.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
randomAccessFilterIterator.h
Go to the documentation of this file.
1 #ifndef BALL_LINALG_RANDOMACCESSFILTERITERATOR_H
2 #define BALL_LINALG_RANDOMACCESSFILTERITERATOR_H
3 
4 #ifndef BALL_LINALG_BIDIRECTIONALFILTERITERATOR_H
6 #endif
7 
8 namespace BALL
9 {
11  typedef int Distance;
13  typedef int Index;
14 
19  template <class Predicate, class IteratorRandomAccess>
21  : public ConstBidirectionalFilterIterator<Predicate, IteratorRandomAccess>
22  {
23  public:
24 
28 
29 
31  typedef typename IteratorRandomAccess::difference_type difference_type;
33  typedef typename IteratorRandomAccess::value_type value_type;
35  typedef typename IteratorRandomAccess::container_type Container;
37  typedef typename IteratorRandomAccess::value_type DataType;
39  typedef typename IteratorRandomAccess::difference_type Position;
41  typedef typename IteratorRandomAccess::traits_type Traits;
43  typedef typename IteratorRandomAccess::pointer pointer;
45  typedef typename IteratorRandomAccess::reference reference;
47  typedef std::random_access_iterator_tag iterator_category;
48  // convenience typedef
51 
55 
58 
62  {
63  }
64 
67  : Base(iterator)
68  {
69  }
70 
74 
75 
76 
80 
85 
90 
96 
103 
111 
116  static ConstRandomAccessFilterIterator begin(const Container& container);
117 
122  static ConstRandomAccessFilterIterator end(const Container& container);
123 
128  static ConstRandomAccessFilterIterator rbegin(const Container& container);
129 
134  static ConstRandomAccessFilterIterator rend(const Container& container);
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 ConstRandomAccessFilterIterator& iterator) const;
155 
163  bool operator <= (const ConstRandomAccessFilterIterator& iterator) const;
164 
172  bool operator >= (const ConstRandomAccessFilterIterator& iterator) const;
173 
180  bool operator > (const ConstRandomAccessFilterIterator& iterator) const;
181 
183 
184 
185 
192  const DataType& operator [] (Index index) const
193  {
194  if (!Base::getTraits().isValid())
195  {
197  throw e;
198  }
199 
200  return Base::iterator_[index];
201  };
203 
204  protected:
205 
207  : Base(container)
208  {
209  }
210  };
212 
218  template <class Predicate, class IteratorRandomAccess>
219  ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess> operator +
221  {
223  return (tmp_iterator += distance);
224  }
225 
232  template <class Predicate, class IteratorRandomAccess>
233  Distance ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::operator -
235  {
236  if (!Base::getTraits().isValid())
237  {
239  throw e;
240  }
241  if (!b.getTraits().isValid())
242  {
244  throw e;
245  }
246  if (Base::getTraits().getContainer() != b.getTraits().getContainer())
247  {
249  throw e;
250  }
251  return Base::getTraits().getDistance(b.getTraits());
252  }
253 
254  template <class Predicate, class IteratorRandomAccess>
257  {
258  if (!Base::getTraits().isValid())
259  {
261  throw e;
262  }
263  if (distance < (Distance)0)
264  {
265  return (*this -= -distance);
266  }
267  Base::getTraits().forward(distance);
268 
269  while (!Base::isEnd() && !Base::predicate_(Base::getTraits().getData()))
270  Base::getTraits().forward();
271  return *this;
272  }
273 
274  template <class Predicate, class IteratorRandomAccess>
277  {
278  if (Base::getTraits().isSingular())
279  {
281  throw e;
282  }
283  if (distance < (Distance)0)
284  {
285  return (*this += -distance);
286  }
287  if (Base::getTraits().isEnd() == true)
288  {
289  Base::getTraits().toRBegin();
290  Base::getTraits().backward(distance - 1);
291  }
292  else
293  {
294  Base::getTraits().backward(distance);
295 
296  while (!Base::isBegin() && !Base::predicate_(Base::getTraits().getData()))
297  Base::getTraits().backward();
298  }
299  return *this;
300  }
301 
302  template <class Predicate, class IteratorRandomAccess>
305  {
306  ConstRandomAccessFilterIterator iterator(*this);
307  return (iterator += distance);
308  }
309 
310  template <class Predicate, class IteratorRandomAccess>
313  {
314  ConstRandomAccessFilterIterator iterator(*this);
315  return (iterator -= distance);
316  }
317 
318  template <class Predicate, class IteratorRandomAccess>
320  (const ConstRandomAccessFilterIterator& iterator) const
321  {
322  if (!Base::getTraits().isValid())
323  {
325  throw e;
326  }
327  if (!iterator.isValid())
328  {
330  throw e;
331  }
332  if (Base::getTraits().getContainer() != iterator.getContainer())
333  {
335  throw e;
336  }
337 
338  return (Base::getTraits().operator < (iterator.getTraits()));
339  }
340 
341  template <class Predicate, class IteratorRandomAccess>
343  (const ConstRandomAccessFilterIterator& iterator) const
344  {
345  if (!Base::getTraits().isValid())
346  {
348  throw e;
349  }
350  if (!iterator.isValid())
351  {
353  throw e;
354  }
355  if (Base::getTraits().getContainer() != iterator.getContainer())
356  {
358  throw e;
359  }
360  return !(Base::getTraits().operator > (iterator.getTraits()));
361  }
362 
363  template <class Predicate, class IteratorRandomAccess>
365  (const ConstRandomAccessFilterIterator& iterator) const
366  {
367  if (!Base::getTraits().isValid())
368  {
370  throw e;
371  }
372  if (!iterator.isValid())
373  {
375  throw e;
376  }
377  if (Base::getTraits().getContainer() != iterator.getContainer())
378  {
380  throw e;
381  }
382 
383  return !(Base::getTraits().operator < (iterator.getTraits()));
384  }
385 
386  template <class Predicate, class IteratorRandomAccess>
388  (const ConstRandomAccessFilterIterator& iterator) const
389  {
390  if (!Base::getTraits().isValid())
391  {
393  throw e;
394  }
395  if (!iterator.isValid())
396  {
398  throw e;
399  }
400  if (Base::getTraits().getContainer() != iterator.getContainer())
401  {
403  throw e;
404  }
405 
406  return (Base::getTraits().operator > (iterator.getTraits()));
407  }
408 
409  template <class Predicate, class IteratorRandomAccess>
412  {
413  ConstRandomAccessFilterIterator iterator(container);
414  iterator.toBegin();
415  return iterator;
416  }
417 
418  template <class Predicate, class IteratorRandomAccess>
421  {
422  ConstRandomAccessFilterIterator iterator(container);
423  iterator.toEnd();
424  return iterator;
425  }
426 
427  template <class Predicate, class IteratorRandomAccess>
430  {
431  ConstRandomAccessFilterIterator iterator(container);
432  iterator.toRBegin();
433  return iterator;
434  }
435 
436  template <class Predicate, class IteratorRandomAccess>
439  {
440  ConstRandomAccessFilterIterator iterator(container);
441  iterator.toREnd();
442  return iterator;
443  }
444 
449 
452  template <class Predicate, class IteratorRandomAccess>
454  : public ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>
455  {
456  public:
457 
461 
463  typedef typename IteratorRandomAccess::container_type Container;
465  typedef typename IteratorRandomAccess::value_type value_type;
467  typedef typename IteratorRandomAccess::difference_type difference_type;
469  typedef typename IteratorRandomAccess::pointer pointer;
471  typedef typename IteratorRandomAccess::reference reference;
475 
479 
482 
486  {
487  }
488 
491  : Base(iterator)
492  {
493  }
494 
498 
505  reference operator [] (Index index) const { return const_cast<reference>(Base::getTraits().getData(index)); }
507  reference operator * () const { return const_cast<reference>(Base::getTraits().getData()); }
509  pointer operator -> () const { return const_cast<pointer>(&Base::getTraits().getData()); }
511 
519  static RandomAccessFilterIterator begin(const Container& container);
520 
525  static RandomAccessFilterIterator end(const Container& container);
526 
531  static RandomAccessFilterIterator rbegin(const Container& container);
532 
537  static RandomAccessFilterIterator rend(const Container& container);
539 
540  protected:
541 
543  : Base(container)
544  {
545  }
546 
547  };
549 
550  template <class Predicate, class IteratorRandomAccess>
551  RandomAccessFilterIterator<Predicate, IteratorRandomAccess>
553  {
554  RandomAccessFilterIterator iterator(container);
555  iterator.toBegin();
556  return iterator;
557  }
558 
559  template <class Predicate, class IteratorRandomAccess>
562  {
563  RandomAccessFilterIterator iterator(container);
564  iterator.toEnd();
565  return iterator;
566  }
567 
568  template <class Predicate, class IteratorRandomAccess>
571  {
572  RandomAccessFilterIterator iterator(container);
573  iterator.toRBegin();
574  return iterator;
575  }
576 
577  template <class Predicate, class IteratorRandomAccess>
580  {
581  RandomAccessFilterIterator iterator(container);
582  iterator.toREnd();
583  return iterator;
584  }
585 
586 } // namespace BALL
587 
588 #endif // BALL_KERNEL_RANDOMACCESSFILTERITERATOR_H