BALL  1.4.1
forwardIterator.h
Go to the documentation of this file.
00001 // -*- Mode: C++; tab-width: 2; -*-
00002 // vi: set ts=2:
00003 //
00004 
00005 #ifndef BALL_CONCEPT_FORWARDITERATOR_H
00006 #define BALL_CONCEPT_FORWARDITERATOR_H
00007 
00008 #ifndef BALL_CONCEPT_BASEITERATOR_H
00009 # include <BALL/CONCEPT/baseIterator.h>
00010 #endif
00011 
00012 namespace BALL 
00013 {
00014 
00020 
00023   template <typename Container, typename DataType, typename Position, typename Traits>
00024   class ConstForwardIterator
00025     : public BaseIterator<Container, DataType, Position, Traits>
00026   {
00027     public:
00028   
00032 
00034     typedef std::forward_iterator_tag iterator_category;
00035     // convenience typedef
00036     typedef BaseIterator<Container, DataType, Position, Traits> Base;
00038 
00042 
00044     BALL_INLINE ConstForwardIterator()  {}
00045   
00047     BALL_INLINE ConstForwardIterator(const ConstForwardIterator& iterator) 
00048       : BaseIterator<Container, DataType, Position, Traits>(iterator)
00049     {
00050     }
00051       
00053     BALL_INLINE ~ConstForwardIterator()  {}
00054 
00056 
00060 
00061     BALL_INLINE ConstForwardIterator& operator = (const ConstForwardIterator& iterator) 
00062     {
00063       BaseIterator<Container, DataType, Position, Traits>::operator = (iterator);
00064       return *this;
00065     }
00066 
00068     BALL_INLINE void swap(ConstForwardIterator& iterator)  { std::swap(ConstForwardIterator<Container, DataType, Position, Traits>::getTraits(), iterator.getTraits()); }
00070 
00074 
00078     BALL_INLINE void toBegin();
00079 
00081     BALL_INLINE bool isBegin() const;
00082 
00086     BALL_INLINE void toEnd();
00087 
00089     BALL_INLINE bool isEnd() const;
00090 
00094     static ConstForwardIterator begin(const Container& container);
00095 
00099     static ConstForwardIterator end(const Container& container);
00100 
00104     BALL_INLINE ConstForwardIterator& operator ++ ()
00105     {
00106       BALL_PRECONDITION_EXCEPTION(Base::isValid(), "cannot increment invalid iterator")
00107       Base::getTraits().forward();
00108       return *this;
00109     }
00110 
00114     BALL_INLINE ConstForwardIterator operator ++ (int)
00115     {
00116       BALL_PRECONDITION_EXCEPTION(Base::isValid(), "cannot increment invalid iterator")
00117       ConstForwardIterator tmp(*this);
00118       ++(*this);
00119       return tmp;
00120     }
00121  
00123 
00124     protected:
00125 
00127     BALL_INLINE ConstForwardIterator(const Container& container) 
00128       : BaseIterator<Container, DataType, Position, Traits>(container)
00129     {
00130     }
00131   };
00133 
00134   template <typename Container, typename DataType, typename Position, typename Traits>
00135   BALL_INLINE
00136   void ConstForwardIterator<Container, DataType, Position, Traits>::toBegin()
00137   {
00138     BALL_PRECONDITION_EXCEPTION(!Base::isSingular(),  "cannot move singular iterator to begin")
00139     Base::getTraits().toBegin();
00140   }
00141 
00142   template <typename Container, typename DataType, typename Position, typename Traits>
00143   BALL_INLINE
00144   ConstForwardIterator<Container, DataType, Position, Traits> 
00145     ConstForwardIterator<Container, DataType, Position, Traits>::begin(const Container& container)
00146   {
00147     ConstForwardIterator<Container, DataType, Position, Traits> iterator(container);
00148     iterator.toBegin();
00149     return iterator;
00150   }
00151 
00152   template <typename Container, typename DataType, typename Position, typename Traits>
00153   BALL_INLINE
00154   bool ConstForwardIterator<Container, DataType, Position, Traits>::isBegin() const
00155     
00156   {
00157     if (Base::getTraits().isSingular())
00158     {
00159       return false;
00160     }
00161     return Base::getTraits().isBegin();
00162   }
00163 
00164   template <typename Container, typename DataType, typename Position, typename Traits>
00165   BALL_INLINE
00166   void ConstForwardIterator<Container, DataType, Position, Traits>::toEnd()
00167   {
00168     BALL_PRECONDITION_EXCEPTION(!Base::isSingular(), "cannot move singular iterator to end")
00169     Base::getTraits().toEnd();
00170   }
00171 
00172   template <typename Container, typename DataType, typename Position, typename Traits>
00173   BALL_INLINE
00174   ConstForwardIterator<Container, DataType, Position, Traits> 
00175     ConstForwardIterator<Container, DataType, Position, Traits>::end(const Container& container)
00176   {
00177     ConstForwardIterator iterator(container);
00178     iterator.toEnd();
00179     return iterator;
00180   }
00181 
00182   template <typename Container, typename DataType, typename Position, typename Traits>
00183   BALL_INLINE
00184   bool ConstForwardIterator<Container, DataType, Position, Traits>::isEnd() const
00185     
00186   {
00187     if (Base::isSingular())
00188     {
00189       return false;
00190     }
00191     return Base::getTraits().isEnd();
00192   }
00193       
00196   template <typename Container, typename DataType, typename Position, typename Traits>
00197   class ForwardIterator
00198     : public ConstForwardIterator<Container, DataType, Position, Traits>
00199   {
00200     public:
00201 
00205 
00207     typedef DataType& reference;
00209     typedef DataType* pointer;
00210     // convenience typedef    
00211     typedef ConstForwardIterator<Container, DataType, Position, Traits> Base;
00213 
00217 
00219     BALL_INLINE ForwardIterator()  {}
00220   
00222     BALL_INLINE ForwardIterator(const ForwardIterator& iterator) 
00223       : ConstForwardIterator<Container, DataType, Position, Traits>(iterator)
00224     {
00225     }
00226 
00228     BALL_INLINE ~ForwardIterator()  {}      
00230 
00234 
00235     BALL_INLINE ForwardIterator& operator = (const ForwardIterator& iterator) 
00236     {
00237       ConstForwardIterator<Container, DataType, Position, Traits>::operator = (iterator);
00238       return *this;
00239     }
00240 
00242     BALL_INLINE void swap(ForwardIterator& iterator)  { std::swap(Base::getTraits(), iterator.getTraits()); }
00244 
00248 
00252     static ForwardIterator begin(const Container& container);
00253 
00257     static ForwardIterator end(const Container& container);
00258 
00260     BALL_INLINE reference operator * () const  
00261     { 
00262       return (reference)Base::getTraits().getData(); 
00263     }
00264 
00266     BALL_INLINE pointer operator -> () const  
00267     { 
00268       return (pointer)&Base::getTraits().getData(); 
00269     }
00270 
00274     BALL_INLINE ForwardIterator& operator ++ ()
00275     {
00276       BALL_PRECONDITION_EXCEPTION(Base::isValid(), "cannot increment invalid iterator")
00277       Base::getTraits().forward();
00278       return *this;
00279     }
00280 
00284     BALL_INLINE ForwardIterator operator ++ (int)
00285     {
00286       BALL_PRECONDITION_EXCEPTION(Base::isValid(), "cannot increment invalid iterator")
00287       ForwardIterator tmp(*this);
00288       ++(*this);
00289       return tmp;
00290     }
00291 
00293 
00294     protected:
00295 
00297     BALL_INLINE ForwardIterator(const Container& container)   
00298       : Base(container)
00299     {
00300     }
00301   };
00302 
00303 
00304   template <typename Container, typename DataType, typename Position, typename Traits>
00305   BALL_INLINE
00306   ForwardIterator<Container, DataType, Position, Traits> 
00307     ForwardIterator<Container, DataType, Position, Traits>::begin(const Container& container)
00308   {
00309     ForwardIterator iterator(container);
00310     iterator.toBegin();
00311     return iterator;
00312   }
00313 
00314   template <typename Container, typename DataType, typename Position, typename Traits>
00315   BALL_INLINE
00316   ForwardIterator<Container, DataType, Position, Traits> 
00317     ForwardIterator<Container, DataType, Position, Traits>::end(const Container& container)
00318   {
00319     ForwardIterator iterator(container);
00320     iterator.toEnd();
00321     return iterator;
00322   }
00323 
00324 
00325 } // namespace BALL
00326 
00327 #endif // BALL_CONCEPT_FORWARDITERATOR_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines