ESyS-Particle  4.0.1
IterativeReader.hpp
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 namespace esys
00015 {
00016   namespace lsm
00017   {
00018     template <class TmplData>
00019     IStreamIterator<TmplData>::IStreamIterator(std::istream &iStream, int numParticles)
00020       : m_pIStream(&iStream),
00021         m_numRemaining(numParticles)
00022     {
00023     }
00024 
00025     template <class TmplData>
00026     IStreamIterator<TmplData>::~IStreamIterator()
00027     {
00028     }
00029 
00030     template <class TmplData>
00031     bool IStreamIterator<TmplData>::hasNext() const
00032     {
00033       return (m_numRemaining > 0);
00034     }
00035 
00036     template <class TmplData>
00037     void IStreamIterator<TmplData>::readDataFromStream()
00038     {
00039       m_data.read(*m_pIStream);
00040     }
00041 
00042     template <class TmplData>
00043     const TmplData &IStreamIterator<TmplData>::next()
00044     {
00045       m_numRemaining--;
00046       readDataFromStream();
00047       return m_data;
00048     }
00049 
00050     template <class TmplData>
00051     int IStreamIterator<TmplData>::getNumRemaining() const
00052     {
00053       return m_numRemaining;
00054     }
00055 
00056 //===============================================================================
00057     template <class TmplIterator>
00058     IterativeReader<TmplIterator>::IterativeReader(std::istream &iStream)
00059       : m_numElements(-1),
00060         m_pIStream(&iStream),
00061         m_iteratorPtr()
00062     {
00063     }
00064 
00065     template <class TmplIterator>
00066     IterativeReader<TmplIterator>::~IterativeReader()
00067     {
00068     }
00069         
00070     template <class TmplIterator>
00071     int IterativeReader<TmplIterator>::getNumElements() const
00072     {
00073       return m_numElements;
00074     }
00075 
00076     template <class TmplIterator>
00077     void IterativeReader<TmplIterator>::setNumElements(int numElements)
00078     {
00079       m_numElements = numElements;
00080     }
00081 
00082     template <class TmplIterator>
00083     std::istream &IterativeReader<TmplIterator>::getIStream()
00084     {
00085       return *m_pIStream;
00086     }
00087 
00088     template <class TmplIterator>
00089     const std::istream &IterativeReader<TmplIterator>::getIStream() const
00090     {
00091       return *m_pIStream;
00092     }
00093 
00094     template <class TmplIterator>
00095     TmplIterator *IterativeReader<TmplIterator>::createNewIterator()
00096     {
00097       return new TmplIterator(*m_pIStream, getNumElements());
00098     }
00099 
00100     template <class TmplIterator>
00101     void IterativeReader<TmplIterator>::initialise()
00102     {
00103       m_iteratorPtr = IteratorAutoPtr(createNewIterator());
00104     }
00105 
00106     template <class TmplIterator>
00107     bool IterativeReader<TmplIterator>::isInitialised() const
00108     {
00109       return (m_iteratorPtr.get() != NULL);
00110     }
00111     
00112     template <class TmplIterator>
00113     typename IterativeReader<TmplIterator>::Iterator &IterativeReader<TmplIterator>::getIterator()
00114     {
00115       if (!isInitialised())
00116       {
00117         initialise();
00118       }
00119       return (*(m_iteratorPtr));
00120     }
00121   };
00122 };