File indexing completed on 2024-04-06 12:01:18
0001 #ifndef CommonToolsUtilsExpressionEvaluator_H
0002 #define CommonToolsUtilsExpressionEvaluator_H
0003
0004 #include <string>
0005
0006 namespace reco {
0007
0008 class ExpressionEvaluator {
0009 public:
0010 ExpressionEvaluator(const char* pkg, const char* iname, const std::string& iexpr);
0011 ~ExpressionEvaluator();
0012
0013 template <typename EXPR, typename... CArgs>
0014 EXPR* expr() const {
0015 typedef EXPR* factoryP();
0016 return reinterpret_cast<factoryP*>(m_expr)();
0017 }
0018
0019 private:
0020 std::string m_name;
0021 void* m_expr;
0022 };
0023
0024 template <typename EXPR>
0025 EXPR* expressionEvaluator(const char* pkg, const char* iname, const std::string& iexpr) {
0026 ExpressionEvaluator ee(pkg, iname, iexpr);
0027 return ee.expr<EXPR>();
0028 }
0029
0030 }
0031
0032 #define SINGLE_ARG(...) __VA_ARGS__
0033 #define RECO_XSTR(...) RECO_STR(__VA_ARGS__)
0034 #define RECO_STR(...) #__VA_ARGS__
0035 #define reco_expressionEvaluator(pkg, EXPR, iexpr) reco::expressionEvaluator<EXPR>(pkg, RECO_XSTR(EXPR), iexpr)
0036
0037 #endif