Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)

toolbox/inputOutput.hh
Go to the documentation of this file.
00001 /* -*- c++ -*-
00002  * parsing an input file, holding parameters, producing output
00003  */
00004 
00005 #ifndef inputOutput_hh
00006 #define inputOutput_hh
00007 
00008 #include <iostream>
00009 #include <string>
00010 #include <cstring>
00011 #include <map>
00012 #include <complex>
00013 #include <limits.h>
00014 
00015 #include "basics/exceptions.hh"
00016 #include "basics/outputOperator.hh"
00017 #include "toolbox/multiArray.hh"
00018 
00019 namespace concepts {
00020 
00021   // ****************************************************** MissingParameter **
00022 
00028   class MissingParameter : public MissingFeature {
00029   public:
00033     MissingParameter(const std::string& parameter) throw();
00034   protected:
00035     virtual std::ostream& info(std::ostream& os) const throw();
00036   };
00037 
00038   // ******************************************************* InOutParameters **
00039 
00040   struct ltstr {
00041     bool operator()(const char* s1, const char* s2) const {
00042       return std::strcmp(s1, s2) < 0;
00043     }
00044   };
00045 
00046   struct ltidx {
00047     bool operator()(const MultiIndex<2>& i1, const MultiIndex<2>& i2) const {
00048       return (i1[0] < i2[0]) || (i1[0] == i2[0] && i1[1] < i2[1]);
00049     }
00050   };
00051 
00073   class InOutParameters : public OutputOperator {
00074   public:
00076     InOutParameters() {}
00078     InOutParameters(const InOutParameters& i);
00079     virtual ~InOutParameters();
00084     void append(const InOutParameters& inout, bool arrayAppend = true);
00085 
00087     void addDouble(const char* name, const double value);
00089     void addComplex(const char* name, const std::complex<double> value);
00091     void addString(const char* name, const char* value);
00093     void addInt(const char* name, const int value);
00095     void addBool(const char* name, const int value);
00096 
00098     double getDouble(const char* name) const;
00100     std::complex<double> getComplex(const char* name) const;
00105     std::string getString(const char* name, const char* value = 0) const;
00110     int getInt(const char* name, const int value = INT_MAX) const;
00112     bool getBool(const char* name) const;
00117     bool getBool(const char* name, const bool value) const;
00118 
00123     void addArrayDouble(const char* array, const bool newArray = false);
00128     void addArrayComplex(const char* array, const bool newArray = false);
00133     void addArrayString(const char* array, const bool newArray = false);
00138     void addArrayInt(const char* array, const bool newArray = false);
00143     void addArrayBool(const char* array, const bool newArray = false);
00144 
00153     void addArrayDouble(const char* array, const int number, 
00154       const double value);
00163     void addArrayComplex(const char* array, const int number, 
00164        const std::complex<double> value);
00173     void addArrayString(const char* array, const int number, 
00174       const char* value);
00183     void addArrayInt(const char* array, const int number, const int value);
00192     void addArrayBool(const char* array, const int number, const int value);
00193 
00199     double getArrayDouble(const char* array, const int number) const;
00205     std::complex<double> getArrayComplex(const char* array,
00206            const int number) const;
00212     std::string getArrayString(const char* array, const int number) const;
00218     int getArrayInt(const char* array, const int number) const;
00224     bool getArrayBool(const char* array, const int number) const;
00225 
00229     const std::map<int, double>& getMapDouble(const char* array) const;
00233     const std::map<int, std::complex<double> >&
00234     getMapComplex(const char* array) const;
00238     const std::map<int, std::string>& getMapString(const char* array) const;
00242     const std::map<int, int>& getMapInt(const char* array) const;
00246     const std::map<int, bool>& getMapBool(const char* array) const;
00247 
00248 
00253     void addMatrixDouble(const char* array, const bool newMatrix = false); 
00258     void addMatrixInt(const char* array, const bool newMatrix = false); 
00259     
00269     void addMatrixDouble(const char* matrix, const int i, const int j, 
00270        const double value);
00280     void addMatrixInt(const char* matrix, const int i, const int j, 
00281           const int value);
00282       
00289     double getMatrixDouble(const char* array, const int i, const int j) const;
00296     int getMatrixInt(const char* array, const int i, const int j) const;
00297     
00298 
00300     void clear();
00305     void storeMatlab(const char* filename,
00306          const std::string description = "") const;
00312     std::ostream& storeMatlab(std::ostream& os, const char* name, 
00313             const std::string description = "") const;
00314   protected:
00315     virtual std::ostream& info(std::ostream& os) const;
00316   private:
00318     std::map<const char*, double, ltstr> double_;
00320     std::map<const char*, std::complex<double>, ltstr> complex_;
00322     std::map<const char*, std::string, ltstr> string_;
00324     std::map<const char*, int, ltstr> int_;
00326     std::map<const char*, bool, ltstr> bool_;
00327 
00329     std::map<const char*, std::map<int, double>*, ltstr> doubleArrays_;
00331     std::map
00332     <const char*, std::map<int, std::complex<double> >*, ltstr> complexArrays_;
00334     std::map<const char*, std::map<int, std::string>*, ltstr> stringArrays_;
00336     std::map<const char*, std::map<int, int>*, ltstr> intArrays_;
00338     std::map<const char*, std::map<int, bool>*, ltstr> boolArrays_;
00339     
00341     std::map<const char*,
00342        std::map<MultiIndex<2>, double, ltidx>*, ltstr> doubleMatrices_;
00344     std::map<const char*,
00345        std::map<MultiIndex<2>, int, ltidx>*, ltstr> intMatrices_;
00346     
00348     template<class F>
00349     void mapOutputMatlab_(std::ostream& os,
00350         const std::map<const char*, F, ltstr>& map) const;
00352     template<class F>
00353     void mapArrayOutputMatlab_(std::ostream& os, const std::map
00354              <const char*, std::map<int, F>*, ltstr> & map,
00355              const std::string brackets = "[]") const;
00357     template<class F>
00358     void mapMatrixOutputMatlab_
00359     (std::ostream& os, const std::map
00360      <const char*, std::map<MultiIndex<2>, F, ltidx>*, ltstr> & map,
00361      const std::string brackets = "[]") const;
00362 
00364     template<class F>
00365     void add_(std::map<const char*, F, ltstr>& map, const char* name,
00366         const F value);
00367 
00368     template<class F>
00369     F get_(const std::map<const char*, F, ltstr>& map, const char* name) const;
00370 
00371     template<class F, class G, class H>
00372     void addArray_(std::map<const char*, std::map<F, G, H>*, ltstr>& map,
00373        const char* array, const bool newArray = false);
00374 
00375     template<class F, class G, class H>
00376     void addArray_(std::map<const char*, std::map<F, G, H>*, ltstr>& map,
00377        const char* array, const F number, const G value);
00378 
00379     template<class F, class G, class H>
00380     G getArray_(const std::map<const char*, std::map<F, G, H>*, ltstr>& map,
00381     const char* array, const F number) const; 
00382 
00383     template<class F>
00384     const std::map<int, F>& 
00385     getMap_(const std::map<const char*, std::map<int, F>*, ltstr>& map, 
00386       const char* array) const;
00387 
00389     template<class F>
00390     void clear_(std::map<const char*, F, ltstr>& map);
00391 
00392     template<class F, class G>
00393     void clear_(std::map<const char*, std::map<G, F>*, ltstr>& map);
00394   };
00395 
00396   // *********************************************************** InputParser **
00397 
00436   class InputParser : public OutputOperator {
00437   public:
00444     InputParser(bool quiet = false);
00445 
00446     virtual ~InputParser();
00447 
00449     void parse();
00451     void parse(std::string file);
00452 
00454     InOutParameters& inputParameters() { return input_; }
00455 
00457     InOutParameters& outputParameters() { return output_; }
00458 
00460     typedef struct yy_buffer_state *YY_BUFFER_STATE;
00461   protected:
00462     virtual std::ostream& info(std::ostream& os) const;
00463   private:
00465     YY_BUFFER_STATE current_buffer_;
00466 
00468     InOutParameters input_;
00469 
00471     InOutParameters output_;
00472 
00474     bool quiet_;
00475   };
00476 
00477 } // namespace
00478 
00479 #endif // inputOutput_hh

Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)