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

formula/parsedFormula.hh
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   // **************************************************** FormulaSyntaxError **
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   // ********************************************************* ParsedFormula **
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];  // copy the data
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 } // namespace concepts
00125 
00126 #endif // parsedformula_hh
00127 

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