14 template<
typename IteratorType>
17 template<
typename Derived>
22 typedef typename traits::XprType XprType;
30 typedef
Index difference_type;
31 typedef std::random_access_iterator_tag iterator_category;
37 : mp_xpr(other.mp_xpr), m_index(other.m_index)
42 mp_xpr = other.mp_xpr;
43 m_index = other.m_index;
47 Derived& operator++() { ++m_index;
return derived(); }
48 Derived& operator--() { --m_index;
return derived(); }
50 Derived operator++(
int) { Derived prev(derived()); operator++();
return prev;}
51 Derived operator--(
int) { Derived prev(derived()); operator--();
return prev;}
58 Derived& operator+=(
Index b) { m_index += b;
return derived(); }
59 Derived& operator-=(
Index b) { m_index -= b;
return derived(); }
63 eigen_assert(mp_xpr == other.mp_xpr);
64 return m_index - other.m_index;
69 eigen_assert(mp_xpr == other.mp_xpr);
70 return m_index - other.m_index;
80 bool operator==(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index == other.m_index; }
81 bool operator!=(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index != other.m_index; }
82 bool operator< (
const other_iterator& 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; }
89 Derived& derived() {
return static_cast<Derived&
>(*this); }
90 const Derived& derived()
const {
return static_cast<const Derived&
>(*this); }
96 template<
typename Derived>
101 typedef typename traits::XprType XprType;
109 typedef
Index difference_type;
110 typedef std::random_access_iterator_tag iterator_category;
116 : mp_xpr(other.mp_xpr), m_index(other.m_index)
121 mp_xpr = other.mp_xpr;
122 m_index = other.m_index;
126 Derived& operator++() { --m_index;
return derived(); }
127 Derived& operator--() { ++m_index;
return derived(); }
129 Derived operator++(
int) { Derived prev(derived()); operator++();
return prev;}
130 Derived operator--(
int) { Derived prev(derived()); operator--();
return prev;}
137 Derived& operator+=(
Index b) { m_index -= b;
return derived(); }
138 Derived& operator-=(
Index b) { m_index += b;
return derived(); }
142 eigen_assert(mp_xpr == other.mp_xpr);
143 return other.m_index - m_index;
148 eigen_assert(mp_xpr == other.mp_xpr);
149 return other.m_index - m_index;
159 bool operator==(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index == other.m_index; }
160 bool operator!=(
const other_iterator& other)
const { eigen_assert(mp_xpr == other.mp_xpr);
return m_index != other.m_index; }
161 bool operator< (
const other_iterator& 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; }
168 Derived& derived() {
return static_cast<Derived&
>(*this); }
169 const Derived& derived()
const {
return static_cast<const Derived&
>(*this); }
175 template<
typename XprType>
186 typedef
Index difference_type;
187 typedef typename XprType::Scalar value_type;
188 typedef std::random_access_iterator_tag iterator_category;
196 m_ptr = xpr.data() + index * m_incr.value();
200 : m_ptr(other.m_ptr), m_incr(other.m_incr)
206 m_incr.setValue(other.m_incr);
210 reference operator*()
const {
return *m_ptr; }
211 reference operator[](
Index i)
const {
return *(m_ptr+i*m_incr.value()); }
212 pointer operator->()
const {
return m_ptr; }
229 return (m_ptr - other.m_ptr)/m_incr.value();
233 return (m_ptr - other.m_ptr)/m_incr.value();
243 bool operator==(
const other_iterator& other)
const {
return m_ptr == other.m_ptr; }
244 bool operator!=(
const other_iterator& other)
const {
return m_ptr != other.m_ptr; }
245 bool operator< (
const other_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; }
256 template<
typename _XprType>
259 typedef _XprType XprType;
264 template<
typename XprType>
268 typedef typename XprType::Scalar value_type;
284 typedef const value_type read_only_ref_t;
294 using Base::operator=;
296 reference operator*()
const {
return (*mp_xpr)(m_index); }
297 reference operator[](
Index i)
const {
return (*mp_xpr)(m_index+i); }
298 pointer operator->()
const {
return &((*mp_xpr)(m_index)); }
301 template<
typename _XprType, DirectionType Direction>
304 typedef _XprType XprType;
309 template<
typename XprType, DirectionType Direction>
326 typedef typename reference::PlainObject value_type;
329 class subvector_stl_iterator_ptr
332 subvector_stl_iterator_ptr(
const reference &subvector) : m_subvector(subvector) {}
333 reference* operator->() {
return &m_subvector; }
339 typedef subvector_stl_iterator_ptr pointer;
344 reference operator*()
const {
return (*mp_xpr).template subVector<Direction>(m_index); }
345 reference operator[](
Index i)
const {
return (*mp_xpr).template subVector<Direction>(m_index+i); }
346 pointer operator->()
const {
return (*mp_xpr).template subVector<Direction>(m_index); }
349 template<
typename _XprType, DirectionType Direction>
352 typedef _XprType XprType;
357 template<
typename XprType, DirectionType Direction>
374 typedef typename reference::PlainObject value_type;
377 class subvector_stl_reverse_iterator_ptr
380 subvector_stl_reverse_iterator_ptr(
const reference &subvector) : m_subvector(subvector) {}
381 reference* operator->() {
return &m_subvector; }
387 typedef subvector_stl_reverse_iterator_ptr pointer;
392 reference operator*()
const {
return (*mp_xpr).template subVector<Direction>(m_index); }
393 reference operator[](
Index i)
const {
return (*mp_xpr).template subVector<Direction>(m_index+i); }
394 pointer operator->()
const {
return (*mp_xpr).template subVector<Direction>(m_index); }
404 template<
typename Derived>
407 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
412 template<
typename Derived>
422 template<
typename Derived>
425 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
433 template<
typename Derived>
436 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
441 template<
typename Derived>
451 template<
typename Derived>
454 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);