10 #ifndef EIGEN_SYMBOLIC_INDEX_H
11 #define EIGEN_SYMBOLIC_INDEX_H
13 #include "../InternalHeaderCheck.h"
44 template<
typename Tag>
class Symbol;
45 template<
typename Arg0>
class NegateExpr;
46 template<
typename Arg1,
typename Arg2>
class AddExpr;
47 template<
typename Arg1,
typename Arg2>
class ProductExpr;
48 template<
typename Arg1,
typename Arg2>
class QuotientExpr;
52 template<
typename IndexType=Index>
55 ValueExpr(IndexType val) : m_value(val) {}
57 IndexType eval_impl(
const T&)
const {
return m_value; }
65 class ValueExpr<internal::FixedInt<N> > {
69 EIGEN_CONSTEXPR
Index eval_impl(
const T&)
const {
return N; }
77 template<
typename Derived>
81 const Derived& derived()
const {
return *
static_cast<const Derived*
>(
this); }
90 Index eval(
const T& values)
const {
return derived().eval_impl(values); }
92 template<
typename... Types>
93 Index eval(Types&&... values)
const {
return derived().eval_impl(std::make_tuple(values...)); }
95 NegateExpr<Derived> operator-()
const {
return NegateExpr<Derived>(derived()); }
97 AddExpr<Derived,ValueExpr<> > operator+(
Index b)
const
98 {
return AddExpr<Derived,ValueExpr<> >(derived(), b); }
99 AddExpr<Derived,ValueExpr<> > operator-(
Index a)
const
100 {
return AddExpr<Derived,ValueExpr<> >(derived(), -a); }
101 ProductExpr<Derived,ValueExpr<> > operator*(
Index a)
const
102 {
return ProductExpr<Derived,ValueExpr<> >(derived(),a); }
103 QuotientExpr<Derived,ValueExpr<> > operator/(
Index a)
const
104 {
return QuotientExpr<Derived,ValueExpr<> >(derived(),a); }
106 friend AddExpr<Derived,ValueExpr<> > operator+(
Index a,
const BaseExpr& b)
107 {
return AddExpr<Derived,ValueExpr<> >(b.derived(), a); }
108 friend AddExpr<NegateExpr<Derived>,ValueExpr<> > operator-(
Index a,
const BaseExpr& b)
109 {
return AddExpr<NegateExpr<Derived>,ValueExpr<> >(-b.derived(), a); }
110 friend ProductExpr<ValueExpr<>,Derived> operator*(
Index a,
const BaseExpr& b)
111 {
return ProductExpr<ValueExpr<>,Derived>(a,b.derived()); }
112 friend QuotientExpr<ValueExpr<>,Derived> operator/(
Index a,
const BaseExpr& b)
113 {
return QuotientExpr<ValueExpr<>,Derived>(a,b.derived()); }
116 AddExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator+(internal::FixedInt<N>)
const
117 {
return AddExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(), ValueExpr<internal::FixedInt<N> >()); }
119 AddExpr<Derived,ValueExpr<internal::FixedInt<-N> > > operator-(internal::FixedInt<N>)
const
120 {
return AddExpr<Derived,ValueExpr<internal::FixedInt<-N> > >(derived(), ValueExpr<internal::FixedInt<-N> >()); }
122 ProductExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator*(internal::FixedInt<N>)
const
123 {
return ProductExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(),ValueExpr<internal::FixedInt<N> >()); }
125 QuotientExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator/(internal::FixedInt<N>)
const
126 {
return QuotientExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(),ValueExpr<internal::FixedInt<N> >()); }
129 friend AddExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator+(internal::FixedInt<N>,
const BaseExpr& b)
130 {
return AddExpr<Derived,ValueExpr<internal::FixedInt<N> > >(b.derived(), ValueExpr<internal::FixedInt<N> >()); }
132 friend AddExpr<NegateExpr<Derived>,ValueExpr<internal::FixedInt<N> > > operator-(internal::FixedInt<N>,
const BaseExpr& b)
133 {
return AddExpr<NegateExpr<Derived>,ValueExpr<internal::FixedInt<N> > >(-b.derived(), ValueExpr<internal::FixedInt<N> >()); }
135 friend ProductExpr<ValueExpr<internal::FixedInt<N> >,Derived> operator*(internal::FixedInt<N>,
const BaseExpr& b)
136 {
return ProductExpr<ValueExpr<internal::FixedInt<N> >,Derived>(ValueExpr<internal::FixedInt<N> >(),b.derived()); }
138 friend QuotientExpr<ValueExpr<internal::FixedInt<N> >,Derived> operator/(internal::FixedInt<N>,
const BaseExpr& b)
139 {
return QuotientExpr<ValueExpr<internal::FixedInt<N> > ,Derived>(ValueExpr<internal::FixedInt<N> >(),b.derived()); }
142 template<
typename OtherDerived>
143 AddExpr<Derived,OtherDerived> operator+(
const BaseExpr<OtherDerived> &b)
const
144 {
return AddExpr<Derived,OtherDerived>(derived(), b.derived()); }
146 template<
typename OtherDerived>
147 AddExpr<Derived,NegateExpr<OtherDerived> > operator-(
const BaseExpr<OtherDerived> &b)
const
148 {
return AddExpr<Derived,NegateExpr<OtherDerived> >(derived(), -b.derived()); }
150 template<
typename OtherDerived>
151 ProductExpr<Derived,OtherDerived> operator*(
const BaseExpr<OtherDerived> &b)
const
152 {
return ProductExpr<Derived,OtherDerived>(derived(), b.derived()); }
154 template<
typename OtherDerived>
155 QuotientExpr<Derived,OtherDerived> operator/(
const BaseExpr<OtherDerived> &b)
const
156 {
return QuotientExpr<Derived,OtherDerived>(derived(), b.derived()); }
162 enum { value = internal::is_convertible<T,BaseExpr<T> >::value };
169 template<
typename Tag>
183 template<
typename tag>
203 template<
typename... Types>
204 Index eval_impl(
const std::tuple<Types...>& values)
const {
return std::get<SymbolValue<Tag> >(values).value(); }
207 template<
typename Arg0>
208 class NegateExpr :
public BaseExpr<NegateExpr<Arg0> >
211 NegateExpr(
const Arg0& arg0) : m_arg0(arg0) {}
214 Index eval_impl(
const T& values)
const {
return -m_arg0.eval_impl(values); }
219 template<
typename Arg0,
typename Arg1>
220 class AddExpr :
public BaseExpr<AddExpr<Arg0,Arg1> >
223 AddExpr(
const Arg0& arg0,
const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {}
226 Index eval_impl(
const T& values)
const {
return m_arg0.eval_impl(values) + m_arg1.eval_impl(values); }
232 template<
typename Arg0,
typename Arg1>
233 class ProductExpr :
public BaseExpr<ProductExpr<Arg0,Arg1> >
236 ProductExpr(
const Arg0& arg0,
const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {}
239 Index eval_impl(
const T& values)
const {
return m_arg0.eval_impl(values) * m_arg1.eval_impl(values); }
245 template<
typename Arg0,
typename Arg1>
246 class QuotientExpr :
public BaseExpr<QuotientExpr<Arg0,Arg1> >
249 QuotientExpr(
const Arg0& arg0,
const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {}
252 Index eval_impl(
const T& values)
const {
return m_arg0.eval_impl(values) / m_arg1.eval_impl(values); }
Definition: SymbolicIndex.h:79
Index eval(const T &values) const
Definition: SymbolicIndex.h:90
Definition: SymbolicIndex.h:185
SymbolValue< Tag > operator=(Index val) const
Definition: SymbolicIndex.h:196
tag Tag
Definition: SymbolicIndex.h:188
Definition: SymbolicIndex.h:171
SymbolValue(Index val)
Definition: SymbolicIndex.h:174
Index value() const
Definition: SymbolicIndex.h:177
Namespace containing all symbols from the Eigen library.
Definition: Core:139
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:59