mbxmlutils 1.3.0 Multi-Body XML Utils

eval.h
1 #ifndef _MBXMLUTILS_EVAL_H_
2 #define _MBXMLUTILS_EVAL_H_
3
4 #include <fmatvec/atom.h>
5 #include <boost/filesystem.hpp>
6 #include <xercesc/util/XercesDefs.hpp>
7 #include <mbxmlutilshelper/dom.h>
8 #include <mbxmlutilshelper/thislinelocation.h>
9 #include <unordered_map>
10 #include <stack>
11
12 #define MBXMLUTILS_EVAL_CONCAT1(X, Y) X##Y
13 #define MBXMLUTILS_EVAL_CONCAT(X, Y) MBXMLUTILS_EVAL_CONCAT1(X, Y)
14 #define MBXMLUTILS_EVAL_APPENDLINE(X) MBXMLUTILS_EVAL_CONCAT(X, __LINE__)
15
17 #define MBXMLUTILS_EVAL_REGISTER(T) \
18 namespace { \
19 struct Reg { \
20 Reg() { Eval::registerEvaluator<T>(); } \
21 } MBXMLUTILS_EVAL_APPENDLINE(regDummy); \
22 }
23
24 namespace XERCES_CPP_NAMESPACE {
25 class DOMElement;
26 class DOMAttr;
27 class DOMDocument;
28 }
29
30 namespace MBXMLUtils {
31
32 bool tryDouble2Int(double d, int &i);
33
35 class CodeString : public std::string {
36 public:
37 CodeString(const std::string &str) : std::string(str) {}
38 };
39
40 // Store the current directory in the ctor an restore in the dtor
41 class PreserveCurrentDir {
42 public:
43 PreserveCurrentDir() {
44 dir=boost::filesystem::current_path();
45 }
46 ~PreserveCurrentDir() {
47 boost::filesystem::current_path(dir);
48 }
49 private:
50 boost::filesystem::path dir;
51 };
52
53 class Eval;
54
56 class NewParamLevel {
57 public:
59 NewParamLevel(std::shared_ptr<Eval> oe_, bool newLevel_=true);
61 ~NewParamLevel();
62
63 NewParamLevel(const NewParamLevel& other) = delete; // copy constructor
64 NewParamLevel(NewParamLevel&& other) = delete; // move constructor
65 NewParamLevel& operator=(const NewParamLevel& other) = delete; // copy assignment
66 NewParamLevel& operator=(NewParamLevel&& other) = delete; // move assignment
67 protected:
68 static void* operator new(std::size_t); // no heap allocation allowed
69 static void* operator new[](std::size_t); // no heap allocation allowed
70
71 std::shared_ptr<Eval> oe;
72 bool newLevel;
73 };
74
76 class Eval : public std::enable_shared_from_this<Eval>, virtual public fmatvec::Atom {
77 public:
78 friend class NewParamLevel;
79
82 enum ValueType {
83 ScalarType,
84 VectorType,
85 MatrixType,
86 StringType,
87 FunctionType
88 };
89
91 using Value = std::shared_ptr<void>;
92
93 static boost::filesystem::path installPath;
94
95 protected:
97 Eval(std::vector<boost::filesystem::path> *dependencies_);
98 public:
100 ~Eval() override;
101
102 Eval(const Eval& other) = delete; // copy constructor
103 Eval(Eval&& other) = delete; // move constructor
104 Eval& operator=(const Eval& other) = delete; // copy assignment
105 Eval& operator=(Eval&& other) = delete; // move assignment
106
108 static std::shared_ptr<Eval> createEvaluator(const std::string &evalName, std::vector<boost::filesystem::path> *dependencies_=nullptr);
109
110 // Register a new evaluator.
111 template<class E>
112 static void registerEvaluator() {
113 getEvaluators()[E::getNameStatic()]=&newEvaluator<E>;
114 }
115
117 virtual std::string getName() const=0;
118
120 void addParam(const std::string &paramName, const Value& value);
124 void addParamSet(const xercesc::DOMElement *e);
125
128 virtual void addImport(const std::string &code, const xercesc::DOMElement *e)=0;
129
132 Value eval(const xercesc::DOMElement *e);
133
137 Value eval(const xercesc::DOMAttr *a);
138
141 Value eval(const std::string &str, const xercesc::DOMElement *e=nullptr, bool skipRet=false);
142
210 template<typename T>
211 T cast(const Value &value) const;
212
214 virtual std::string getStringRepresentation(const Value &x) const;
215
222 virtual bool valueIsOfType(const Value &value, ValueType type) const=0;
223
227 Value stringToValue(const std::string &str, const xercesc::DOMElement *e=nullptr, bool fullEval=true) const;
228
234 template<class T>
235 Value create(const T& v) const;
236
238 virtual std::map<boost::filesystem::path, std::pair<boost::filesystem::path, bool> >& requiredFiles() const=0;
239
243 virtual void convertIndex(Value &v, bool evalTo1Based)=0;
244
246 static void setValue(xercesc::DOMElement *e, const Value &v);
247
261 virtual Value callFunction(const std::string &name, const std::vector<Value>& args) const=0;
262
263 protected:
265 virtual Value createFunctionIndep(int dim) const = 0;
267 virtual Value createFunctionDep(const std::vector<Value>& v) const=0;
269 virtual Value createFunctionDep(const std::vector<std::vector<Value> >& v) const=0;
271 virtual Value createFunction(const std::vector<Value> &indeps, const Value &dep) const = 0;
272
274 void pushContext();
275
277 void popContext();
278
279 std::vector<boost::filesystem::path> *dependencies;
280
281 // map of the current parameters
282 std::unordered_map<std::string, Value> currentParam;
283 // stack of parameters
284 std::stack<std::unordered_map<std::string, Value> > paramStack;
285
286 // current imports
287 Value currentImport;
288 // stack of imports
289 std::stack<Value> importStack;
290
292 virtual Value fullStringToValue(const std::string &str, const xercesc::DOMElement *e, bool skipRet=false) const=0;
293
295 std::string partialStringToString(const std::string &str, const xercesc::DOMElement *e) const;
296
297 template<class E>
298 static std::shared_ptr<Eval> newEvaluator(std::vector<boost::filesystem::path>* dependencies_) {
299 return std::shared_ptr<E>(new E(dependencies_));
300 }
301
302 void addStaticDependencies(const xercesc::DOMElement *e) const;
303
304 static void printEvaluatorMsg(const std::ostringstream &str, MsgType msgType);
305
306 private:
307 // virtual spezialization of cast(const Value &value)
308 virtual double cast_double (const Value &value) const=0;
309 virtual std::vector<double> cast_vector_double (const Value &value) const=0;
310 virtual std::vector<std::vector<double> > cast_vector_vector_double(const Value &value) const=0;
311 virtual std::string cast_string (const Value &value) const=0;
312 // spezialization of cast(const Value &value)
313 CodeString cast_CodeString (const Value &value) const;
314 int cast_int (const Value &value) const;
315
316 // virtual spezialization of create(...)
317 virtual Value create_double (const double& v) const=0;
318 virtual Value create_vector_double (const std::vector<double>& v) const=0;
319 virtual Value create_vector_vector_double (const std::vector<std::vector<double> >& v) const=0;
320 virtual Value create_string (const std::string& v) const=0;
321
322 virtual std::string serializeFunction(const Value &x) const = 0;
323
324 Value handleUnit(const xercesc::DOMElement *e, const Value &ret);
325
326 static std::map<std::string, std::string> units;
327
328 static std::map<std::string, std::function<std::shared_ptr<Eval>(std::vector<boost::filesystem::path>*)> >& getEvaluators();
329
330 };
331
332 // specializations
333 template<> std::string Eval::cast<std::string>(const Value &value) const;
334 template<> CodeString Eval::cast<CodeString>(const Value &value) const;
335 template<> double Eval::cast<double>(const Value &value) const;
336 template<> int Eval::cast<int>(const Value &value) const;
337 template<> std::vector<double> Eval::cast<std::vector<double> >(const Value &value) const;
338 template<> std::vector<std::vector<double> > Eval::cast<std::vector<std::vector<double> > >(const Value &value) const;
339
340 // spezializations for create
341 template<> Eval::Value Eval::create<double> (const double& v) const;
342 template<> Eval::Value Eval::create<std::vector<double> > (const std::vector<double>& v) const;
343 template<> Eval::Value Eval::create<std::vector<std::vector<double> > > (const std::vector<std::vector<double> >& v) const;
344 template<> Eval::Value Eval::create<std::string> (const std::string& v) const;
345 template<> Eval::Value Eval::create<std::vector<Eval::Value>> (const std::vector<Value>& v) const;
346 template<> Eval::Value Eval::create<std::vector<std::vector<Eval::Value>>>(const std::vector<std::vector<Value> >& v) const;
347
348 } // end namespace MBXMLUtils
349
350 #endif
MBXMLUtils::Eval::fullStringToValue
virtual Value fullStringToValue(const std::string &str, const xercesc::DOMElement *e, bool skipRet=false) const =0
evaluate the string str using the current parameters and return the result.
MBXMLUtils::Eval::getStringRepresentation
virtual std::string getStringRepresentation(const Value &x) const
Returns a evaluator specific string representation of x. This is only useful for display to the user.
Definition: eval.cc:705
MBXMLUtils::NewParamLevel
Create a new parameter level for a evaluator which is automatically resetted if the scope of this obj...
Definition: eval.h:56
MBXMLUtils::Eval
Definition: eval.h:76
MBXMLUtils::Eval::addParam
void addParam(const std::string &paramName, const Value &value)
Add a value to the current parameters.
Definition: eval.cc:219
MBXMLUtils::Eval::convertIndex
virtual void convertIndex(Value &v, bool evalTo1Based)=0
MBXMLUtils::Eval::getName
virtual std::string getName() const =0
Get the type of this evaluator.
MBXMLUtils::Eval::valueIsOfType
virtual bool valueIsOfType(const Value &value, ValueType type) const =0
MBXMLUtils::Eval::createFunctionIndep
virtual Value createFunctionIndep(int dim) const =0
create a function independent variable. If dim == 0 a scalar is created else a vector.
MBXMLUtils::Eval::addImport
virtual void addImport(const std::string &code, const xercesc::DOMElement *e)=0
MBXMLUtils::Eval::addParamSet
void addParamSet(const xercesc::DOMElement *e)
Definition: eval.cc:223
MBXMLUtils::Eval::callFunction
virtual Value callFunction(const std::string &name, const std::vector< Value > &args) const =0
MBXMLUtils::Eval::Eval
Eval(std::vector< boost::filesystem::path > *dependencies_)
Constructor.
MBXMLUtils::Eval::create
Value create(const T &v) const
MBXMLUtils::Eval::partialStringToString
std::string partialStringToString(const std::string &str, const xercesc::DOMElement *e) const
evaluate str partially and return result as an std::string
Definition: eval.cc:601
MBXMLUtils::Eval::cast
T cast(const Value &value) const
MBXMLUtils::CodeString
A dummy object representing a value as string in the syntax of the Eval.
Definition: eval.h:35
MBXMLUtils::Eval::pushContext
void pushContext()
Push the current context to a internal stack.
Definition: eval.cc:187
MBXMLUtils::Eval::~Eval
~Eval() override
Destructor.
MBXMLUtils::Eval::createFunction
virtual Value createFunction(const std::vector< Value > &indeps, const Value &dep) const =0
create a Function with n independents and a dependent function (scalar, vector or matrix)
MBXMLUtils::PreserveCurrentDir
Definition: eval.h:41
MBXMLUtils::Eval::eval
Value eval(const xercesc::DOMElement *e)
MBXMLUtils::Eval::createEvaluator
static std::shared_ptr< Eval > createEvaluator(const std::string &evalName, std::vector< boost::filesystem::path > *dependencies_=nullptr)
Create a evaluator.
Definition: eval.cc:116
MBXMLUtils::NewParamLevel::NewParamLevel
NewParamLevel(std::shared_ptr< Eval > oe_, bool newLevel_=true)
Create a new parameter level in the evaluator oe_.
MBXMLUtils::Eval::requiredFiles
virtual std::map< boost::filesystem::path, std::pair< boost::filesystem::path, bool > > & requiredFiles() const =0
return a list of all required files of the evaluator (excluding dependent files of libraries)
MBXMLUtils::Eval::createFunctionDep
virtual Value createFunctionDep(const std::vector< Value > &v) const =0
create a vector function dependent
MBXMLUtils::NewParamLevel::~NewParamLevel
~NewParamLevel()
Reset to the previous parameter level.
Definition: eval.cc:91
MBXMLUtils::Eval::Value
std::shared_ptr< void > Value
Typedef for a shared value.
Definition: eval.h:91
MBXMLUtils::Eval::setValue
static void setValue(xercesc::DOMElement *e, const Value &v)
Set value on DOMElement (is used by Eval::cast)
Definition: eval.cc:718
MBXMLUtils::Eval::popContext
void popContext()
Overwrite the current context with the top level context from the internal stack.
Definition: eval.cc:192
MBXMLUtils::Eval::stringToValue
Value stringToValue(const std::string &str, const xercesc::DOMElement *e=nullptr, bool fullEval=true) const
Definition: eval.cc:649
MBXMLUtils::Eval::ValueType
ValueType
Definition: eval.h:82