ESyS-Particle  4.0.1
IterativeReader.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_LSMITERATIVEREADER_H
00015 #define ESYS_LSMITERATIVEREADER_H
00016 
00017 #include <sstream>
00018 #include <memory>
00019 
00020 namespace esys
00021 {
00022   namespace lsm
00023   {
00027     template <class TmplData>
00028     class IStreamIterator
00029     {
00030     public:
00031       typedef TmplData value_type;
00032       
00033       IStreamIterator(std::istream &iStream, int numElements);
00034 
00035       virtual ~IStreamIterator();
00036 
00041       bool hasNext() const;
00042 
00046       const TmplData &next();
00047 
00051       int getNumRemaining() const;
00052 
00053     protected:
00054       IStreamIterator(const IStreamIterator &it);
00055       IStreamIterator &operator=(const IStreamIterator &it);
00056 
00057       virtual void readDataFromStream();
00058       
00059       std::istream *m_pIStream;
00060       TmplData     m_data;
00061       int          m_numRemaining;
00062     };
00063 
00073     template <class TmplIterator>
00074     class IterativeReader
00075     {
00076     public:
00077       typedef TmplIterator Iterator;
00078       
00079       IterativeReader(std::istream &iStream);
00080 
00081       virtual ~IterativeReader();
00082 
00087       virtual void initialise();
00088 
00092       int getNumElements() const;
00093 
00098       bool isInitialised() const;
00099 
00100       Iterator &getIterator();
00101 
00102       protected:
00103         typedef std::auto_ptr<Iterator> IteratorAutoPtr;
00104 
00105         void setNumElements(int numElements);
00106 
00107         std::istream &getIStream();
00108 
00109         const std::istream &getIStream() const;
00110 
00115         virtual Iterator *createNewIterator();
00116 
00117       private:
00118         
00119         int             m_numElements;
00120         std::istream    *m_pIStream;
00121         IteratorAutoPtr m_iteratorPtr;
00122     };
00123   };
00124 };
00125 
00126 #include "Parallel/IterativeReader.hpp"
00127 
00128 #endif