From c9d5e5c6dac14fac1a4bc16b6e1570479daeacb8 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Tue, 10 Jan 2017 16:55:07 +0100 Subject: [PATCH] Simplify Symbolic API: std::tuple is now used internally and automatically built. --- Eigen/src/Core/ArithmeticSequence.h | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Eigen/src/Core/ArithmeticSequence.h b/Eigen/src/Core/ArithmeticSequence.h index 01cc5e15b..bbedd99c2 100644 --- a/Eigen/src/Core/ArithmeticSequence.h +++ b/Eigen/src/Core/ArithmeticSequence.h @@ -37,7 +37,7 @@ static const all_t all; * auto expr = (x+3)/y+z; * * // And evaluate it: (c++14) - * std::cout << expr.eval(std::make_tuple(x=6,y=3,z=-13)) << "\n"; + * std::cout << expr.eval(x=6,y=3,z=-13) << "\n"; * * // In c++98/11, only one symbol per expression is supported for now: * auto expr98 = (3-x)/2; @@ -60,7 +60,7 @@ class ValueExpr { public: ValueExpr(Index val) : m_value(val) {} template - Index eval(const T&) const { return m_value; } + Index eval_impl(const T&) const { return m_value; } protected: Index m_value; }; @@ -81,7 +81,12 @@ public: * */ template - Index eval(const T& values) const { return derived().eval(values); } + Index eval(const T& values) const { return derived().eval_impl(values); } + +#if __cplusplus > 201103L + template + Index eval(Types&&... values) const { return derived().eval_impl(std::make_tuple(values...)); } +#endif NegateExpr operator-() const { return NegateExpr(derived()); } @@ -151,12 +156,12 @@ public: return SymbolValue(val); } - Index eval(const SymbolValue &values) const { return values.value(); } + Index eval_impl(const SymbolValue &values) const { return values.value(); } #if __cplusplus > 201103L // C++14 versions suitable for multiple symbols template - Index eval(const std::tuple& values) const { return std::get >(values).value(); } + Index eval_impl(const std::tuple& values) const { return std::get >(values).value(); } #endif }; @@ -167,7 +172,7 @@ public: NegateExpr(const Arg0& arg0) : m_arg0(arg0) {} template - Index eval(const T& values) const { return -m_arg0.eval(values); } + Index eval_impl(const T& values) const { return -m_arg0.eval_impl(values); } protected: Arg0 m_arg0; }; @@ -179,7 +184,7 @@ public: AddExpr(const Arg0& arg0, const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {} template - Index eval(const T& values) const { return m_arg0.eval(values) + m_arg1.eval(values); } + Index eval_impl(const T& values) const { return m_arg0.eval_impl(values) + m_arg1.eval_impl(values); } protected: Arg0 m_arg0; Arg1 m_arg1; @@ -192,7 +197,7 @@ public: ProductExpr(const Arg0& arg0, const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {} template - Index eval(const T& values) const { return m_arg0.eval(values) * m_arg1.eval(values); } + Index eval_impl(const T& values) const { return m_arg0.eval_impl(values) * m_arg1.eval_impl(values); } protected: Arg0 m_arg0; Arg1 m_arg1; @@ -205,7 +210,7 @@ public: QuotientExpr(const Arg0& arg0, const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {} template - Index eval(const T& values) const { return m_arg0.eval(values) / m_arg1.eval(values); } + Index eval_impl(const T& values) const { return m_arg0.eval_impl(values) / m_arg1.eval_impl(values); } protected: Arg0 m_arg0; Arg1 m_arg1;