10#ifndef EIGEN_ARITHMETIC_SEQUENCE_H
11#define EIGEN_ARITHMETIC_SEQUENCE_H
17#if (!EIGEN_HAS_CXX11) || !((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48)
38template<
typename FirstType,
typename SizeType,
typename IncrType>
46template<
typename SizeType,
typename IncrType,
typename EnableIf =
void>
51template<
typename SizeType,
typename IncrType>
53 typedef FixedInt<(SizeType::value-1)*IncrType::value>
type;
56template<
typename FirstType,
typename SizeType,
typename IncrType>
58 typedef typename aseq_reverse_first_type_aux<SizeType,IncrType>::type Aux;
62template<
typename FirstType,
typename SizeType,
typename IncrType>
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>
109template<
typename FirstType,
typename SizeType,
typename IncrType>
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>
161ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
typename internal::cleanup_index_type<SizeType>::type,
typename internal::cleanup_seq_incr<IncrType>::type >
169template<
typename FirstType,
typename SizeType>
170ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
typename internal::cleanup_index_type<SizeType>::type >
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,
234 ArithmeticSequence<FirstTypeDerived, symbolic::AddExpr<symbolic::AddExpr<symbolic::NegateExpr<FirstTypeDerived>,symbolic::ValueExpr<> >,
235 symbolic::ValueExpr<internal::FixedInt<1> > > > >::type
236seq(
const symbolic::BaseExpr<FirstTypeDerived> &f, LastType l)
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,
243 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
244 symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::ValueExpr<> >,
245 symbolic::ValueExpr<internal::FixedInt<1> > > > >::type
246seq(FirstType f,
const symbolic::BaseExpr<LastTypeDerived> &l)
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>
252ArithmeticSequence<FirstTypeDerived,
253 symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::NegateExpr<FirstTypeDerived> >,symbolic::ValueExpr<internal::FixedInt<1> > > >
254seq(
const symbolic::BaseExpr<FirstTypeDerived> &f,
const symbolic::BaseExpr<LastTypeDerived> &l)
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,
272 ArithmeticSequence<FirstTypeDerived,
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
278seq(
const symbolic::BaseExpr<FirstTypeDerived> &f, LastType l, IncrType incr)
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,
286 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
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
291seq(FirstType f,
const symbolic::BaseExpr<LastTypeDerived> &l, IncrType incr)
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>
299ArithmeticSequence<FirstTypeDerived,
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>
305seq(
const symbolic::BaseExpr<FirstTypeDerived> &f,
const symbolic::BaseExpr<LastTypeDerived> &l, IncrType incr)
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>
322auto lastN(SizeType size)
323->
decltype(
seqN(Eigen::last+fix<1>()-size, size))
325 return seqN(Eigen::last+fix<1>()-size, size);
336template<
typename SizeType,
typename IncrType>
337auto lastN(SizeType size, IncrType incr)
338->
decltype(
seqN(Eigen::last-(size-fix<1>())*incr, size, incr))
340 return seqN(Eigen::last-(size-fix<1>())*incr, size, incr);
352template<
typename FirstType,
typename SizeType,
typename IncrType,
int XprSize>
357template<
typename FirstType,
typename SizeType,
typename 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>
This class represents an arithmetic progression defined by its first value , its size (aka length) n...
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
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:50
Definition IntegralConstant.h:52
Definition SymbolicIndex.h:252
Definition SymbolicIndex.h:265
Definition SymbolicIndex.h:52
Namespace containing all symbols from the Eigen library.
Definition LDLT.h:16
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
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
const int DynamicIndex
This value means that a signed quantity (e.g., a signed index) is not known at compile-time,...
Definition Constants.h:27
Definition IndexedViewHelper.h:86
Definition ArithmeticSequence.h:18
Definition ArithmeticSequence.h:47
Definition ArithmeticSequence.h:34
Definition ArithmeticSequence.h:71
Definition IndexedViewHelper.h:75
Definition IntegralConstant.h:133
Definition ArithmeticSequence.h:348
Definition SymbolicIndex.h:189