10#ifndef EIGEN_SYMBOLIC_INDEX_H
11#define EIGEN_SYMBOLIC_INDEX_H
43template<
typename Tag>
class Symbol;
44template<
typename Arg0>
class NegateExpr;
45template<
typename Arg1,
typename Arg2>
class AddExpr;
46template<
typename Arg1,
typename Arg2>
class ProductExpr;
47template<
typename Arg1,
typename Arg2>
class QuotientExpr;
51template<
typename IndexType=Index>
54 ValueExpr(IndexType val) : m_value(val) {}
56 IndexType eval_impl(
const T&)
const {
return m_value; }
64class ValueExpr<internal::FixedInt<N> > {
68 EIGEN_CONSTEXPR
Index eval_impl(
const T&)
const {
return N; }
76template<
typename Derived>
80 const Derived& derived()
const {
return *
static_cast<const Derived*
>(
this); }
89 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...)); }
96 NegateExpr<Derived> operator-()
const {
return NegateExpr<Derived>(derived()); }
98 AddExpr<Derived,ValueExpr<> > operator+(
Index b)
const
99 {
return AddExpr<Derived,ValueExpr<> >(derived(), b); }
100 AddExpr<Derived,ValueExpr<> > operator-(
Index a)
const
101 {
return AddExpr<Derived,ValueExpr<> >(derived(), -a); }
102 ProductExpr<Derived,ValueExpr<> > operator*(
Index a)
const
103 {
return ProductExpr<Derived,ValueExpr<> >(derived(),a); }
104 QuotientExpr<Derived,ValueExpr<> > operator/(
Index a)
const
105 {
return QuotientExpr<Derived,ValueExpr<> >(derived(),a); }
107 friend AddExpr<Derived,ValueExpr<> > operator+(
Index a,
const BaseExpr& b)
108 {
return AddExpr<Derived,ValueExpr<> >(b.derived(), a); }
109 friend AddExpr<NegateExpr<Derived>,ValueExpr<> > operator-(
Index a,
const BaseExpr& b)
110 {
return AddExpr<NegateExpr<Derived>,ValueExpr<> >(-b.derived(), a); }
111 friend ProductExpr<ValueExpr<>,Derived> operator*(
Index a,
const BaseExpr& b)
112 {
return ProductExpr<ValueExpr<>,Derived>(a,b.derived()); }
113 friend QuotientExpr<ValueExpr<>,Derived> operator/(
Index a,
const BaseExpr& b)
114 {
return QuotientExpr<ValueExpr<>,Derived>(a,b.derived()); }
117 AddExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator+(internal::FixedInt<N>)
const
118 {
return AddExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(), ValueExpr<internal::FixedInt<N> >()); }
120 AddExpr<Derived,ValueExpr<internal::FixedInt<-N> > > operator-(internal::FixedInt<N>)
const
121 {
return AddExpr<Derived,ValueExpr<internal::FixedInt<-N> > >(derived(), ValueExpr<internal::FixedInt<-N> >()); }
123 ProductExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator*(internal::FixedInt<N>)
const
124 {
return ProductExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(),ValueExpr<internal::FixedInt<N> >()); }
126 QuotientExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator/(internal::FixedInt<N>)
const
127 {
return QuotientExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(),ValueExpr<internal::FixedInt<N> >()); }
130 friend AddExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator+(internal::FixedInt<N>,
const BaseExpr& b)
131 {
return AddExpr<Derived,ValueExpr<internal::FixedInt<N> > >(b.derived(), ValueExpr<internal::FixedInt<N> >()); }
133 friend AddExpr<NegateExpr<Derived>,ValueExpr<internal::FixedInt<N> > > operator-(internal::FixedInt<N>,
const BaseExpr& b)
134 {
return AddExpr<NegateExpr<Derived>,ValueExpr<internal::FixedInt<N> > >(-b.derived(), ValueExpr<internal::FixedInt<N> >()); }
136 friend ProductExpr<ValueExpr<internal::FixedInt<N> >,Derived> operator*(internal::FixedInt<N>,
const BaseExpr& b)
137 {
return ProductExpr<ValueExpr<internal::FixedInt<N> >,Derived>(ValueExpr<internal::FixedInt<N> >(),b.derived()); }
139 friend QuotientExpr<ValueExpr<internal::FixedInt<N> >,Derived> operator/(internal::FixedInt<N>,
const BaseExpr& b)
140 {
return QuotientExpr<ValueExpr<internal::FixedInt<N> > ,Derived>(ValueExpr<internal::FixedInt<N> >(),b.derived()); }
142#if (!EIGEN_HAS_CXX14)
144 AddExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator+(internal::FixedInt<N> (*)())
const
145 {
return AddExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(), ValueExpr<internal::FixedInt<N> >()); }
147 AddExpr<Derived,ValueExpr<internal::FixedInt<-N> > > operator-(internal::FixedInt<N> (*)())
const
148 {
return AddExpr<Derived,ValueExpr<internal::FixedInt<-N> > >(derived(), ValueExpr<internal::FixedInt<-N> >()); }
150 ProductExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator*(internal::FixedInt<N> (*)())
const
151 {
return ProductExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(),ValueExpr<internal::FixedInt<N> >()); }
153 QuotientExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator/(internal::FixedInt<N> (*)())
const
154 {
return QuotientExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(),ValueExpr<internal::FixedInt<N> >()); }
157 friend AddExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator+(internal::FixedInt<N> (*)(),
const BaseExpr& b)
158 {
return AddExpr<Derived,ValueExpr<internal::FixedInt<N> > >(b.derived(), ValueExpr<internal::FixedInt<N> >()); }
160 friend AddExpr<NegateExpr<Derived>,ValueExpr<internal::FixedInt<N> > > operator-(internal::FixedInt<N> (*)(),
const BaseExpr& b)
161 {
return AddExpr<NegateExpr<Derived>,ValueExpr<internal::FixedInt<N> > >(-b.derived(), ValueExpr<internal::FixedInt<N> >()); }
163 friend ProductExpr<ValueExpr<internal::FixedInt<N> >,Derived> operator*(internal::FixedInt<N> (*)(),
const BaseExpr& b)
164 {
return ProductExpr<ValueExpr<internal::FixedInt<N> >,Derived>(ValueExpr<internal::FixedInt<N> >(),b.derived()); }
166 friend QuotientExpr<ValueExpr<internal::FixedInt<N> >,Derived> operator/(internal::FixedInt<N> (*)(),
const BaseExpr& b)
167 {
return QuotientExpr<ValueExpr<internal::FixedInt<N> > ,Derived>(ValueExpr<internal::FixedInt<N> >(),b.derived()); }
171 template<
typename OtherDerived>
172 AddExpr<Derived,OtherDerived> operator+(
const BaseExpr<OtherDerived> &b)
const
173 {
return AddExpr<Derived,OtherDerived>(derived(), b.derived()); }
175 template<
typename OtherDerived>
176 AddExpr<Derived,NegateExpr<OtherDerived> > operator-(
const BaseExpr<OtherDerived> &b)
const
177 {
return AddExpr<Derived,NegateExpr<OtherDerived> >(derived(), -b.derived()); }
179 template<
typename OtherDerived>
180 ProductExpr<Derived,OtherDerived> operator*(
const BaseExpr<OtherDerived> &b)
const
181 {
return ProductExpr<Derived,OtherDerived>(derived(), b.derived()); }
183 template<
typename OtherDerived>
184 QuotientExpr<Derived,OtherDerived> operator/(
const BaseExpr<OtherDerived> &b)
const
185 {
return QuotientExpr<Derived,OtherDerived>(derived(), b.derived()); }
191 enum { value = internal::is_convertible<T,BaseExpr<T> >::value };
198template<
typename Tag>
212template<
typename tag>
233 template<
typename... Types>
234 Index eval_impl(
const std::tuple<Types...>& values)
const {
return std::get<SymbolValue<Tag> >(values).value(); }
238template<
typename Arg0>
239class NegateExpr :
public BaseExpr<NegateExpr<Arg0> >
242 NegateExpr(
const Arg0& arg0) : m_arg0(arg0) {}
245 Index eval_impl(
const T& values)
const {
return -m_arg0.eval_impl(values); }
250template<
typename Arg0,
typename Arg1>
251class AddExpr :
public BaseExpr<AddExpr<Arg0,Arg1> >
254 AddExpr(
const Arg0& arg0,
const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {}
257 Index eval_impl(
const T& values)
const {
return m_arg0.eval_impl(values) + m_arg1.eval_impl(values); }
263template<
typename Arg0,
typename Arg1>
264class ProductExpr :
public BaseExpr<ProductExpr<Arg0,Arg1> >
267 ProductExpr(
const Arg0& arg0,
const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {}
270 Index eval_impl(
const T& values)
const {
return m_arg0.eval_impl(values) * m_arg1.eval_impl(values); }
276template<
typename Arg0,
typename Arg1>
277class QuotientExpr :
public BaseExpr<QuotientExpr<Arg0,Arg1> >
280 QuotientExpr(
const Arg0& arg0,
const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {}
283 Index eval_impl(
const T& values)
const {
return m_arg0.eval_impl(values) / m_arg1.eval_impl(values); }
Definition: SymbolicIndex.h:78
Index eval(const T &values) const
Definition: SymbolicIndex.h:89
Definition: SymbolicIndex.h:214
SymbolValue< Tag > operator=(Index val) const
Definition: SymbolicIndex.h:225
tag Tag
Definition: SymbolicIndex.h:217
Definition: SymbolicIndex.h:200
SymbolValue(Index val)
Definition: SymbolicIndex.h:203
Index value() const
Definition: SymbolicIndex.h:206
Namespace containing all symbols from the Eigen library.
Definition: Core:141
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74