10#ifndef EIGEN_STLITERATORS_H
11#define EIGEN_STLITERATORS_H
17template<
typename IteratorType>
18struct indexed_based_stl_iterator_traits;
20template<
typename Derived>
21class indexed_based_stl_iterator_base
24 typedef indexed_based_stl_iterator_traits<Derived> traits;
25 typedef typename traits::XprType XprType;
26 typedef indexed_based_stl_iterator_base<typename traits::non_const_iterator> non_const_iterator;
27 typedef indexed_based_stl_iterator_base<typename traits::const_iterator> const_iterator;
28 typedef typename internal::conditional<internal::is_const<XprType>::value,non_const_iterator,const_iterator>::type other_iterator;
30 friend class indexed_based_stl_iterator_base<typename traits::const_iterator>;
31 friend class indexed_based_stl_iterator_base<typename traits::non_const_iterator>;
33 typedef
Index difference_type;
34 typedef std::random_access_iterator_tag iterator_category;
36 indexed_based_stl_iterator_base() EIGEN_NO_THROW : mp_xpr(0), m_index(0) {}
37 indexed_based_stl_iterator_base(XprType& xpr,
Index index) EIGEN_NO_THROW : mp_xpr(&xpr), m_index(index) {}
39 indexed_based_stl_iterator_base(
const non_const_iterator& other) EIGEN_NO_THROW
40 : mp_xpr(other.mp_xpr), m_index(other.m_index)
43 indexed_based_stl_iterator_base& operator=(
const non_const_iterator& other)
45 mp_xpr = other.mp_xpr;
46 m_index = other.m_index;
50 Derived& operator++() { ++m_index;
return derived(); }
51 Derived& operator--() { --m_index;
return derived(); }
53 Derived operator++(
int) { Derived prev(derived()); operator++();
return prev;}
54 Derived operator--(
int) { Derived prev(derived()); operator--();
return prev;}
56 friend Derived operator+(
const indexed_based_stl_iterator_base& a,
Index b) { Derived ret(a.derived()); ret += b;
return ret; }
57 friend Derived operator-(
const indexed_based_stl_iterator_base& a,
Index b) { Derived ret(a.derived()); ret -= b;
return ret; }
58 friend Derived operator+(
Index a,
const indexed_based_stl_iterator_base& b) { Derived ret(b.derived()); ret += a;
return ret; }
59 friend Derived operator-(
Index a,
const indexed_based_stl_iterator_base& b) { Derived ret(b.derived()); ret -= a;
return ret; }
61 Derived& operator+=(
Index b) { m_index += b;
return derived(); }
62 Derived& operator-=(
Index b) { m_index -= b;
return derived(); }
64 difference_type operator-(
const indexed_based_stl_iterator_base& other)
const
66 eigen_assert(mp_xpr == other.mp_xpr);
67 return m_index - other.m_index;
70 difference_type operator-(
const other_iterator& other)
const
72 eigen_assert(mp_xpr == other.mp_xpr);
73 return m_index - other.m_index;
76 bool operator==(
const indexed_based_stl_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index == other.m_index; }
77 bool operator!=(
const indexed_based_stl_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index != other.m_index; }
78 bool operator< (
const indexed_based_stl_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index < other.m_index; }
79 bool operator<=(
const indexed_based_stl_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index <= other.m_index; }
80 bool operator> (
const indexed_based_stl_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index > other.m_index; }
81 bool operator>=(
const indexed_based_stl_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index >= other.m_index; }
83 bool operator==(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index == other.m_index; }
84 bool operator!=(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index != other.m_index; }
85 bool operator< (
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index < other.m_index; }
86 bool operator<=(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index <= other.m_index; }
87 bool operator> (
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index > other.m_index; }
88 bool operator>=(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index >= other.m_index; }
92 Derived& derived() {
return static_cast<Derived&
>(*this); }
93 const Derived& derived()
const {
return static_cast<const Derived&
>(*this); }
99template<
typename Derived>
100class indexed_based_stl_reverse_iterator_base
103 typedef indexed_based_stl_iterator_traits<Derived> traits;
104 typedef typename traits::XprType XprType;
105 typedef indexed_based_stl_reverse_iterator_base<typename traits::non_const_iterator> non_const_iterator;
106 typedef indexed_based_stl_reverse_iterator_base<typename traits::const_iterator> const_iterator;
107 typedef typename internal::conditional<internal::is_const<XprType>::value,non_const_iterator,const_iterator>::type other_iterator;
109 friend class indexed_based_stl_reverse_iterator_base<typename traits::const_iterator>;
110 friend class indexed_based_stl_reverse_iterator_base<typename traits::non_const_iterator>;
112 typedef
Index difference_type;
113 typedef std::random_access_iterator_tag iterator_category;
115 indexed_based_stl_reverse_iterator_base() : mp_xpr(0), m_index(0) {}
116 indexed_based_stl_reverse_iterator_base(XprType& xpr,
Index index) : mp_xpr(&xpr), m_index(index) {}
118 indexed_based_stl_reverse_iterator_base(
const non_const_iterator& other)
119 : mp_xpr(other.mp_xpr), m_index(other.m_index)
122 indexed_based_stl_reverse_iterator_base& operator=(
const non_const_iterator& other)
124 mp_xpr = other.mp_xpr;
125 m_index = other.m_index;
129 Derived& operator++() { --m_index;
return derived(); }
130 Derived& operator--() { ++m_index;
return derived(); }
132 Derived operator++(
int) { Derived prev(derived()); operator++();
return prev;}
133 Derived operator--(
int) { Derived prev(derived()); operator--();
return prev;}
135 friend Derived operator+(
const indexed_based_stl_reverse_iterator_base& a,
Index b) { Derived ret(a.derived()); ret += b;
return ret; }
136 friend Derived operator-(
const indexed_based_stl_reverse_iterator_base& a,
Index b) { Derived ret(a.derived()); ret -= b;
return ret; }
137 friend Derived operator+(
Index a,
const indexed_based_stl_reverse_iterator_base& b) { Derived ret(b.derived()); ret += a;
return ret; }
138 friend Derived operator-(
Index a,
const indexed_based_stl_reverse_iterator_base& b) { Derived ret(b.derived()); ret -= a;
return ret; }
140 Derived& operator+=(
Index b) { m_index -= b;
return derived(); }
141 Derived& operator-=(
Index b) { m_index += b;
return derived(); }
143 difference_type operator-(
const indexed_based_stl_reverse_iterator_base& other)
const
145 eigen_assert(mp_xpr == other.mp_xpr);
146 return other.m_index - m_index;
149 difference_type operator-(
const other_iterator& other)
const
151 eigen_assert(mp_xpr == other.mp_xpr);
152 return other.m_index - m_index;
155 bool operator==(
const indexed_based_stl_reverse_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index == other.m_index; }
156 bool operator!=(
const indexed_based_stl_reverse_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index != other.m_index; }
157 bool operator< (
const indexed_based_stl_reverse_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index > other.m_index; }
158 bool operator<=(
const indexed_based_stl_reverse_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index >= other.m_index; }
159 bool operator> (
const indexed_based_stl_reverse_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index < other.m_index; }
160 bool operator>=(
const indexed_based_stl_reverse_iterator_base& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index <= other.m_index; }
162 bool operator==(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index == other.m_index; }
163 bool operator!=(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index != other.m_index; }
164 bool operator< (
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index > other.m_index; }
165 bool operator<=(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index >= other.m_index; }
166 bool operator> (
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index < other.m_index; }
167 bool operator>=(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index <= other.m_index; }
171 Derived& derived() {
return static_cast<Derived&
>(*this); }
172 const Derived& derived()
const {
return static_cast<const Derived&
>(*this); }
178template<
typename XprType>
179class pointer_based_stl_iterator
181 enum { is_lvalue = internal::is_lvalue<XprType>::value };
182 typedef pointer_based_stl_iterator<typename internal::remove_const<XprType>::type> non_const_iterator;
183 typedef pointer_based_stl_iterator<typename internal::add_const<XprType>::type> const_iterator;
184 typedef typename internal::conditional<internal::is_const<XprType>::value,non_const_iterator,const_iterator>::type other_iterator;
186 friend class pointer_based_stl_iterator<typename internal::add_const<XprType>::type>;
187 friend class pointer_based_stl_iterator<typename internal::remove_const<XprType>::type>;
189 typedef
Index difference_type;
190 typedef typename XprType::Scalar value_type;
191 typedef std::random_access_iterator_tag iterator_category;
192 typedef typename internal::conditional<bool(is_lvalue), value_type*, const value_type*>::type pointer;
193 typedef typename internal::conditional<bool(is_lvalue), value_type&, const value_type&>::type reference;
196 pointer_based_stl_iterator() EIGEN_NO_THROW : m_ptr(0) {}
197 pointer_based_stl_iterator(XprType& xpr,
Index index) EIGEN_NO_THROW : m_incr(xpr.innerStride())
199 m_ptr = xpr.data() + index * m_incr.value();
202 pointer_based_stl_iterator(
const non_const_iterator& other) EIGEN_NO_THROW
203 : m_ptr(other.m_ptr), m_incr(other.m_incr)
206 pointer_based_stl_iterator& operator=(
const non_const_iterator& other) EIGEN_NO_THROW
209 m_incr.setValue(other.m_incr);
213 reference operator*()
const {
return *m_ptr; }
214 reference operator[](
Index i)
const {
return *(m_ptr+i*m_incr.value()); }
215 pointer operator->()
const {
return m_ptr; }
217 pointer_based_stl_iterator& operator++() { m_ptr += m_incr.value();
return *
this; }
218 pointer_based_stl_iterator& operator--() { m_ptr -= m_incr.value();
return *
this; }
220 pointer_based_stl_iterator operator++(
int) { pointer_based_stl_iterator prev(*
this); operator++();
return prev;}
221 pointer_based_stl_iterator operator--(
int) { pointer_based_stl_iterator prev(*
this); operator--();
return prev;}
223 friend pointer_based_stl_iterator operator+(
const pointer_based_stl_iterator& a,
Index b) { pointer_based_stl_iterator ret(a); ret += b;
return ret; }
224 friend pointer_based_stl_iterator operator-(
const pointer_based_stl_iterator& a,
Index b) { pointer_based_stl_iterator ret(a); ret -= b;
return ret; }
225 friend pointer_based_stl_iterator operator+(
Index a,
const pointer_based_stl_iterator& b) { pointer_based_stl_iterator ret(b); ret += a;
return ret; }
226 friend pointer_based_stl_iterator operator-(
Index a,
const pointer_based_stl_iterator& b) { pointer_based_stl_iterator ret(b); ret -= a;
return ret; }
228 pointer_based_stl_iterator& operator+=(
Index b) { m_ptr += b*m_incr.value();
return *
this; }
229 pointer_based_stl_iterator& operator-=(
Index b) { m_ptr -= b*m_incr.value();
return *
this; }
231 difference_type operator-(
const pointer_based_stl_iterator& other)
const {
232 return (m_ptr - other.m_ptr)/m_incr.value();
235 difference_type operator-(
const other_iterator& other)
const {
236 return (m_ptr - other.m_ptr)/m_incr.value();
239 bool operator==(
const pointer_based_stl_iterator& other)
const {
return m_ptr == other.m_ptr; }
240 bool operator!=(
const pointer_based_stl_iterator& other)
const {
return m_ptr != other.m_ptr; }
241 bool operator< (
const pointer_based_stl_iterator& other)
const {
return m_ptr < other.m_ptr; }
242 bool operator<=(
const pointer_based_stl_iterator& other)
const {
return m_ptr <= other.m_ptr; }
243 bool operator> (
const pointer_based_stl_iterator& other)
const {
return m_ptr > other.m_ptr; }
244 bool operator>=(
const pointer_based_stl_iterator& other)
const {
return m_ptr >= other.m_ptr; }
246 bool operator==(
const other_iterator& other)
const {
return m_ptr == other.m_ptr; }
247 bool operator!=(
const other_iterator& other)
const {
return m_ptr != other.m_ptr; }
248 bool operator< (
const other_iterator& other)
const {
return m_ptr < other.m_ptr; }
249 bool operator<=(
const other_iterator& other)
const {
return m_ptr <= other.m_ptr; }
250 bool operator> (
const other_iterator& other)
const {
return m_ptr > other.m_ptr; }
251 bool operator>=(
const other_iterator& other)
const {
return m_ptr >= other.m_ptr; }
256 internal::variable_if_dynamic<Index, XprType::InnerStrideAtCompileTime> m_incr;
259template<
typename _XprType>
260struct indexed_based_stl_iterator_traits<generic_randaccess_stl_iterator<_XprType> >
262 typedef _XprType XprType;
263 typedef generic_randaccess_stl_iterator<typename internal::remove_const<XprType>::type> non_const_iterator;
264 typedef generic_randaccess_stl_iterator<typename internal::add_const<XprType>::type> const_iterator;
267template<
typename XprType>
268class generic_randaccess_stl_iterator :
public indexed_based_stl_iterator_base<generic_randaccess_stl_iterator<XprType> >
271 typedef typename XprType::Scalar value_type;
276 has_direct_access = (internal::traits<XprType>::Flags &
DirectAccessBit) ? 1 : 0,
277 is_lvalue = internal::is_lvalue<XprType>::value
280 typedef indexed_based_stl_iterator_base<generic_randaccess_stl_iterator> Base;
287 typedef const value_type read_only_ref_t;
291 typedef typename internal::conditional<bool(is_lvalue), value_type *,
const value_type *>::type pointer;
292 typedef typename internal::conditional<bool(is_lvalue), value_type&, read_only_ref_t>::type reference;
294 generic_randaccess_stl_iterator() : Base() {}
295 generic_randaccess_stl_iterator(XprType& xpr,
Index index) : Base(xpr,index) {}
296 generic_randaccess_stl_iterator(
const typename Base::non_const_iterator& other) : Base(other) {}
297 using Base::operator=;
299 reference operator*()
const {
return (*mp_xpr)(m_index); }
300 reference operator[](
Index i)
const {
return (*mp_xpr)(m_index+i); }
301 pointer operator->()
const {
return &((*mp_xpr)(m_index)); }
304template<
typename _XprType, DirectionType Direction>
305struct indexed_based_stl_iterator_traits<subvector_stl_iterator<_XprType,Direction> >
307 typedef _XprType XprType;
308 typedef subvector_stl_iterator<typename internal::remove_const<XprType>::type, Direction> non_const_iterator;
309 typedef subvector_stl_iterator<typename internal::add_const<XprType>::type, Direction> const_iterator;
312template<
typename XprType, DirectionType Direction>
313class subvector_stl_iterator :
public indexed_based_stl_iterator_base<subvector_stl_iterator<XprType,Direction> >
317 enum { is_lvalue = internal::is_lvalue<XprType>::value };
319 typedef indexed_based_stl_iterator_base<subvector_stl_iterator> Base;
323 typedef typename internal::conditional<Direction==Vertical,typename XprType::ColXpr,typename XprType::RowXpr>::type SubVectorType;
324 typedef typename internal::conditional<Direction==Vertical,typename XprType::ConstColXpr,typename XprType::ConstRowXpr>::type ConstSubVectorType;
328 typedef typename internal::conditional<bool(is_lvalue), SubVectorType, ConstSubVectorType>::type reference;
329 typedef typename reference::PlainObject value_type;
332 class subvector_stl_iterator_ptr
335 subvector_stl_iterator_ptr(
const reference &subvector) : m_subvector(subvector) {}
336 reference* operator->() {
return &m_subvector; }
338 reference m_subvector;
342 typedef subvector_stl_iterator_ptr pointer;
344 subvector_stl_iterator() : Base() {}
345 subvector_stl_iterator(XprType& xpr,
Index index) : Base(xpr,index) {}
347 reference operator*()
const {
return (*mp_xpr).template subVector<Direction>(m_index); }
348 reference operator[](
Index i)
const {
return (*mp_xpr).template subVector<Direction>(m_index+i); }
349 pointer operator->()
const {
return (*mp_xpr).template subVector<Direction>(m_index); }
352template<
typename _XprType, DirectionType Direction>
353struct indexed_based_stl_iterator_traits<subvector_stl_reverse_iterator<_XprType,Direction> >
355 typedef _XprType XprType;
356 typedef subvector_stl_reverse_iterator<typename internal::remove_const<XprType>::type, Direction> non_const_iterator;
357 typedef subvector_stl_reverse_iterator<typename internal::add_const<XprType>::type, Direction> const_iterator;
360template<
typename XprType, DirectionType Direction>
361class subvector_stl_reverse_iterator :
public indexed_based_stl_reverse_iterator_base<subvector_stl_reverse_iterator<XprType,Direction> >
365 enum { is_lvalue = internal::is_lvalue<XprType>::value };
367 typedef indexed_based_stl_reverse_iterator_base<subvector_stl_reverse_iterator> Base;
371 typedef typename internal::conditional<Direction==Vertical,typename XprType::ColXpr,typename XprType::RowXpr>::type SubVectorType;
372 typedef typename internal::conditional<Direction==Vertical,typename XprType::ConstColXpr,typename XprType::ConstRowXpr>::type ConstSubVectorType;
376 typedef typename internal::conditional<bool(is_lvalue), SubVectorType, ConstSubVectorType>::type reference;
377 typedef typename reference::PlainObject value_type;
380 class subvector_stl_reverse_iterator_ptr
383 subvector_stl_reverse_iterator_ptr(
const reference &subvector) : m_subvector(subvector) {}
384 reference* operator->() {
return &m_subvector; }
386 reference m_subvector;
390 typedef subvector_stl_reverse_iterator_ptr pointer;
392 subvector_stl_reverse_iterator() : Base() {}
393 subvector_stl_reverse_iterator(XprType& xpr,
Index index) : Base(xpr,index) {}
395 reference operator*()
const {
return (*mp_xpr).template subVector<Direction>(m_index); }
396 reference operator[](
Index i)
const {
return (*mp_xpr).template subVector<Direction>(m_index+i); }
397 pointer operator->()
const {
return (*mp_xpr).template subVector<Direction>(m_index); }
407template<
typename Derived>
410 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
415template<
typename Derived>
425template<
typename Derived>
428 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
436template<
typename Derived>
439 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
444template<
typename Derived>
454template<
typename Derived>
457 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:47
random_access_iterator_type const_iterator
Definition: DenseBase.h:622
random_access_iterator_type iterator
Definition: DenseBase.h:620
const unsigned int DirectAccessBit
Definition: Constants.h:155
Namespace containing all symbols from the Eigen library.
Definition: Core:141
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74