1#ifndef AMPGEN_EXPRESSIONPARSER_H
2#define AMPGEN_EXPRESSIONPARSER_H 1
20 class MinuitParameter;
28 if constexpr( std::is_same<arg_type, Expression>::value ){ arg = expr ; }
30 else if constexpr( std::is_same<arg_type, int>::value ){ arg = int(std::real(expr())); }
31 else if constexpr( std::is_same<arg_type, double>::value ){ arg = double( std::real(expr())); }
32 else if constexpr( std::is_same<arg_type, std::complex<double>>::value ){ arg = expr(); }
36 template <
typename... types> std::tuple< types... >
unpack(
const Expression& expression )
38 std::tuple<types...> rt;
39 unsigned int counter = 0;
42 if( as_pack.size() != std::tuple_size<std::tuple<types...>>::value )
FATAL(
"Wrong number of expressions");
43 for_each( rt, [&as_pack, &counter](
auto& element)
51 class ExpressionParser
57 void add_unary(
const std::string& name,
const unaryFCN& op ){ m_unaryFunctions[name] = op; }
58 template <
typename OP>
void add_unary(
const std::string& name )
60 add_unary(name, [](
const auto& expression){
return OP(expression) ; } );
67 void add_binary(
const std::string& name,
binaryFCN op ) { m_binaryFunctions.emplace_back( name, op ); }
71 std::vector<std::string>::const_iterator end ,
74 static ExpressionParser*
getMe()
83 Expression parseTokens( std::vector<std::string>::const_iterator begin, std::vector<std::string>::const_iterator end ,
const MinuitParameterSet* mps =
nullptr );
85 void processBinaryOperators( std::vector<std::string>& opCodes, std::vector<Expression>& expressions );
86 void processUnaryOperators( std::vector<std::string>& opCodes, std::vector<Expression>& expressions );
88 std::map<std::string, unaryFCN> m_unaryFunctions;
89 std::vector<std::pair<std::string, binaryFCN>> m_binaryFunctions;
90 bool m_isCartesian = {
true};
(Internal) class to aide in the resolution of the dependencies of expression trees.
Wrapper class for shared_ptrs to virtual expressions for use in conjunction with operators to build e...
void add_unary(const std::string &name, const unaryFCN &op)
void add_unary(const std::string &name)
static ExpressionParser * getMe()
void add_multi_arg(const std::string &name, const std::function< Expression(args...)> &fcn)
static Expression parse(std::vector< std::string >::const_iterator begin, std::vector< std::string >::const_iterator end, const MinuitParameterSet *mps=nullptr)
static Expression parse(const std::string &str, const MinuitParameterSet *mps=nullptr)
std::function< Expression(const Expression &)> unaryFCN
std::function< Expression(const Expression &, const Expression &)> binaryFCN
void add_binary(const std::string &name, binaryFCN op)
static ExpressionParser * gExpressionParser
#define declare_enum(name,...)
#define FATAL(X)
Used for printing fatal errors messages, and will always be printed and will terminate the process af...
bool is(const Expression &expression)
std::string type_string()
Utility classes for compile-time metaprogramming, such as identifying the types of arguments for gene...
rad void set_tuple_from_expression(arg_type &arg, const Expression &expr)
T cast(const Expression &expression)
std::tuple< types... > unpack(const Expression &expression)
std::enable_if_t< I==sizeof...(Tp), void > for_each(std::tuple< Tp... > &, FuncT)
declare_enum(coordinateType, cartesian, polar) declare_enum(angType