"Fossies" - the Fresh Open Source Software Archive 
Member "mathmod-11.1/fparser/fparser.hh" (17 Jun 2021, 8427 Bytes) of package /linux/misc/mathmod-11.1-source.zip:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "fparser.hh" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
11.0_vs_11.1.
1 /***************************************************************************\
2 |* Function Parser for C++ v4.5.2 *|
3 |*-------------------------------------------------------------------------*|
4 |* Copyright: Juha Nieminen, Joel Yliluoma *|
5 |* *|
6 |* This library is distributed under the terms of the *|
7 |* GNU Lesser General Public License version 3. *|
8 |* (See lgpl.txt and gpl.txt for the license text.) *|
9 \***************************************************************************/
10
11 #ifndef ONCE_FPARSER_H_
12 #define ONCE_FPARSER_H_
13
14 #include <string>
15 #include <vector>
16 #include <complex>
17 #ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
18 #include <iostream>
19 #endif
20
21 #ifdef _MSC_VER
22 // Visual Studio's warning about missing definitions for the explicit
23 // FunctionParserBase instantiations is irrelevant here.
24 #pragma warning(disable : 4661)
25 #endif
26
27 namespace FPoptimizer_CodeTree { template<typename Value_t> class CodeTree; }
28
29 template<typename Value_t>
30 class FunctionParserBase
31 {
32 public:
33 enum ParseErrorType
34 {
35 SYNTAX_ERROR=0, MISM_PARENTH, MISSING_PARENTH, EMPTY_PARENTH,
36 EXPECT_OPERATOR, OUT_OF_MEMORY, UNEXPECTED_ERROR, INVALID_VARS,
37 ILL_PARAMS_AMOUNT, PREMATURE_EOS, EXPECT_PARENTH_FUNC,
38 UNKNOWN_IDENTIFIER,
39 NO_FUNCTION_PARSED_YET,
40 FP_NO_ERROR
41 };
42 // Any modification to this enum must be translated to the same enum in commun.h
43 enum EvalErrorType
44 {
45 EVAL_ERROR=0,
46 DIVISION_BY_ZERO,
47 COTAN_FUNCT_ERROR,
48 EXP_FUNCT_ERROR,
49 ARC_TRIGONOMETRIC_FUNCT_ERROR,
50 IF_FUNCT_ERROR,
51 EVAL_NO_ERROR,
52 VAR_OVERFLOW
53 };
54
55 typedef Value_t value_type;
56
57
58 int Parse(const char* Function, const std::string& Vars,
59 bool useDegrees = false);
60 int Parse(const std::string& Function, const std::string& Vars,
61 bool useDegrees = false);
62
63 void setDelimiterChar(char);
64
65 static Value_t epsilon();
66 static void setEpsilon(Value_t);
67
68 const char* ErrorMsg() const;
69 ParseErrorType GetParseErrorType() const;
70
71 Value_t Eval(const Value_t* Vars);
72 std::complex<double> EvalC(const std::complex<double>* );
73 void AllocateStackMemory( unsigned int, int nbvar=0);
74 Value_t Eval2(const Value_t* Vars, unsigned Nbvar, Value_t* results, unsigned, int position=-1);
75 int EvalError() const;
76
77 bool AddConstant(const std::string& name, Value_t value);
78 bool AddUnit(const std::string& name, Value_t value);
79
80 typedef Value_t (*FunctionPtr)(const Value_t*);
81
82 bool AddFunction(const std::string& name,
83 FunctionPtr, unsigned paramsAmount);
84 bool AddFunction(const std::string& name, FunctionParserBase&);
85
86 class FunctionWrapper;
87
88 template<typename DerivedWrapper>
89 bool AddFunctionWrapper(const std::string& name, const DerivedWrapper&,
90 unsigned paramsAmount);
91
92 FunctionWrapper* GetFunctionWrapper(const std::string& name);
93
94 bool RemoveIdentifier(const std::string& name);
95
96 void Optimize();
97
98
99 int ParseAndDeduceVariables(const std::string& function,
100 int* amountOfVariablesFound = nullptr,
101 bool useDegrees = false);
102 int ParseAndDeduceVariables(const std::string& function,
103 std::string& resultVarString,
104 int* amountOfVariablesFound = nullptr,
105 bool useDegrees = false);
106 int ParseAndDeduceVariables(const std::string& function,
107 std::vector<std::string>& resultVars,
108 bool useDegrees = false);
109
110
111 FunctionParserBase();
112 ~FunctionParserBase();
113
114 // Copy constructor and assignment operator (implemented using the
115 // copy-on-write technique for efficiency):
116 FunctionParserBase(const FunctionParserBase&);
117 FunctionParserBase& operator=(const FunctionParserBase&);
118
119
120 void ForceDeepCopy();
121
122
123
124 #ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
125 // For debugging purposes only.
126 // Performs no sanity checks or anything. If the values are wrong, the
127 // library will crash. Do not use unless you know what you are doing.
128 void InjectRawByteCode(const unsigned* bytecode, unsigned bytecodeAmount,
129 const Value_t* immed, unsigned immedAmount,
130 unsigned stackSize);
131
132 void PrintByteCode(std::ostream& dest, bool showExpression = true) const;
133 #endif
134
135
136
137 //========================================================================
138 protected:
139 //========================================================================
140 // A derived class can implement its own evaluation logic by using
141 // the parser data (found in fptypes.hh).
142 struct Data;
143 Data* getParserData();
144
145
146 //========================================================================
147 public:
148 //========================================================================
149
150 friend class FPoptimizer_CodeTree::CodeTree<Value_t>;
151
152 // Private data:
153 // ------------
154 Data* mData;
155 unsigned mStackPtr;
156
157
158 // Private methods:
159 // ---------------
160 void CopyOnWrite();
161 void CopyOnWrite2();
162 bool CheckRecursiveLinking(const FunctionParserBase*) const;
163 bool NameExists(const char*, unsigned);
164 bool ParseVariables(const std::string&);
165 int ParseFunction(const char*, bool);
166 const char* SetErrorType(ParseErrorType, const char*);
167
168 void AddFunctionOpcode(unsigned);
169 void AddImmedOpcode(Value_t v);
170 void incStackPtr();
171 void CompilePowi(long);
172 bool TryCompilePowi(Value_t);
173
174 const char* CompileIf(const char*);
175 const char* CompileFunctionParams(const char*, unsigned);
176 const char* CompileElement(const char*);
177 const char* CompilePossibleUnit(const char*);
178 const char* CompilePow(const char*);
179 const char* CompileUnaryMinus(const char*);
180 const char* CompileMult(const char*);
181 const char* CompileAddition(const char*);
182 const char* CompileComparison(const char*);
183 const char* CompileAnd(const char*);
184 const char* CompileExpression(const char*);
185 inline const char* CompileFunction(const char*, unsigned);
186 inline const char* CompileParenthesis(const char*);
187 inline const char* CompileLiteral(const char*);
188 template<bool SetFlag>
189 inline void PushOpcodeParam(unsigned);
190 template<bool SetFlag>
191 inline void PutOpcodeParamAt(unsigned, unsigned offset);
192 const char* Compile(const char*);
193
194 bool addFunctionWrapperPtr(const std::string&, FunctionWrapper*, unsigned);
195 static void incFuncWrapperRefCount(FunctionWrapper*);
196 static unsigned decFuncWrapperRefCount(FunctionWrapper*);
197
198 protected:
199 // Parsing utility functions
200 static std::pair<const char*, Value_t> ParseLiteral(const char*);
201 static unsigned ParseIdentifier(const char*);
202 };
203
204 class FunctionParser: public FunctionParserBase<double> {};
205 class FunctionParser_f: public FunctionParserBase<float> {};
206 class FunctionParser_ld: public FunctionParserBase<long double> {};
207 class FunctionParser_li: public FunctionParserBase<long> {};
208
209 #include <complex>
210 class FunctionParser_cd: public FunctionParserBase<std::complex<double> > {};
211 class FunctionParser_cf: public FunctionParserBase<std::complex<float> > {};
212 class FunctionParser_cld: public FunctionParserBase<std::complex<long double> > {};
213
214
215
216 template<typename Value_t>
217 class FunctionParserBase<Value_t>::FunctionWrapper
218 {
219 unsigned mReferenceCount;
220 friend class FunctionParserBase<Value_t>;
221
222 public:
223 FunctionWrapper(): mReferenceCount(1) {}
224 FunctionWrapper(const FunctionWrapper&): mReferenceCount(1) {}
225 virtual ~FunctionWrapper() {}
226 FunctionWrapper& operator=(const FunctionWrapper&) { return *this; }
227
228 virtual Value_t callFunction(const Value_t*) = 0;
229 };
230
231 template<typename Value_t>
232 template<typename DerivedWrapper>
233 bool FunctionParserBase<Value_t>::AddFunctionWrapper
234 (const std::string& name, const DerivedWrapper& wrapper, unsigned paramsAmount)
235 {
236 return addFunctionWrapperPtr
237 (name, new DerivedWrapper(wrapper), paramsAmount);
238 }
239 #endif
240
241 extern template class FunctionParserBase<double>; // explicit instantiation declaration