From be034eae500e5404a8c1cab56d16a11c57b2b0f9 Mon Sep 17 00:00:00 2001 From: Luca Heltai Date: Mon, 7 Mar 2005 15:52:46 +0000 Subject: [PATCH] Encapsulated the library in its own namespace, added a very short function to get the number of parsed variables. git-svn-id: https://svn.dealii.org/trunk@10031 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/contrib/functionparser/fparser.cc | 1 + deal.II/contrib/functionparser/fparser.h | 171 +++++++++++----------- 2 files changed, 89 insertions(+), 83 deletions(-) diff --git a/deal.II/contrib/functionparser/fparser.cc b/deal.II/contrib/functionparser/fparser.cc index 911712ad12..65c815cd2b 100644 --- a/deal.II/contrib/functionparser/fparser.cc +++ b/deal.II/contrib/functionparser/fparser.cc @@ -31,6 +31,7 @@ #include using namespace std; +using namespace fparser; #ifndef M_PI #define M_PI 3.1415926535897932384626433832795 diff --git a/deal.II/contrib/functionparser/fparser.h b/deal.II/contrib/functionparser/fparser.h index aee49a25c8..865136c2f7 100644 --- a/deal.II/contrib/functionparser/fparser.h +++ b/deal.II/contrib/functionparser/fparser.h @@ -16,64 +16,68 @@ #include #endif -class FunctionParser -{ -public: - enum ParseErrorType +namespace fparser { + class FunctionParser { - SYNTAX_ERROR=0, MISM_PARENTH, MISSING_PARENTH, EMPTY_PARENTH, - EXPECT_OPERATOR, OUT_OF_MEMORY, UNEXPECTED_ERROR, INVALID_VARS, - ILL_PARAMS_AMOUNT, PREMATURE_EOS, EXPECT_PARENTH_FUNC, - FP_NO_ERROR - }; + public: + enum ParseErrorType + { + SYNTAX_ERROR=0, MISM_PARENTH, MISSING_PARENTH, EMPTY_PARENTH, + EXPECT_OPERATOR, OUT_OF_MEMORY, UNEXPECTED_ERROR, INVALID_VARS, + ILL_PARAMS_AMOUNT, PREMATURE_EOS, EXPECT_PARENTH_FUNC, + FP_NO_ERROR + }; - int Parse(const std::string& Function, const std::string& Vars, - bool useDegrees = false); - const char* ErrorMsg() const; - inline ParseErrorType GetParseErrorType() const { return parseErrorType; } + int Parse(const std::string& Function, const std::string& Vars, + bool useDegrees = false); + const char* ErrorMsg() const; + inline ParseErrorType GetParseErrorType() const { return parseErrorType; } - double Eval(const double* Vars); - inline int EvalError() const { return evalErrorType; } + double Eval(const double* Vars); + inline int EvalError() const { return evalErrorType; } - bool AddConstant(const std::string& name, double value); + bool AddConstant(const std::string& name, double value); - typedef double (*FunctionPtr)(const double*); + typedef double (*FunctionPtr)(const double*); - bool AddFunction(const std::string& name, - FunctionPtr, unsigned paramsAmount); - bool AddFunction(const std::string& name, FunctionParser&); + bool AddFunction(const std::string& name, + FunctionPtr, unsigned paramsAmount); + bool AddFunction(const std::string& name, FunctionParser&); - void Optimize(); + void Optimize(); - FunctionParser(); - ~FunctionParser(); + FunctionParser(); + ~FunctionParser(); - // Copy constructor and assignment operator (implemented using the - // copy-on-write technique for efficiency): - FunctionParser(const FunctionParser&); - FunctionParser& operator=(const FunctionParser&); + // Copy constructor and assignment operator (implemented using the + // copy-on-write technique for efficiency): + FunctionParser(const FunctionParser&); + FunctionParser& operator=(const FunctionParser&); #ifdef FUNCTIONPARSER_SUPPORT_DEBUG_OUTPUT - // For debugging purposes only: - void PrintByteCode(std::ostream& dest) const; + // For debugging purposes only: + void PrintByteCode(std::ostream& dest) const; #endif + // Added by Luca Heltai. For consistency checking. + unsigned int NVars() { + return data->varAmount; + }; + //======================================================================== + private: + //======================================================================== -//======================================================================== -private: -//======================================================================== - -// Private data: -// ------------ - ParseErrorType parseErrorType; - int evalErrorType; + // Private data: + // ------------ + ParseErrorType parseErrorType; + int evalErrorType; - struct Data - { + struct Data + { unsigned referenceCounter; int varAmount; @@ -88,8 +92,8 @@ private: VarMap_t FuncPtrNames; struct FuncPtrData { - FunctionPtr ptr; unsigned params; - FuncPtrData(FunctionPtr p, unsigned par): ptr(p), params(par) {} + FunctionPtr ptr; unsigned params; + FuncPtrData(FunctionPtr p, unsigned par): ptr(p), params(par) {} }; std::vector FuncPtrs; @@ -108,48 +112,49 @@ private: Data(const Data&); Data& operator=(const Data&); // not implemented on purpose + }; + + Data* data; + + // Temp data needed in Compile(): + unsigned StackPtr; + std::vector* tempByteCode; + std::vector* tempImmed; + + + // Private methods: + // --------------- + inline void copyOnWrite(); + + + bool checkRecursiveLinking(const FunctionParser*) const; + + bool isValidName(const std::string&) const; + Data::VarMap_t::const_iterator FindVariable(const char*, + const Data::VarMap_t&) const; + Data::ConstMap_t::const_iterator FindConstant(const char*) const; + int CheckSyntax(const char*); + bool Compile(const char*); + bool IsVariable(int); + void AddCompiledByte(unsigned); + void AddImmediate(double); + void AddFunctionOpcode(unsigned); + inline void incStackPtr(); + int CompileIf(const char*, int); + int CompileFunctionParams(const char*, int, unsigned); + int CompileElement(const char*, int); + int CompilePow(const char*, int); + int CompileUnaryMinus(const char*, int); + int CompileMult(const char*, int); + int CompileAddition(const char*, int); + int CompileComparison(const char*, int); + int CompileAnd(const char*, int); + int CompileOr(const char*, int); + int CompileExpression(const char*, int, bool=false); + + + void MakeTree(void*) const; }; - - Data* data; - - // Temp data needed in Compile(): - unsigned StackPtr; - std::vector* tempByteCode; - std::vector* tempImmed; - - -// Private methods: -// --------------- - inline void copyOnWrite(); - - - bool checkRecursiveLinking(const FunctionParser*) const; - - bool isValidName(const std::string&) const; - Data::VarMap_t::const_iterator FindVariable(const char*, - const Data::VarMap_t&) const; - Data::ConstMap_t::const_iterator FindConstant(const char*) const; - int CheckSyntax(const char*); - bool Compile(const char*); - bool IsVariable(int); - void AddCompiledByte(unsigned); - void AddImmediate(double); - void AddFunctionOpcode(unsigned); - inline void incStackPtr(); - int CompileIf(const char*, int); - int CompileFunctionParams(const char*, int, unsigned); - int CompileElement(const char*, int); - int CompilePow(const char*, int); - int CompileUnaryMinus(const char*, int); - int CompileMult(const char*, int); - int CompileAddition(const char*, int); - int CompileComparison(const char*, int); - int CompileAnd(const char*, int); - int CompileOr(const char*, int); - int CompileExpression(const char*, int, bool=false); - - - void MakeTree(void*) const; -}; +} #endif -- 2.39.5