00001
00002
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
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
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
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 }
00478
00479 #endif // inputOutput_hh