10 #ifndef EIGEN_ARITHMETIC_SEQUENCE_H 11 #define EIGEN_ARITHMETIC_SEQUENCE_H 17 #if (!EIGEN_HAS_CXX11) || !((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48) 18 template<
typename T>
struct aseq_negate {};
20 template<>
struct aseq_negate<
Index> {
24 template<
int N>
struct aseq_negate<FixedInt<N> > {
25 typedef FixedInt<-N> type;
29 template<>
struct aseq_negate<FixedInt<
DynamicIndex> > {};
31 template<
typename FirstType,
typename SizeType,
typename IncrType,
32 bool FirstIsSymbolic=symbolic::is_symbolic<FirstType>::value,
33 bool SizeIsSymbolic =symbolic::is_symbolic<SizeType>::value>
34 struct aseq_reverse_first_type {
38 template<
typename FirstType,
typename SizeType,
typename IncrType>
39 struct 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> >
46 template<
typename SizeType,
typename IncrType,
typename EnableIf =
void>
47 struct aseq_reverse_first_type_aux {
51 template<
typename SizeType,
typename IncrType>
52 struct 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;
56 template<
typename FirstType,
typename SizeType,
typename IncrType>
57 struct 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;
62 template<
typename FirstType,
typename SizeType,
typename IncrType>
63 struct 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;
71 template<
typename T>
struct cleanup_seq_incr {
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>
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;
152 return seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr);
160 template<
typename FirstType,
typename SizeType,
typename IncrType>
162 seqN(FirstType first, SizeType size, IncrType incr) {
169 template<
typename FirstType,
typename SizeType>
171 seqN(FirstType first, SizeType size) {
172 return ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
typename internal::cleanup_index_type<SizeType>::type>(first,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),
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,
243 symbolic::ValueExpr<internal::FixedInt<1> > > > >::type
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
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>
261 symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::NegateExpr<FirstTypeDerived> >,symbolic::ValueExpr<internal::FixedInt<1> > > >
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,
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
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
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>
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>
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)
343 template<
typename SizeType>
355 struct make_size_type {
356 typedef typename internal::conditional<symbolic::is_symbolic<T>::value,
Index, T>::type type;
359 template<
typename FirstType,
typename SizeType,
typename IncrType,
int XprSize>
360 struct IndexedViewCompatibleType<ArithmeticSequence<FirstType,SizeType,IncrType>, 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>
372 struct get_compile_time_incr<ArithmeticSequence<FirstType,SizeType,IncrType> > {
373 enum { value = get_fixed_value<IncrType,DynamicIndex>::value };
413 #endif // EIGEN_ARITHMETIC_SEQUENCE_H static const Eigen::internal::all_t all
Definition: IndexedViewHelper.h:171
static const auto lastp1
Definition: IndexedViewHelper.h:53
Namespace containing all symbols from the Eigen library.
Definition: Core:141
const int DynamicIndex
Definition: Constants.h:27
Index size() const
Definition: ArithmeticSequence.h:122
auto seq(FirstType f, LastType l, IncrType incr)
static const symbolic::SymbolExpr< internal::symbolic_last_tag > last
Definition: IndexedViewHelper.h:38
auto lastN(SizeType size, IncrType incr) -> decltype(seqN(Eigen::last-(size-fix< 1 >()) *incr, size, incr))
Definition: ArithmeticSequence.h:331
Index operator[](Index i) const
Definition: ArithmeticSequence.h:128
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Index first() const
Definition: ArithmeticSequence.h:125
Definition: Eigen_Colamd.h:50
Definition: ArithmeticSequence.h:82
Definition: SymbolicIndex.h:77
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