10#ifndef EIGEN_ARITHMETIC_SEQUENCE_H
11#define EIGEN_ARITHMETIC_SEQUENCE_H
17#if (!EIGEN_HAS_CXX11) || !((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48)
18template<
typename T>
struct aseq_negate {};
20template<>
struct aseq_negate<
Index> {
24template<
int N>
struct aseq_negate<FixedInt<N> > {
25 typedef FixedInt<-N> type;
29template<>
struct aseq_negate<FixedInt<
DynamicIndex> > {};
31template<
typename FirstType,
typename SizeType,
typename IncrType,
32 bool FirstIsSymbolic=symbolic::is_symbolic<FirstType>::value,
33 bool SizeIsSymbolic =symbolic::is_symbolic<SizeType>::value>
34struct aseq_reverse_first_type {
38template<
typename FirstType,
typename SizeType,
typename IncrType>
39struct aseq_reverse_first_type<FirstType,SizeType,IncrType,true,true> {
40 typedef symbolic::AddExpr<FirstType,
41 symbolic::ProductExpr<symbolic::AddExpr<SizeType,symbolic::ValueExpr<FixedInt<-1> > >,
42 symbolic::ValueExpr<IncrType> >
46template<
typename SizeType,
typename IncrType,
typename EnableIf =
void>
47struct aseq_reverse_first_type_aux {
51template<
typename SizeType,
typename IncrType>
52struct aseq_reverse_first_type_aux<SizeType,IncrType,typename internal::enable_if<bool((SizeType::value+IncrType::value)|0x1)>::type> {
53 typedef FixedInt<(SizeType::value-1)*IncrType::value> type;
56template<
typename FirstType,
typename SizeType,
typename IncrType>
57struct aseq_reverse_first_type<FirstType,SizeType,IncrType,true,false> {
58 typedef typename aseq_reverse_first_type_aux<SizeType,IncrType>::type Aux;
59 typedef symbolic::AddExpr<FirstType,symbolic::ValueExpr<Aux> > type;
62template<
typename FirstType,
typename SizeType,
typename IncrType>
63struct aseq_reverse_first_type<FirstType,SizeType,IncrType,false,true> {
64 typedef symbolic::AddExpr<symbolic::ProductExpr<symbolic::AddExpr<SizeType,symbolic::ValueExpr<FixedInt<-1> > >,
65 symbolic::ValueExpr<IncrType> >,
66 symbolic::ValueExpr<> > type;
71template<
typename T>
struct cleanup_seq_incr {
72 typedef typename cleanup_index_type<T,DynamicIndex>::type type;
81template<
typename FirstType=Index,
typename SizeType=Index,
typename IncrType=
internal::FixedInt<1> >
84template<
typename FirstType,
typename SizeType,
typename IncrType>
86 typename internal::cleanup_index_type<SizeType>::type,
87 typename internal::cleanup_seq_incr<IncrType>::type >
88seqN(FirstType first, SizeType size, IncrType incr);
109template<
typename FirstType,
typename SizeType,
typename IncrType>
110class ArithmeticSequence
114 ArithmeticSequence(FirstType
first, SizeType
size, IncrType incr) : m_first(
first), m_size(
size), m_incr(incr) {}
117 SizeAtCompileTime = internal::get_fixed_value<SizeType>::value,
118 IncrAtCompileTime = internal::get_fixed_value<IncrType,DynamicIndex>::value
130 const FirstType& firstObject()
const {
return m_first; }
131 const SizeType& sizeObject()
const {
return m_size; }
132 const IncrType& incrObject()
const {
return m_incr; }
141#if EIGEN_HAS_CXX11 && ((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48)
142 auto reverse() const -> decltype(Eigen::
seqN(m_first+(m_size+
fix<-1>())*m_incr,m_size,-m_incr)) {
143 return seqN(m_first+(m_size+
fix<-1>())*m_incr,m_size,-m_incr);
147 typedef typename internal::aseq_negate<IncrType>::type ReverseIncrType;
148 typedef typename internal::aseq_reverse_first_type<FirstType,SizeType,IncrType>::type ReverseFirstType;
150 ArithmeticSequence<ReverseFirstType,SizeType,ReverseIncrType>
152 return seqN(m_first+(m_size+
fix<-1>())*m_incr,m_size,-m_incr);
160template<
typename FirstType,
typename SizeType,
typename IncrType>
162seqN(FirstType first, SizeType size, IncrType incr) {
169template<
typename FirstType,
typename SizeType>
170ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
typename internal::cleanup_index_type<SizeType>::type >
171seqN(FirstType first, SizeType size) {
187template<
typename FirstType,
typename LastType>
188auto seq(FirstType f, LastType l) ->
decltype(
seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
189 (
typename internal::cleanup_index_type<LastType>::type(l)
190 -
typename internal::cleanup_index_type<FirstType>::type(f)+
fix<1>())))
192 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
193 (
typename internal::cleanup_index_type<LastType>::type(l)
194 -
typename internal::cleanup_index_type<FirstType>::type(f)+
fix<1>()));
206template<
typename FirstType,
typename LastType,
typename IncrType>
207auto seq(FirstType f, LastType l, IncrType incr)
208 ->
decltype(
seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
209 (
typename internal::cleanup_index_type<LastType>::type(l)
210 -
typename internal::cleanup_index_type<FirstType>::type(f)+
typename internal::cleanup_seq_incr<IncrType>::type(incr)
211 ) /
typename internal::cleanup_seq_incr<IncrType>::type(incr),
212 typename internal::cleanup_seq_incr<IncrType>::type(incr)))
214 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
215 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
216 (
typename internal::cleanup_index_type<LastType>::type(l)
217 -
typename internal::cleanup_index_type<FirstType>::type(f)+CleanedIncrType(incr)) / CleanedIncrType(incr),
218 CleanedIncrType(incr));
223template<
typename FirstType,
typename LastType>
224typename internal::enable_if<!(symbolic::is_symbolic<FirstType>::value || symbolic::is_symbolic<LastType>::value),
225 ArithmeticSequence<
typename internal::cleanup_index_type<FirstType>::type,Index> >::type
226seq(FirstType f, LastType l)
228 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
229 Index((
typename internal::cleanup_index_type<LastType>::type(l)-
typename internal::cleanup_index_type<FirstType>::type(f)+
fix<1>())));
232template<
typename FirstTypeDerived,
typename LastType>
233typename internal::enable_if<!symbolic::is_symbolic<LastType>::value,
235 symbolic::ValueExpr<internal::FixedInt<1> > > > >::type
238 return seqN(f.derived(),(
typename internal::cleanup_index_type<LastType>::type(l)-f.derived()+
fix<1>()));
241template<
typename FirstType,
typename LastTypeDerived>
242typename internal::enable_if<!symbolic::is_symbolic<FirstType>::value,
244 symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::ValueExpr<> >,
245 symbolic::ValueExpr<internal::FixedInt<1> > > > >::type
248 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),(l.derived()-
typename internal::cleanup_index_type<FirstType>::type(f)+
fix<1>()));
251template<
typename FirstTypeDerived,
typename LastTypeDerived>
253 symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::NegateExpr<FirstTypeDerived> >,symbolic::ValueExpr<internal::FixedInt<1> > > >
256 return seqN(f.derived(),(l.derived()-f.derived()+
fix<1>()));
260template<
typename FirstType,
typename LastType,
typename IncrType>
261typename internal::enable_if<!(symbolic::is_symbolic<FirstType>::value || symbolic::is_symbolic<LastType>::value),
262 ArithmeticSequence<
typename internal::cleanup_index_type<FirstType>::type,
Index,
typename internal::cleanup_seq_incr<IncrType>::type> >::type
263seq(FirstType f, LastType l, IncrType incr)
265 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
266 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
267 Index((
typename internal::cleanup_index_type<LastType>::type(l)-
typename internal::cleanup_index_type<FirstType>::type(f)+CleanedIncrType(incr))/CleanedIncrType(incr)), incr);
270template<
typename FirstTypeDerived,
typename LastType,
typename IncrType>
271typename internal::enable_if<!symbolic::is_symbolic<LastType>::value,
273 symbolic::QuotientExpr<symbolic::AddExpr<symbolic::AddExpr<symbolic::NegateExpr<FirstTypeDerived>,
274 symbolic::ValueExpr<> >,
275 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
276 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
277 typename internal::cleanup_seq_incr<IncrType>::type> >::type
280 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
281 return seqN(f.derived(),(
typename internal::cleanup_index_type<LastType>::type(l)-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
284template<
typename FirstType,
typename LastTypeDerived,
typename IncrType>
285typename internal::enable_if<!symbolic::is_symbolic<FirstType>::value,
287 symbolic::QuotientExpr<symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::ValueExpr<> >,
288 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
289 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
290 typename internal::cleanup_seq_incr<IncrType>::type> >::type
293 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
294 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
295 (l.derived()-
typename internal::cleanup_index_type<FirstType>::type(f)+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
298template<
typename FirstTypeDerived,
typename LastTypeDerived,
typename IncrType>
300 symbolic::QuotientExpr<symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,
301 symbolic::NegateExpr<FirstTypeDerived> >,
302 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
303 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
304 typename internal::cleanup_seq_incr<IncrType>::type>
307 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
308 return seqN(f.derived(),(l.derived()-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
321template<
typename SizeType>
336template<
typename SizeType,
typename IncrType>
337auto lastN(SizeType size, IncrType incr)
348struct make_size_type {
349 typedef typename internal::conditional<symbolic::is_symbolic<T>::value, Index, T>::type type;
352template<
typename FirstType,
typename SizeType,
typename IncrType,
int XprSize>
353struct IndexedViewCompatibleType<ArithmeticSequence<FirstType,SizeType,IncrType>, XprSize> {
354 typedef ArithmeticSequence<Index,typename make_size_type<SizeType>::type,IncrType> type;
357template<
typename FirstType,
typename SizeType,
typename IncrType>
358ArithmeticSequence<Index,typename make_size_type<SizeType>::type,IncrType>
359makeIndexedViewCompatible(
const ArithmeticSequence<FirstType,SizeType,IncrType>& ids,
Index size,SpecializedType) {
360 return ArithmeticSequence<Index,typename make_size_type<SizeType>::type,IncrType>(
361 eval_expr_given_size(ids.firstObject(),size),eval_expr_given_size(ids.sizeObject(),size),ids.incrObject());
364template<
typename FirstType,
typename SizeType,
typename IncrType>
365struct get_compile_time_incr<ArithmeticSequence<FirstType,SizeType,IncrType> > {
366 enum { value = get_fixed_value<IncrType,DynamicIndex>::value };
Definition ArithmeticSequence.h:111
Index operator[](Index i) const
Definition ArithmeticSequence.h:128
Index first() const
Definition ArithmeticSequence.h:125
Index size() const
Definition ArithmeticSequence.h:122
Definition SymbolicIndex.h:78
static const Eigen::internal::all_t all
Definition IndexedViewHelper.h:171
static const symbolic::SymbolExpr< internal::symbolic_last_tag > last
Definition IndexedViewHelper.h:38
static const auto lastp1
Definition IndexedViewHelper.h:53
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1
ArithmeticSequence< typename internal::cleanup_index_type< FirstType >::type, typename internal::cleanup_index_type< SizeType >::type, typename internal::cleanup_seq_incr< IncrType >::type > seqN(FirstType first, SizeType size, IncrType incr)
Definition ArithmeticSequence.h:162
auto lastN(SizeType size) -> decltype(seqN(Eigen::last+fix< 1 >() -size, size))
Definition ArithmeticSequence.h:322
auto seq(FirstType f, LastType l) -> decltype(seqN(typename internal::cleanup_index_type< FirstType >::type(f),(typename internal::cleanup_index_type< LastType >::type(l) - typename internal::cleanup_index_type< FirstType >::type(f)+fix< 1 >())))
Definition ArithmeticSequence.h:188
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
const int DynamicIndex
Definition Constants.h:27