1 #ifndef _MBXMLUTILS_EVAL_H_
2 #define _MBXMLUTILS_EVAL_H_
4 #include <fmatvec/atom.h>
5 #include <boost/filesystem.hpp>
6 #include <boost/variant.hpp>
7 #include <xercesc/util/XercesDefs.hpp>
8 #include <mbxmlutilshelper/dom.h>
9 #include <casadi/casadi.hpp>
10 #include <unordered_map>
12 #define XMLUTILS_EVAL_CONCAT1(X, Y) X##Y
13 #define XMLUTILS_EVAL_CONCAT(X, Y) XMLUTILS_EVAL_CONCAT1(X, Y)
14 #define XMLUTILS_EVAL_APPENDLINE(X) XMLUTILS_EVAL_CONCAT(X, __LINE__)
17 #define XMLUTILS_EVAL_REGISTER(T) \
20 Reg() { Eval::registerEvaluator<T>(); } \
21 } XMLUTILS_EVAL_APPENDLINE(regDummy); \
24 namespace XERCES_CPP_NAMESPACE {
30 namespace MBXMLUtils {
35 CodeString(
const std::string &str) : std::string(str) {}
42 dir=boost::filesystem::current_path();
45 boost::filesystem::current_path(dir);
48 boost::filesystem::path dir;
57 NewParamLevel(
const std::shared_ptr<Eval> &oe_,
bool newLevel_=
true);
66 static void*
operator new(std::size_t);
67 static void*
operator new[](std::size_t);
69 std::shared_ptr<Eval> oe;
73 template<
class T>
struct SwigType {
static std::string name; };
91 typedef std::pair<std::vector<casadi::SX>, std::vector<casadi::SX>>
Function;
92 typedef boost::variant<std::shared_ptr<void>,
Function> Value;
96 Eval(std::vector<boost::filesystem::path> *dependencies_);
103 Eval& operator=(
const Eval& other) =
delete;
104 Eval& operator=(
Eval&& other) =
delete;
107 static std::shared_ptr<Eval>
createEvaluator(
const std::string &evalName, std::vector<boost::filesystem::path> *dependencies_=NULL);
111 static void registerEvaluator() {
112 getEvaluators()[E::getNameStatic()]=&newEvaluator<E>;
116 virtual std::string
getName()
const=0;
119 void addParam(
const std::string ¶mName,
const Value& value);
127 virtual void addImport(
const std::string &code,
const xercesc::DOMElement *e)=0;
131 Value
eval(
const xercesc::DOMElement *e);
136 Value
eval(
const xercesc::DOMAttr *a,
const xercesc::DOMElement *pe=NULL);
277 T
cast(
const Value &value, xercesc::DOMDocument *doc)
const;
281 T
cast(
const Value &value)
const;
294 Value
stringToValue(
const std::string &str,
const xercesc::DOMElement *e=NULL,
bool fullEval=
true)
const;
298 Value
create(
const T& v)
const;
301 virtual std::map<boost::filesystem::path, std::pair<boost::filesystem::path, bool> >&
requiredFiles()
const=0;
306 virtual void convertIndex(Value &v,
bool evalTo1Based)=0;
309 static void setValue(xercesc::DOMElement *e,
const Value &v);
318 std::vector<boost::filesystem::path> *dependencies;
321 std::unordered_map<std::string, Value> currentParam;
323 std::stack<std::unordered_map<std::string, Value> > paramStack;
326 std::shared_ptr<void> currentImport;
328 std::stack<std::shared_ptr<void> > importStack;
331 Value createSwig()
const;
349 virtual Value
callFunction(
const std::string &name,
const std::vector<Value>& args)
const=0;
354 virtual Value
fullStringToValue(
const std::string &str,
const xercesc::DOMElement *e=NULL)
const=0;
360 static std::shared_ptr<Eval> newEvaluator(std::vector<boost::filesystem::path>* dependencies_) {
361 return std::shared_ptr<E>(
new E(dependencies_));
365 virtual void*
getSwigThis(
const Value &value)
const=0;
367 virtual std::string
getSwigType(
const Value &value)
const=0;
369 void addStaticDependencies(
const xercesc::DOMElement *e)
const;
373 virtual double cast_double (
const Value &value)
const=0;
374 virtual std::vector<double> cast_vector_double (
const Value &value)
const=0;
375 virtual std::vector<std::vector<double> > cast_vector_vector_double(
const Value &value)
const=0;
376 virtual std::string cast_string (
const Value &value)
const=0;
378 CodeString cast_CodeString (
const Value &value)
const;
379 int cast_int (
const Value &value)
const;
380 casadi::SX cast_SX (
const Value &value)
const;
383 xercesc::DOMElement* cast_DOMElement_p(
const Value &value, xercesc::DOMDocument *doc)
const;
386 virtual Value create_double (
const double& v)
const=0;
387 virtual Value create_vector_double (
const std::vector<double>& v)
const=0;
388 virtual Value create_vector_vector_double(
const std::vector<std::vector<double> >& v)
const=0;
389 virtual Value create_string (
const std::string& v)
const=0;
391 Value handleUnit(
const xercesc::DOMElement *e,
const Value &ret);
393 static std::map<std::string, std::string> units;
395 static std::map<std::string, std::function<std::shared_ptr<Eval>(std::vector<boost::filesystem::path>*)> >& getEvaluators();
400 Eval::Value Eval::createSwig()
const {
412 template<> std::string Eval::cast<std::string>(
const Value &value)
const;
413 template<>
CodeString Eval::cast<CodeString>(
const Value &value)
const;
414 template<>
double Eval::cast<double>(
const Value &value)
const;
415 template<>
int Eval::cast<int>(
const Value &value)
const;
416 template<> std::vector<double> Eval::cast<std::vector<double> >(
const Value &value)
const;
417 template<> std::vector<std::vector<double> > Eval::cast<std::vector<std::vector<double> > >(
const Value &value)
const;
418 template<> casadi::SX Eval::cast<casadi::SX>(
const Value &value)
const;
419 template<>
Eval::Function Eval::cast<Eval::Function>(
const Value &value)
const;
422 template<> xercesc::DOMElement* Eval::cast<xercesc::DOMElement*>(
const Value &value, xercesc::DOMDocument *doc)
const;
425 template<> Eval::Value Eval::create<double> (
const double& v)
const;
426 template<> Eval::Value Eval::create<std::vector<double> > (
const std::vector<double>& v)
const;
427 template<> Eval::Value Eval::create<std::vector<std::vector<double> > >(
const std::vector<std::vector<double> >& v)
const;
428 template<> Eval::Value Eval::create<std::string> (
const std::string& v)
const;
Create a new parameter level for a evaluator which is automatically resetted if the scope of this obj...
Definition: eval.h:54
NewParamLevel(const std::shared_ptr< Eval > &oe_, bool newLevel_=true)
Create a new parameter level in the evaluator oe_.
virtual Value fullStringToValue(const std::string &str, const xercesc::DOMElement *e=NULL) const =0
evaluate the string str using the current parameters and return the result.
Value create(const T &v) const
create a value of the given type
virtual std::string getSwigType(const Value &value) const =0
get the SWIG type (class name) of this value.
void addParam(const std::string ¶mName, const Value &value)
Add a value to the current parameters.
Definition: eval.cc:213
virtual void convertIndex(Value &v, bool evalTo1Based)=0
virtual std::string getName() const =0
Get the type of this evaluator.
virtual bool valueIsOfType(const Value &value, ValueType type) const =0
virtual void addImport(const std::string &code, const xercesc::DOMElement *e)=0
void addParamSet(const xercesc::DOMElement *e)
Definition: eval.cc:217
virtual void * getSwigThis(const Value &value) const =0
get the SWIG pointer of this value.
virtual Value createSwigByTypeName(const std::string &typeName) const =0
create a SWIG object of name typeName.
virtual Value callFunction(const std::string &name, const std::vector< Value > &args) const =0
Eval(std::vector< boost::filesystem::path > *dependencies_)
Constructor.
static std::shared_ptr< Eval > createEvaluator(const std::string &evalName, std::vector< boost::filesystem::path > *dependencies_=NULL)
Create a evaluator.
Definition: eval.cc:93
A dummy object representing a value as string in the syntax of the Eval.
Definition: eval.h:33
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:579
T cast(const Value &value, xercesc::DOMDocument *doc) const
std::pair< std::vector< casadi::SX >, std::vector< casadi::SX > > Function
Typedef for a shared value.
Definition: eval.h:91
void pushContext()
Push the current context to a internal stack.
Definition: eval.cc:181
Exception during evaluation of the DOM tree including a location stack.
Definition: dom.h:279
Value eval(const xercesc::DOMElement *e)
Value stringToValue(const std::string &str, const xercesc::DOMElement *e=NULL, bool fullEval=true) const
Definition: eval.cc:622
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) ...
~NewParamLevel()
Reset to the previous parameter level.
Definition: eval.cc:66
static void setValue(xercesc::DOMElement *e, const Value &v)
Set value on DOMElement (is used by Eval::cast)
Definition: eval.cc:714
void popContext()
Overwrite the current context with the top level context from the internal stack. ...
Definition: eval.cc:186
~Eval()
Destructor.
Definition: eval.cc:128
ValueType
Definition: eval.h:82