Go to the documentation of this file.00001
00004 #ifndef parsedformula_hh
00005 #define parsedformula_hh
00006
00007 #include "toolbox/sequence.hh"
00008 #include "formula.hh"
00009
00010
00011 namespace concepts {
00012
00013
00014
00020 class FormulaSyntaxError : public MissingFeature {
00021 public:
00025 FormulaSyntaxError(const std::string& errMsg) throw();
00026 protected:
00027 virtual std::ostream& info(std::ostream& os) const throw();
00028 };
00029
00030
00031
00055 template<uint dim>
00056 class ParsedFormulaBase {
00057 public:
00058 typedef concepts::Sequence<std::pair<std::string,std::string> > RepSeq;
00059
00060 ParsedFormulaBase() {
00061 for(uint i = 0; i < dim; ++i) {
00062 formula_[i] = "";
00063 len_[i] = 0;
00064 }
00065 }
00067 ParsedFormulaBase(const ParsedFormulaBase<dim>& frm) {
00068 for(uint i = 0; i < dim; ++i) {
00069 formula_[i] = frm.formula_[i];
00070 pgm_[i] = frm.pgm_[i];
00071 len_[i] = frm.len_[i];
00072 }
00073 }
00075 void set(const std::string formula, uint i = 0,
00076 RepSeq rep = RepSeq());
00077 protected:
00079 Real process_(const Real3d& p, uint i = 0) const;
00081 std::string formula_[dim];
00082 private:
00084 Array<uchar> pgm_[dim];
00086 uint len_[dim];
00087 };
00088
00089 template<class F = Real>
00090 class ParsedFormula {};
00091
00092 template<>
00093 class ParsedFormula<Real> : public Formula<Real>, public ParsedFormulaBase<1> {
00094 public:
00096 ParsedFormula(const std::string formula);
00097 virtual ~ParsedFormula();
00098 virtual ParsedFormula<Real>* clone() const;
00099
00100 virtual Real operator() (const Real p, const Real t = 0.0) const;
00101 virtual Real operator() (const Real2d& p, const Real t = 0.0) const;
00102 virtual Real operator() (const Real3d& p, const Real t = 0.0) const;
00103 protected:
00104 virtual std::ostream& info(std::ostream& os) const;
00105 };
00106
00107 template<>
00108 class ParsedFormula<Cmplx> : public Formula<Cmplx>, public ParsedFormulaBase<2>
00109 {
00110 public:
00112 ParsedFormula(const std::string formulaR, const std::string formulaI);
00113 virtual ~ParsedFormula();
00114 virtual ParsedFormula<Cmplx>* clone() const;
00115
00116 virtual Cmplx operator() (const Real p, const Real t = 0.0) const;
00117 virtual Cmplx operator() (const Real2d& p, const Real t = 0.0) const;
00118 virtual Cmplx operator() (const Real3d& p, const Real t = 0.0) const;
00119 protected:
00120 virtual std::ostream& info(std::ostream& os) const;
00121 };
00122
00123
00124 }
00125
00126 #endif // parsedformula_hh
00127