1#ifndef _MBXMLUTILS_EVAL_H_
2#define _MBXMLUTILS_EVAL_H_
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>
11#include "mbxmlutilshelper/utils.h"
13#define MBXMLUTILS_EVAL_CONCAT1(X, Y) X##Y
14#define MBXMLUTILS_EVAL_CONCAT(X, Y) MBXMLUTILS_EVAL_CONCAT1(X, Y)
15#define MBXMLUTILS_EVAL_APPENDLINE(X) MBXMLUTILS_EVAL_CONCAT(X, __LINE__)
18#define MBXMLUTILS_EVAL_REGISTER(T) \
21 Reg() { Eval::registerEvaluator<T>(); } \
22 } MBXMLUTILS_EVAL_APPENDLINE(regDummy); \
25namespace XERCES_CPP_NAMESPACE {
33bool tryDouble2Int(
double d,
int &i);
38 CodeString(
const std::string &str) : std::string(str) {}
45 dir=MBXMLUtils::current_path();
48 MBXMLUtils::current_path(dir);
51 boost::filesystem::path dir;
69 static void*
operator new(std::size_t);
70 static void*
operator new[](std::size_t);
72 std::shared_ptr<Eval> oe;
77class Eval :
public std::enable_shared_from_this<Eval>,
virtual public fmatvec::Atom {
92 using Value = std::shared_ptr<void>;
94 static boost::filesystem::path installPath;
98 Eval(std::vector<boost::filesystem::path> *dependencies_);
105 Eval& operator=(
const Eval& other) =
delete;
106 Eval& operator=(
Eval&& other) =
delete;
109 static std::shared_ptr<Eval>
createEvaluator(
const std::string &evalName, std::vector<boost::filesystem::path> *dependencies_=
nullptr);
113 static void registerEvaluator() {
114 getEvaluators()[E::getNameStatic()]=&newEvaluator<E>;
121 void addParam(
const std::string ¶mName,
const Value& value);
129 virtual void addImport(
const std::string &code,
const xercesc::DOMElement *e,
const std::string &action=
"")=0;
142 Value eval(
const std::string &str,
const xercesc::DOMElement *e=
nullptr,
bool skipRet=
false);
231 Value stringToValue(
const std::string &str,
const xercesc::DOMElement *e=
nullptr,
bool fullEval=
true,
bool skipRet=
false)
const;
251 virtual std::map<boost::filesystem::path, std::pair<boost::filesystem::path, bool> >&
requiredFiles()
const=0;
259 static void setValue(xercesc::DOMElement *e,
const Value &v);
276 size_t getStackSize() { assert(paramStack.size()==importStack.size());
return paramStack.size(); }
294 std::vector<boost::filesystem::path> *dependencies;
297 std::unordered_map<std::string, Value> currentParam;
299 std::stack<std::unordered_map<std::string, Value> > paramStack;
302 std::unordered_map<std::string, Value> currentImport;
304 std::stack<std::unordered_map<std::string, Value> > importStack;
313 static std::shared_ptr<Eval> newEvaluator(std::vector<boost::filesystem::path>* dependencies_) {
314 return std::shared_ptr<E>(
new E(dependencies_));
317 void addStaticDependencies(
const xercesc::DOMElement *e)
const;
319 static void printEvaluatorMsg(
const std::ostringstream &str, MsgType msgType);
323 virtual double cast_double (
const Value &value)
const=0;
324 virtual std::vector<double> cast_vector_double (
const Value &value)
const=0;
325 virtual std::vector<std::vector<double> > cast_vector_vector_double(
const Value &value)
const=0;
326 virtual std::string cast_string (
const Value &value)
const=0;
329 int cast_int (
const Value &value)
const;
332 virtual Value create_double (
const double& v)
const=0;
333 virtual Value create_vector_double (
const std::vector<double>& v)
const=0;
334 virtual Value create_vector_vector_double (
const std::vector<std::vector<double> >& v)
const=0;
335 virtual Value create_string (
const std::string& v)
const=0;
338 virtual std::string createSourceCode_double (
const double& v)
const=0;
339 virtual std::string createSourceCode_vector_double (
const std::vector<double>& v)
const=0;
340 virtual std::string createSourceCode_vector_vector_double (
const std::vector<std::vector<double> >& v)
const=0;
341 virtual std::string createSourceCode_string (
const std::string& v)
const=0;
343 virtual std::string serializeFunction(
const Value &x)
const = 0;
345 Value handleUnit(
const xercesc::DOMElement *e,
const Value &ret);
347 static std::map<std::string, std::string> units;
349 static std::map<std::string, std::function<std::shared_ptr<Eval>(std::vector<boost::filesystem::path>*)> >& getEvaluators();
354template<> std::string Eval::cast<std::string>(
const Value &value)
const;
355template<> CodeString Eval::cast<CodeString>(
const Value &value)
const;
356template<>
double Eval::cast<double>(
const Value &value)
const;
357template<>
int Eval::cast<int>(
const Value &value)
const;
358template<> std::vector<double> Eval::cast<std::vector<double> >(
const Value &value)
const;
359template<> std::vector<std::vector<double> > Eval::cast<std::vector<std::vector<double> > >(
const Value &value)
const;
362template<>
Eval::Value Eval::create<double> (
const double& v)
const;
363template<>
Eval::Value Eval::create<std::vector<double> > (
const std::vector<double>& v)
const;
364template<>
Eval::Value Eval::create<std::vector<std::vector<double> > > (
const std::vector<std::vector<double> >& v)
const;
365template<>
Eval::Value Eval::create<std::string> (
const std::string& v)
const;
368template<> std::string Eval::createSourceCode<double> (
const double& v)
const;
369template<> std::string Eval::createSourceCode<std::vector<double> > (
const std::vector<double>& v)
const;
370template<> std::string Eval::createSourceCode<std::vector<std::vector<double> > > (
const std::vector<std::vector<double> >& v)
const;
371template<> std::string Eval::createSourceCode<std::string> (
const std::string& v)
const;
A dummy object representing a value as string in the syntax of the Eval (xmlflat).
Definition: eval.h:36
std::string createSourceCode(const T &v) const
virtual std::string getName() const =0
Get the type of this evaluator.
ValueType
Definition: eval.h:83
void addParam(const std::string ¶mName, const Value &value)
Add a value to the current parameters.
Definition: eval.cc:229
std::shared_ptr< void > Value
Typedef for a shared value.
Definition: eval.h:92
static std::shared_ptr< Eval > createEvaluator(const std::string &evalName, std::vector< boost::filesystem::path > *dependencies_=nullptr)
Create a evaluator.
Definition: eval.cc:116
virtual Value callFunction(const std::string &name, const std::vector< Value > &args) const =0
~Eval() override
Destructor.
T cast(const Value &value) const
void popContext()
Overwrite the current context with the top level context from the internal stack.
Definition: eval.cc:182
virtual Value createFunctionIndep(int dim) const =0
create a function independent variable. If dim == 0 a scalar is created else a vector.
virtual void convertIndex(Value &v, bool evalTo1Based)=0
virtual Value createFunctionDep(const std::vector< std::vector< Value > > &v) const =0
create a matrix function dependent
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)
void checkIfValueMatchesElement(const Value &value, const xercesc::DOMElement *e)
Check if the type of the value 'value' matches the type of DOMElement 'e'.
Definition: eval.cc:571
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:713
static void setValue(xercesc::DOMElement *e, const Value &v)
Set value on DOMElement (is used by Eval::cast)
Definition: eval.cc:726
Value eval(const xercesc::DOMElement *e)
Value stringToValue(const std::string &str, const xercesc::DOMElement *e=nullptr, bool fullEval=true, bool skipRet=false) const
Definition: eval.cc:657
virtual void addImport(const std::string &code, const xercesc::DOMElement *e, const std::string &action="")=0
Value create(const T &v) const
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.
void pushContext()
Push the current context to a internal stack.
Definition: eval.cc:177
void addParamSet(const xercesc::DOMElement *e)
Definition: eval.cc:233
virtual bool valueIsOfType(const Value &value, ValueType type) const =0
Value eval(const std::string &str, const xercesc::DOMElement *e=nullptr, bool skipRet=false)
virtual Value createFunctionDep(const std::vector< Value > &v) const =0
create a vector function dependent
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)
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:609
Eval(std::vector< boost::filesystem::path > *dependencies_)
Constructor.
Create a new parameter level for a evaluator which is automatically resetted if the scope of this obj...
Definition: eval.h:57
~NewParamLevel()
Reset to the previous parameter level.
Definition: eval.cc:91
NewParamLevel(std::shared_ptr< Eval > oe_, bool newLevel_=true)
Create a new parameter level in the evaluator oe_.