ESyS-Particle  4.0.1
StlIterator.h
00001 
00002 //                                                         //
00003 // Copyright (c) 2003-2011 by The University of Queensland //
00004 // Earth Systems Science Computational Centre (ESSCC)      //
00005 // http://www.uq.edu.au/esscc                              //
00006 //                                                         //
00007 // Primary Business: Brisbane, Queensland, Australia       //
00008 // Licensed under the Open Software License version 3.0    //
00009 // http://www.opensource.org/licenses/osl-3.0.php          //
00010 //                                                         //
00012 
00013 
00014 #ifndef ESYS_LSMSTLITERATOR_H
00015 #define ESYS_LSMSTLITERATOR_H
00016 
00017 #include <string>
00018 #include <vector>
00019 #include <sstream>
00020 
00021 namespace esys
00022 {
00023   namespace lsm
00024   {
00025     template <typename TmplIteratable>
00026     class ForwardConstIterator;
00027 
00028     template <typename TmplIteratable>
00029     class ForwardIterator
00030     {
00031     public:
00032       typedef typename TmplIteratable::value_type value_type;
00033       typedef typename TmplIteratable::reference  reference;
00034       typedef typename TmplIteratable::iterator   iterator;
00035 
00036       inline ForwardIterator(TmplIteratable &container)
00037         : m_it(container.begin()),
00038           m_end(container.end())
00039       {
00040       }
00041 
00042       inline ForwardIterator(const iterator &begin, const iterator &end)
00043         : m_it(begin),
00044           m_end(end)
00045       {
00046       }
00047 
00048       inline bool hasNext() const
00049       {
00050         return (m_it != m_end);
00051       }
00052 
00053       inline reference current() const
00054       {
00055         iterator it = m_it;
00056         it--;
00057         return *(it);
00058       }
00059 
00060       inline reference next()
00061       {
00062         reference ref = (*m_it);
00063         m_it++;
00064         return ref;
00065       }
00066 
00067       friend class ForwardConstIterator<TmplIteratable>;
00068 
00069     private:
00070       iterator m_it;
00071       iterator m_end;
00072     };
00073     
00074     template <typename TmplIteratable>
00075     class ForwardConstIterator
00076     {
00077     public:
00078       typedef typename TmplIteratable::value_type       value_type;
00079       typedef typename TmplIteratable::const_reference  reference;
00080       typedef typename TmplIteratable::const_iterator   iterator;
00081 
00082       inline ForwardConstIterator(const TmplIteratable &container)
00083         : m_it(container.begin()),
00084           m_end(container.end())
00085       {
00086       }
00087 
00088       inline ForwardConstIterator(const iterator &begin, const iterator &end)
00089         : m_it(begin),
00090           m_end(end)
00091       {
00092       }
00093 
00094       inline ForwardConstIterator(const ForwardIterator<TmplIteratable> &it)
00095         : m_it(it.m_it),
00096           m_end(it.m_end)
00097       {
00098       }
00099 
00100       inline bool hasNext() const
00101       {
00102         return (m_it != m_end);
00103       }
00104 
00105       inline reference current() const
00106       {
00107         iterator it = m_it;
00108         it--;
00109         return *(it);
00110       }
00111 
00112       inline reference next()
00113       {
00114         reference ref = (*m_it);
00115         m_it++;
00116         return ref;
00117       }
00118 
00119     private:
00120       iterator m_it;
00121       iterator m_end;
00122     };
00123   }
00124 }
00125 
00126 #endif