BALL  1.4.1
randomAccessFilterIterator.h
Go to the documentation of this file.
00001 #ifndef BALL_LINALG_RANDOMACCESSFILTERITERATOR_H
00002 #define BALL_LINALG_RANDOMACCESSFILTERITERATOR_H
00003 
00004 #ifndef BALL_LINALG_BIDIRECTIONALFILTERITERATOR_H
00005 # include <BALL/MATHS/LINALG/bidirectionalFilterIterator.h>
00006 #endif
00007 
00008 namespace BALL 
00009 {
00011     typedef int Distance;
00013     typedef int Index;
00014 
00019   template <class Predicate, class IteratorRandomAccess>
00020   class ConstRandomAccessFilterIterator
00021     : public ConstBidirectionalFilterIterator<Predicate, IteratorRandomAccess>
00022   {
00023     public:
00024 
00028 
00029     
00031     typedef typename IteratorRandomAccess::difference_type  difference_type;
00033     typedef typename IteratorRandomAccess::value_type value_type;
00035     typedef typename IteratorRandomAccess::container_type Container;
00037     typedef typename IteratorRandomAccess::value_type DataType;
00039     typedef typename IteratorRandomAccess::difference_type  Position;
00041     typedef typename IteratorRandomAccess::traits_type  Traits;
00043     typedef typename IteratorRandomAccess::pointer  pointer;
00045     typedef typename IteratorRandomAccess::reference  reference;
00047           typedef std::random_access_iterator_tag iterator_category;
00048     // convenience typedef
00049     typedef ConstBidirectionalFilterIterator<Predicate, IteratorRandomAccess> Base;
00051 
00055 
00057     ConstRandomAccessFilterIterator() {}
00058 
00060     ConstRandomAccessFilterIterator(Predicate p, IteratorRandomAccess it)
00061       :     ConstBidirectionalFilterIterator<Predicate, IteratorRandomAccess>(p,it)
00062     {
00063     }
00064   
00066     ConstRandomAccessFilterIterator(const ConstRandomAccessFilterIterator& iterator)
00067       : Base(iterator)
00068     {
00069     }
00070 
00072     ~ConstRandomAccessFilterIterator() {}
00074 
00075 
00076 
00080     
00084     ConstRandomAccessFilterIterator& operator += (Distance distance);
00085 
00089     ConstRandomAccessFilterIterator& operator -= (Distance distance);
00090 
00095     ConstRandomAccessFilterIterator operator + (Distance distance) const;
00096 
00102     ConstRandomAccessFilterIterator operator - (Distance distance) const;
00103 
00110     Distance operator - (const ConstRandomAccessFilterIterator& iterator) const;
00111 
00116     static ConstRandomAccessFilterIterator begin(const Container& container);
00117 
00122     static ConstRandomAccessFilterIterator end(const Container& container);
00123 
00128     static ConstRandomAccessFilterIterator rbegin(const Container& container);
00129 
00134     static ConstRandomAccessFilterIterator rend(const Container& container);
00135 
00137 
00141 
00143     bool operator + () const { return Base::getTraits().isValid(); }
00144 
00146     bool operator - () const { return !Base::getTraits().isValid(); }
00147 
00154     bool operator < (const ConstRandomAccessFilterIterator& iterator) const;
00155 
00163     bool operator <= (const ConstRandomAccessFilterIterator& iterator) const;
00164 
00172     bool operator >= (const ConstRandomAccessFilterIterator& iterator) const;
00173 
00180     bool operator > (const ConstRandomAccessFilterIterator& iterator) const;
00181 
00183 
00184       
00185 
00192     const DataType& operator [] (Index index) const
00193     {
00194       if (!Base::getTraits().isValid())
00195       {
00196         Exception::InvalidIterator e;
00197         throw e;
00198       }
00199       
00200       return Base::iterator_[index];
00201     };
00203 
00204     protected:
00205 
00206     ConstRandomAccessFilterIterator(const Container& container)
00207       : Base(container)
00208     {
00209     }
00210   };
00212   
00218   template <class Predicate, class IteratorRandomAccess>
00219   ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess> operator + 
00220     (Distance distance, const ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>& iterator) 
00221   {
00222     ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess> tmp_iterator(iterator);
00223     return (tmp_iterator += distance);
00224   }
00225 
00232   template <class Predicate, class IteratorRandomAccess>
00233   Distance ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::operator -
00234     (const ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>& b) const
00235   {
00236     if (!Base::getTraits().isValid())
00237     {
00238       Exception::InvalidIterator e;
00239       throw e;
00240     }
00241     if (!b.getTraits().isValid())
00242     {
00243       Exception::InvalidIterator e;
00244       throw e;
00245     }
00246     if (Base::getTraits().getContainer() != b.getTraits().getContainer())
00247     {
00248       Exception::IncompatibleIterators e;
00249       throw e;
00250     }
00251     return Base::getTraits().getDistance(b.getTraits());
00252   }
00253 
00254   template <class Predicate, class IteratorRandomAccess>
00255   ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>&
00256     ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::operator += (Distance distance)
00257   {
00258     if (!Base::getTraits().isValid())
00259     {
00260       Exception::InvalidIterator e;
00261       throw e;
00262     }
00263     if (distance < (Distance)0)
00264     {
00265       return (*this -= -distance);
00266     }
00267     Base::getTraits().forward(distance);
00268       
00269     while (!Base::isEnd() && !Base::predicate_(Base::getTraits().getData()))
00270       Base::getTraits().forward();
00271     return *this;
00272   }
00273 
00274   template <class Predicate, class IteratorRandomAccess>
00275   ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>&
00276     ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::operator -= (Distance distance)
00277   {
00278     if (Base::getTraits().isSingular())
00279     {
00280       Exception::InvalidIterator e;
00281       throw e;
00282     }
00283     if (distance < (Distance)0)
00284     {
00285       return (*this += -distance);
00286     }
00287     if (Base::getTraits().isEnd() == true)
00288     {
00289       Base::getTraits().toRBegin();
00290       Base::getTraits().backward(distance - 1);
00291     }
00292     else 
00293     {
00294       Base::getTraits().backward(distance);
00295       
00296       while (!Base::isBegin() && !Base::predicate_(Base::getTraits().getData()))
00297         Base::getTraits().backward();
00298     }
00299     return *this;
00300   }
00301 
00302   template <class Predicate, class IteratorRandomAccess>
00303   ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>
00304     ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::operator + (Distance distance) const
00305   {
00306     ConstRandomAccessFilterIterator iterator(*this);
00307     return (iterator += distance);
00308   }
00309 
00310   template <class Predicate, class IteratorRandomAccess>
00311   ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess> 
00312     ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::operator - (Distance distance) const
00313   {
00314     ConstRandomAccessFilterIterator iterator(*this);
00315     return (iterator -= distance);
00316   }
00317 
00318   template <class Predicate, class IteratorRandomAccess>
00319   bool ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::operator < 
00320     (const ConstRandomAccessFilterIterator& iterator) const
00321   {
00322     if (!Base::getTraits().isValid())
00323     {
00324       Exception::InvalidIterator e;
00325       throw e;
00326     }
00327     if (!iterator.isValid())
00328     {
00329       Exception::InvalidIterator e;
00330       throw e;        
00331     }
00332     if (Base::getTraits().getContainer() != iterator.getContainer())
00333     {
00334       Exception::IncompatibleIterators e;
00335       throw e;
00336     }
00337 
00338     return (Base::getTraits().operator < (iterator.getTraits()));
00339   }
00340 
00341   template <class Predicate, class IteratorRandomAccess>
00342   bool ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::operator <= 
00343     (const ConstRandomAccessFilterIterator& iterator) const
00344   {
00345     if (!Base::getTraits().isValid())
00346     {
00347       Exception::InvalidIterator e;
00348       throw e;  
00349     }
00350     if (!iterator.isValid())
00351     {
00352       Exception::InvalidIterator e;
00353       throw e;  
00354     }
00355     if (Base::getTraits().getContainer() != iterator.getContainer())
00356     {
00357       Exception::IncompatibleIterators e;
00358       throw e;
00359     }
00360     return !(Base::getTraits().operator > (iterator.getTraits()));
00361   }
00362 
00363   template <class Predicate, class IteratorRandomAccess>
00364   bool ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::operator >= 
00365     (const ConstRandomAccessFilterIterator& iterator) const
00366   {
00367     if (!Base::getTraits().isValid())
00368     {
00369       Exception::InvalidIterator e;
00370       throw e;
00371     }
00372     if (!iterator.isValid())
00373     {
00374       Exception::InvalidIterator e;
00375       throw e;
00376     }
00377     if (Base::getTraits().getContainer() != iterator.getContainer())
00378     {
00379       Exception::IncompatibleIterators e;
00380       throw e;
00381     }
00382 
00383     return !(Base::getTraits().operator < (iterator.getTraits()));
00384   }
00385 
00386   template <class Predicate, class IteratorRandomAccess>
00387   bool ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::operator > 
00388     (const ConstRandomAccessFilterIterator& iterator) const
00389   {
00390     if (!Base::getTraits().isValid())
00391     {
00392       Exception::InvalidIterator e;
00393       throw e;
00394     }
00395     if (!iterator.isValid())
00396     {
00397       Exception::InvalidIterator e;
00398       throw e;
00399     }
00400     if (Base::getTraits().getContainer() != iterator.getContainer())
00401     {
00402       Exception::IncompatibleIterators e;
00403       throw e;
00404     }
00405 
00406     return (Base::getTraits().operator > (iterator.getTraits()));
00407   }
00408 
00409   template <class Predicate, class IteratorRandomAccess>
00410   ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess> 
00411     ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::begin(const Container& container)
00412   {
00413     ConstRandomAccessFilterIterator iterator(container);
00414     iterator.toBegin();
00415     return iterator;
00416   }
00417 
00418   template <class Predicate, class IteratorRandomAccess>
00419   ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess> 
00420     ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::end(const Container& container)
00421   {
00422     ConstRandomAccessFilterIterator iterator(container);
00423     iterator.toEnd();
00424     return iterator;
00425   }
00426 
00427   template <class Predicate, class IteratorRandomAccess>
00428   ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess> 
00429     ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::rbegin(const Container& container)
00430   {
00431     ConstRandomAccessFilterIterator iterator(container);
00432     iterator.toRBegin();
00433     return iterator;
00434   }
00435 
00436   template <class Predicate, class IteratorRandomAccess>
00437   ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess> 
00438     ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>::rend(const Container& container)
00439   {
00440     ConstRandomAccessFilterIterator iterator(container);
00441     iterator.toREnd();
00442     return iterator;
00443   }
00444 
00449 
00452   template <class Predicate, class IteratorRandomAccess>
00453   class RandomAccessFilterIterator
00454     : public ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>
00455   {
00456     public:
00457 
00461     
00463     typedef typename IteratorRandomAccess::container_type Container;
00465     typedef typename IteratorRandomAccess::value_type value_type;
00467     typedef typename IteratorRandomAccess::difference_type  difference_type;
00469     typedef typename IteratorRandomAccess::pointer  pointer;
00471     typedef typename IteratorRandomAccess::reference  reference;
00473     typedef ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess> Base;
00475 
00479 
00481     RandomAccessFilterIterator() {}
00482 
00484     RandomAccessFilterIterator(Predicate p, IteratorRandomAccess it)
00485       :     ConstRandomAccessFilterIterator<Predicate, IteratorRandomAccess>(p,it)
00486     {
00487     }
00488   
00490     RandomAccessFilterIterator(const RandomAccessFilterIterator& iterator)
00491       : Base(iterator)
00492     {
00493     }
00494 
00496     ~RandomAccessFilterIterator() {}
00498 
00505     reference operator [] (Index index) const { return const_cast<reference>(Base::getTraits().getData(index)); }
00507     reference operator * () const { return const_cast<reference>(Base::getTraits().getData()); }
00509     pointer operator -> () const { return const_cast<pointer>(&Base::getTraits().getData()); }
00511 
00519     static RandomAccessFilterIterator begin(const Container& container);
00520 
00525     static RandomAccessFilterIterator end(const Container& container);
00526 
00531     static RandomAccessFilterIterator rbegin(const Container& container);
00532 
00537     static RandomAccessFilterIterator rend(const Container& container);
00539 
00540     protected:
00541 
00542     RandomAccessFilterIterator(const Container& container)
00543       : Base(container)
00544     {
00545     }
00546 
00547   };
00549   
00550   template <class Predicate, class IteratorRandomAccess>
00551   RandomAccessFilterIterator<Predicate, IteratorRandomAccess> 
00552     RandomAccessFilterIterator<Predicate, IteratorRandomAccess>::begin(const Container& container)
00553   {
00554     RandomAccessFilterIterator iterator(container);
00555     iterator.toBegin();
00556     return iterator;
00557   }
00558 
00559   template <class Predicate, class IteratorRandomAccess>
00560   RandomAccessFilterIterator<Predicate, IteratorRandomAccess> 
00561     RandomAccessFilterIterator<Predicate, IteratorRandomAccess>::end(const Container& container)
00562   {
00563     RandomAccessFilterIterator iterator(container);
00564     iterator.toEnd();
00565     return iterator;
00566   }
00567 
00568   template <class Predicate, class IteratorRandomAccess>
00569   RandomAccessFilterIterator<Predicate, IteratorRandomAccess> 
00570     RandomAccessFilterIterator<Predicate, IteratorRandomAccess>::rbegin(const Container& container)
00571   {
00572     RandomAccessFilterIterator iterator(container);
00573     iterator.toRBegin();
00574     return iterator;
00575   }
00576 
00577   template <class Predicate, class IteratorRandomAccess>
00578   RandomAccessFilterIterator<Predicate, IteratorRandomAccess> 
00579     RandomAccessFilterIterator<Predicate, IteratorRandomAccess>::rend(const Container& container)
00580   {
00581     RandomAccessFilterIterator iterator(container);
00582     iterator.toREnd();
00583     return iterator;
00584   }
00585 
00586 } // namespace BALL 
00587 
00588 #endif // BALL_KERNEL_RANDOMACCESSFILTERITERATOR_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines