10 #ifndef EIGEN_SYMBOLIC_INDEX_H
11 #define EIGEN_SYMBOLIC_INDEX_H
45 template<
typename Arg1,
typename Arg2>
class AddExpr;
46 template<
typename Arg1,
typename Arg2>
class ProductExpr;
47 template<
typename Arg1,
typename Arg2>
class QuotientExpr;
51 template<
typename IndexType=Index>
54 ValueExpr(IndexType val) : m_value(val) {}
56 IndexType eval_impl(
const T&)
const {
return m_value; }
68 Index eval_impl(
const T&)
const {
return N; }
76 template<
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()); }
198 template<
typename Tag>
212 template<
typename tag>
233 template<
typename... Types>
234 Index eval_impl(
const std::tuple<Types...>& values)
const {
return std::get<SymbolValue<Tag> >(values).value(); }
238 template<
typename Arg0>
242 NegateExpr(
const Arg0& arg0) : m_arg0(arg0) {}
245 Index eval_impl(
const T& values)
const {
return -m_arg0.eval_impl(values); }
250 template<
typename Arg0,
typename 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); }
263 template<
typename Arg0,
typename 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); }
276 template<
typename Arg0,
typename 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); }
293 #endif // EIGEN_SYMBOLIC_INDEX_H