aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core/ArithmeticSequence.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2017-01-10 16:45:32 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2017-01-10 16:45:32 +0100
commit407e7b7a9376dd3f722f0fc08fb806b3970e594d (patch)
tree0b2105bc575be86f7ff607ad798f201ae55624a8 /Eigen/src/Core/ArithmeticSequence.h
parent96e6cf9aa20a136068e4e7e2efcb4ecab8655ff0 (diff)
Simplify symbolic API by using "symbol=value" to associate a runtime value to a symbol.
Diffstat (limited to 'Eigen/src/Core/ArithmeticSequence.h')
-rw-r--r--Eigen/src/Core/ArithmeticSequence.h26
1 files changed, 14 insertions, 12 deletions
diff --git a/Eigen/src/Core/ArithmeticSequence.h b/Eigen/src/Core/ArithmeticSequence.h
index b425b7804..01cc5e15b 100644
--- a/Eigen/src/Core/ArithmeticSequence.h
+++ b/Eigen/src/Core/ArithmeticSequence.h
@@ -37,11 +37,11 @@ static const all_t all;
* auto expr = (x+3)/y+z;
*
* // And evaluate it: (c++14)
- * std::cout << expr.eval(std::make_tuple(Symbolic::defineValue(x,6),Symbolic::defineValue(y,3),Symbolic::defineValue(z,-13))) << "\n";
+ * std::cout << expr.eval(std::make_tuple(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;
- * std::cout << expr98.eval(Symbolic::defineValue(x,6)) << "\n";
+ * std::cout << expr98.eval(x=6) << "\n";
*
* It is currently only used internally to define and minipulate the placeholders::last and placeholders::end symbols in Eigen::seq and Eigen::seqN.
*
@@ -77,7 +77,7 @@ public:
/** Evaluate the expression given the \a values of the symbols.
*
* \param values defines the values of the symbols, it can either be a SymbolValue or a std::tuple of SymbolValue
- * as constructed by the defineValue function.
+ * as constructed by SymbolExpr::operator= operator.
*
*/
template<typename T>
@@ -120,7 +120,7 @@ struct is_symbolic {
/** Represents the actual value of a symbol identified by its tag
*
- * It is the return type of defineValue(), and most of the time this is only way it is used.
+ * It is the return type of SymbolValue::operator=, and most of the time this is only way it is used.
*/
template<typename Tag>
class SymbolValue
@@ -135,6 +135,7 @@ protected:
Index m_value;
};
+/** Expression of a symbol uniquely identified by the tag \tparam TagT */
template<typename TagT>
class SymbolExpr : public BaseExpr<SymbolExpr<TagT> >
{
@@ -142,6 +143,14 @@ public:
typedef TagT Tag;
SymbolExpr() {}
+ /** Associate the value \a val to the given symbol \c *this, uniquely identified by its \c Tag.
+ *
+ * The returned object should be passed to ExprBase::eval() to evaluate a given expression with this specified runtime-time value.
+ */
+ SymbolValue<Tag> operator=(Index val) const {
+ return SymbolValue<Tag>(val);
+ }
+
Index eval(const SymbolValue<Tag> &values) const { return values.value(); }
#if __cplusplus > 201103L
@@ -151,13 +160,6 @@ public:
#endif
};
-/** Associate the value \a val to the symbol \a symb
- */
-template<typename Tag>
-SymbolValue<Tag> defineValue(SymbolExpr<Tag> /*symb*/,Index val) {
- return SymbolValue<Tag>(val);
-}
-
template<typename Arg0>
class NegateExpr : public BaseExpr<NegateExpr<Arg0> >
{
@@ -488,7 +490,7 @@ fix_t<N> eval_expr_given_size(fix_t<N> x, Index /*size*/) { return x; }
template<typename Derived>
Index eval_expr_given_size(const Symbolic::BaseExpr<Derived> &x, Index size)
{
- return x.derived().eval(Symbolic::defineValue(placeholders::last,size-1));
+ return x.derived().eval(placeholders::last=size-1);
}
// Convert a symbolic span into a usable one (i.e., remove last/end "keywords")