10 #ifndef EIGEN_ARITHMETIC_SEQUENCE_H
11 #define EIGEN_ARITHMETIC_SEQUENCE_H
17 #if (!EIGEN_HAS_CXX11) || !((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48)
31 template<
typename FirstType,
typename SizeType,
typename IncrType,
38 template<
typename FirstType,
typename SizeType,
typename IncrType>
46 template<
typename SizeType,
typename IncrType,
typename EnableIf =
void>
51 template<
typename SizeType,
typename IncrType>
53 typedef FixedInt<(SizeType::value-1)*IncrType::value>
type;
56 template<
typename FirstType,
typename SizeType,
typename IncrType>
58 typedef typename aseq_reverse_first_type_aux<SizeType,IncrType>::type Aux;
62 template<
typename FirstType,
typename SizeType,
typename IncrType>
72 typedef typename cleanup_index_type<T,DynamicIndex>::type type;
81 template<
typename FirstType=Index,
typename SizeType=Index,
typename IncrType=
internal::FixedInt<1> >
84 template<
typename FirstType,
typename SizeType,
typename IncrType>
86 typename internal::cleanup_index_type<SizeType>::type,
87 typename internal::cleanup_seq_incr<IncrType>::type >
88 seqN(FirstType first, SizeType size, IncrType incr);
109 template<
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);
160 template<
typename FirstType,
typename SizeType,
typename IncrType>
161 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
typename internal::cleanup_index_type<SizeType>::type,
typename internal::cleanup_seq_incr<IncrType>::type >
162 seqN(FirstType first, SizeType size, IncrType incr) {
169 template<
typename FirstType,
typename SizeType>
170 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
typename internal::cleanup_index_type<SizeType>::type >
171 seqN(FirstType first, SizeType size) {
175 #ifdef EIGEN_PARSED_BY_DOXYGEN
186 template<
typename FirstType,
typename LastType,
typename IncrType>
187 auto seq(FirstType f, LastType l, IncrType incr);
198 template<
typename FirstType,
typename LastType>
199 auto seq(FirstType f, LastType l);
201 #else // EIGEN_PARSED_BY_DOXYGEN
204 template<
typename FirstType,
typename LastType>
205 auto seq(FirstType f, LastType l) -> decltype(
seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
206 (
typename internal::cleanup_index_type<LastType>::type(l)
207 -
typename internal::cleanup_index_type<FirstType>::type(f)+fix<1>())))
209 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
210 (
typename internal::cleanup_index_type<LastType>::type(l)
211 -
typename internal::cleanup_index_type<FirstType>::type(f)+fix<1>()));
214 template<
typename FirstType,
typename LastType,
typename IncrType>
215 auto seq(FirstType f, LastType l, IncrType incr)
216 -> decltype(
seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
217 (
typename internal::cleanup_index_type<LastType>::type(l)
218 -
typename internal::cleanup_index_type<FirstType>::type(f)+
typename internal::cleanup_seq_incr<IncrType>::type(incr)
219 ) /
typename internal::cleanup_seq_incr<IncrType>::type(incr),
220 typename internal::cleanup_seq_incr<IncrType>::type(incr)))
222 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
223 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
224 (
typename internal::cleanup_index_type<LastType>::type(l)
225 -
typename internal::cleanup_index_type<FirstType>::type(f)+CleanedIncrType(incr)) / CleanedIncrType(incr),
226 CleanedIncrType(incr));
229 #else // EIGEN_HAS_CXX11
231 template<
typename FirstType,
typename LastType>
232 typename internal::enable_if<!(symbolic::is_symbolic<FirstType>::value || symbolic::is_symbolic<LastType>::value),
233 ArithmeticSequence<
typename internal::cleanup_index_type<FirstType>::type,
Index> >::type
234 seq(FirstType f, LastType l)
236 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
237 Index((
typename internal::cleanup_index_type<LastType>::type(l)-
typename internal::cleanup_index_type<FirstType>::type(f)+fix<1>())));
240 template<
typename FirstTypeDerived,
typename LastType>
241 typename internal::enable_if<!symbolic::is_symbolic<LastType>::value,
242 ArithmeticSequence<FirstTypeDerived, symbolic::AddExpr<symbolic::AddExpr<symbolic::NegateExpr<FirstTypeDerived>,symbolic::ValueExpr<> >,
243 symbolic::ValueExpr<internal::FixedInt<1> > > > >::type
244 seq(
const symbolic::BaseExpr<FirstTypeDerived> &f, LastType l)
246 return seqN(f.derived(),(
typename internal::cleanup_index_type<LastType>::type(l)-f.derived()+fix<1>()));
249 template<
typename FirstType,
typename LastTypeDerived>
250 typename internal::enable_if<!symbolic::is_symbolic<FirstType>::value,
251 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
252 symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::ValueExpr<> >,
253 symbolic::ValueExpr<internal::FixedInt<1> > > > >::type
254 seq(FirstType f,
const symbolic::BaseExpr<LastTypeDerived> &l)
256 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),(l.derived()-
typename internal::cleanup_index_type<FirstType>::type(f)+fix<1>()));
259 template<
typename FirstTypeDerived,
typename LastTypeDerived>
260 ArithmeticSequence<FirstTypeDerived,
261 symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::NegateExpr<FirstTypeDerived> >,symbolic::ValueExpr<internal::FixedInt<1> > > >
262 seq(
const symbolic::BaseExpr<FirstTypeDerived> &f,
const symbolic::BaseExpr<LastTypeDerived> &l)
264 return seqN(f.derived(),(l.derived()-f.derived()+fix<1>()));
268 template<
typename FirstType,
typename LastType,
typename IncrType>
269 typename internal::enable_if<!(symbolic::is_symbolic<FirstType>::value || symbolic::is_symbolic<LastType>::value),
270 ArithmeticSequence<
typename internal::cleanup_index_type<FirstType>::type,
Index,
typename internal::cleanup_seq_incr<IncrType>::type> >::type
271 seq(FirstType f, LastType l, IncrType incr)
273 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
274 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
275 Index((
typename internal::cleanup_index_type<LastType>::type(l)-
typename internal::cleanup_index_type<FirstType>::type(f)+CleanedIncrType(incr))/CleanedIncrType(incr)), incr);
278 template<
typename FirstTypeDerived,
typename LastType,
typename IncrType>
279 typename internal::enable_if<!symbolic::is_symbolic<LastType>::value,
280 ArithmeticSequence<FirstTypeDerived,
281 symbolic::QuotientExpr<symbolic::AddExpr<symbolic::AddExpr<symbolic::NegateExpr<FirstTypeDerived>,
282 symbolic::ValueExpr<> >,
283 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
284 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
285 typename internal::cleanup_seq_incr<IncrType>::type> >::type
286 seq(
const symbolic::BaseExpr<FirstTypeDerived> &f, LastType l, IncrType incr)
288 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
289 return seqN(f.derived(),(
typename internal::cleanup_index_type<LastType>::type(l)-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
292 template<
typename FirstType,
typename LastTypeDerived,
typename IncrType>
293 typename internal::enable_if<!symbolic::is_symbolic<FirstType>::value,
294 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
295 symbolic::QuotientExpr<symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::ValueExpr<> >,
296 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
297 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
298 typename internal::cleanup_seq_incr<IncrType>::type> >::type
299 seq(FirstType f,
const symbolic::BaseExpr<LastTypeDerived> &l, IncrType incr)
301 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
302 return seqN(
typename internal::cleanup_index_type<FirstType>::type(f),
303 (l.derived()-
typename internal::cleanup_index_type<FirstType>::type(f)+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
306 template<
typename FirstTypeDerived,
typename LastTypeDerived,
typename IncrType>
307 ArithmeticSequence<FirstTypeDerived,
308 symbolic::QuotientExpr<symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,
309 symbolic::NegateExpr<FirstTypeDerived> >,
310 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
311 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
312 typename internal::cleanup_seq_incr<IncrType>::type>
313 seq(
const symbolic::BaseExpr<FirstTypeDerived> &f,
const symbolic::BaseExpr<LastTypeDerived> &l, IncrType incr)
315 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
316 return seqN(f.derived(),(l.derived()-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
318 #endif // EIGEN_HAS_CXX11
320 #endif // EIGEN_PARSED_BY_DOXYGEN
323 #if EIGEN_HAS_CXX11 || defined(EIGEN_PARSED_BY_DOXYGEN)
330 template<
typename SizeType,
typename IncrType>
331 auto lastN(SizeType size, IncrType incr)
332 -> decltype(
seqN(Eigen::last-(size-fix<1>())*incr, size, incr))
334 return seqN(Eigen::last-(size-fix<1>())*incr, size, incr);
343 template<
typename SizeType>
344 auto lastN(SizeType size)
345 -> decltype(
seqN(Eigen::last+fix<1>()-size, size))
347 return seqN(Eigen::last+fix<1>()-size, size);
359 template<
typename FirstType,
typename SizeType,
typename IncrType,
int XprSize>
364 template<
typename FirstType,
typename SizeType,
typename IncrType>
368 eval_expr_given_size(ids.firstObject(),size),eval_expr_given_size(ids.sizeObject(),size),ids.incrObject());
371 template<
typename FirstType,
typename SizeType,
typename IncrType>
413 #endif // EIGEN_ARITHMETIC_SEQUENCE_H