$darkmode
Eigen  5.0.1-dev
StlIterators.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2018 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_STLITERATORS_H
11 #define EIGEN_STLITERATORS_H
12 
13 // IWYU pragma: private
14 #include "./InternalHeaderCheck.h"
15 
16 namespace Eigen {
17 
18 namespace internal {
19 
20 template <typename IteratorType>
21 struct indexed_based_stl_iterator_traits;
22 
23 template <typename Derived>
24 class indexed_based_stl_iterator_base {
25  protected:
26  typedef indexed_based_stl_iterator_traits<Derived> traits;
27  typedef typename traits::XprType XprType;
28  typedef indexed_based_stl_iterator_base<typename traits::non_const_iterator> non_const_iterator;
29  typedef indexed_based_stl_iterator_base<typename traits::const_iterator> const_iterator;
30  typedef std::conditional_t<internal::is_const<XprType>::value, non_const_iterator, const_iterator> other_iterator;
31  // NOTE: in C++03 we cannot declare friend classes through typedefs because we need to write friend class:
32  friend class indexed_based_stl_iterator_base<typename traits::const_iterator>;
33  friend class indexed_based_stl_iterator_base<typename traits::non_const_iterator>;
34 
35  public:
36  typedef Index difference_type;
37  typedef std::random_access_iterator_tag iterator_category;
38 
39  indexed_based_stl_iterator_base() noexcept : mp_xpr(0), m_index(0) {}
40  indexed_based_stl_iterator_base(XprType& xpr, Index index) noexcept : mp_xpr(&xpr), m_index(index) {}
41 
42  indexed_based_stl_iterator_base(const non_const_iterator& other) noexcept
43  : mp_xpr(other.mp_xpr), m_index(other.m_index) {}
44 
45  indexed_based_stl_iterator_base& operator=(const non_const_iterator& other) {
46  mp_xpr = other.mp_xpr;
47  m_index = other.m_index;
48  return *this;
49  }
50 
51  Derived& operator++() {
52  ++m_index;
53  return derived();
54  }
55  Derived& operator--() {
56  --m_index;
57  return derived();
58  }
59 
60  Derived operator++(int) {
61  Derived prev(derived());
62  operator++();
63  return prev;
64  }
65  Derived operator--(int) {
66  Derived prev(derived());
67  operator--();
68  return prev;
69  }
70 
71  friend Derived operator+(const indexed_based_stl_iterator_base& a, Index b) {
72  Derived ret(a.derived());
73  ret += b;
74  return ret;
75  }
76  friend Derived operator-(const indexed_based_stl_iterator_base& a, Index b) {
77  Derived ret(a.derived());
78  ret -= b;
79  return ret;
80  }
81  friend Derived operator+(Index a, const indexed_based_stl_iterator_base& b) {
82  Derived ret(b.derived());
83  ret += a;
84  return ret;
85  }
86  friend Derived operator-(Index a, const indexed_based_stl_iterator_base& b) {
87  Derived ret(b.derived());
88  ret -= a;
89  return ret;
90  }
91 
92  Derived& operator+=(Index b) {
93  m_index += b;
94  return derived();
95  }
96  Derived& operator-=(Index b) {
97  m_index -= b;
98  return derived();
99  }
100 
101  difference_type operator-(const indexed_based_stl_iterator_base& other) const {
102  eigen_assert(mp_xpr == other.mp_xpr);
103  return m_index - other.m_index;
104  }
105 
106  difference_type operator-(const other_iterator& other) const {
107  eigen_assert(mp_xpr == other.mp_xpr);
108  return m_index - other.m_index;
109  }
110 
111  bool operator==(const indexed_based_stl_iterator_base& other) const {
112  eigen_assert(mp_xpr == other.mp_xpr);
113  return m_index == other.m_index;
114  }
115  bool operator!=(const indexed_based_stl_iterator_base& other) const {
116  eigen_assert(mp_xpr == other.mp_xpr);
117  return m_index != other.m_index;
118  }
119  bool operator<(const indexed_based_stl_iterator_base& other) const {
120  eigen_assert(mp_xpr == other.mp_xpr);
121  return m_index < other.m_index;
122  }
123  bool operator<=(const indexed_based_stl_iterator_base& other) const {
124  eigen_assert(mp_xpr == other.mp_xpr);
125  return m_index <= other.m_index;
126  }
127  bool operator>(const indexed_based_stl_iterator_base& other) const {
128  eigen_assert(mp_xpr == other.mp_xpr);
129  return m_index > other.m_index;
130  }
131  bool operator>=(const indexed_based_stl_iterator_base& other) const {
132  eigen_assert(mp_xpr == other.mp_xpr);
133  return m_index >= other.m_index;
134  }
135 
136  bool operator==(const other_iterator& other) const {
137  eigen_assert(mp_xpr == other.mp_xpr);
138  return m_index == other.m_index;
139  }
140  bool operator!=(const other_iterator& other) const {
141  eigen_assert(mp_xpr == other.mp_xpr);
142  return m_index != other.m_index;
143  }
144  bool operator<(const other_iterator& other) const {
145  eigen_assert(mp_xpr == other.mp_xpr);
146  return m_index < other.m_index;
147  }
148  bool operator<=(const other_iterator& other) const {
149  eigen_assert(mp_xpr == other.mp_xpr);
150  return m_index <= other.m_index;
151  }
152  bool operator>(const other_iterator& other) const {
153  eigen_assert(mp_xpr == other.mp_xpr);
154  return m_index > other.m_index;
155  }
156  bool operator>=(const other_iterator& other) const {
157  eigen_assert(mp_xpr == other.mp_xpr);
158  return m_index >= other.m_index;
159  }
160 
161  protected:
162  Derived& derived() { return static_cast<Derived&>(*this); }
163  const Derived& derived() const { return static_cast<const Derived&>(*this); }
164 
165  XprType* mp_xpr;
166  Index m_index;
167 };
168 
169 template <typename Derived>
170 class indexed_based_stl_reverse_iterator_base {
171  protected:
172  typedef indexed_based_stl_iterator_traits<Derived> traits;
173  typedef typename traits::XprType XprType;
174  typedef indexed_based_stl_reverse_iterator_base<typename traits::non_const_iterator> non_const_iterator;
175  typedef indexed_based_stl_reverse_iterator_base<typename traits::const_iterator> const_iterator;
176  typedef std::conditional_t<internal::is_const<XprType>::value, non_const_iterator, const_iterator> other_iterator;
177  // NOTE: in C++03 we cannot declare friend classes through typedefs because we need to write friend class:
178  friend class indexed_based_stl_reverse_iterator_base<typename traits::const_iterator>;
179  friend class indexed_based_stl_reverse_iterator_base<typename traits::non_const_iterator>;
180 
181  public:
182  typedef Index difference_type;
183  typedef std::random_access_iterator_tag iterator_category;
184 
185  indexed_based_stl_reverse_iterator_base() : mp_xpr(0), m_index(0) {}
186  indexed_based_stl_reverse_iterator_base(XprType& xpr, Index index) : mp_xpr(&xpr), m_index(index) {}
187 
188  indexed_based_stl_reverse_iterator_base(const non_const_iterator& other)
189  : mp_xpr(other.mp_xpr), m_index(other.m_index) {}
190 
191  indexed_based_stl_reverse_iterator_base& operator=(const non_const_iterator& other) {
192  mp_xpr = other.mp_xpr;
193  m_index = other.m_index;
194  return *this;
195  }
196 
197  Derived& operator++() {
198  --m_index;
199  return derived();
200  }
201  Derived& operator--() {
202  ++m_index;
203  return derived();
204  }
205 
206  Derived operator++(int) {
207  Derived prev(derived());
208  operator++();
209  return prev;
210  }
211  Derived operator--(int) {
212  Derived prev(derived());
213  operator--();
214  return prev;
215  }
216 
217  friend Derived operator+(const indexed_based_stl_reverse_iterator_base& a, Index b) {
218  Derived ret(a.derived());
219  ret += b;
220  return ret;
221  }
222  friend Derived operator-(const indexed_based_stl_reverse_iterator_base& a, Index b) {
223  Derived ret(a.derived());
224  ret -= b;
225  return ret;
226  }
227  friend Derived operator+(Index a, const indexed_based_stl_reverse_iterator_base& b) {
228  Derived ret(b.derived());
229  ret += a;
230  return ret;
231  }
232  friend Derived operator-(Index a, const indexed_based_stl_reverse_iterator_base& b) {
233  Derived ret(b.derived());
234  ret -= a;
235  return ret;
236  }
237 
238  Derived& operator+=(Index b) {
239  m_index -= b;
240  return derived();
241  }
242  Derived& operator-=(Index b) {
243  m_index += b;
244  return derived();
245  }
246 
247  difference_type operator-(const indexed_based_stl_reverse_iterator_base& other) const {
248  eigen_assert(mp_xpr == other.mp_xpr);
249  return other.m_index - m_index;
250  }
251 
252  difference_type operator-(const other_iterator& other) const {
253  eigen_assert(mp_xpr == other.mp_xpr);
254  return other.m_index - m_index;
255  }
256 
257  bool operator==(const indexed_based_stl_reverse_iterator_base& other) const {
258  eigen_assert(mp_xpr == other.mp_xpr);
259  return m_index == other.m_index;
260  }
261  bool operator!=(const indexed_based_stl_reverse_iterator_base& other) const {
262  eigen_assert(mp_xpr == other.mp_xpr);
263  return m_index != other.m_index;
264  }
265  bool operator<(const indexed_based_stl_reverse_iterator_base& other) const {
266  eigen_assert(mp_xpr == other.mp_xpr);
267  return m_index > other.m_index;
268  }
269  bool operator<=(const indexed_based_stl_reverse_iterator_base& other) const {
270  eigen_assert(mp_xpr == other.mp_xpr);
271  return m_index >= other.m_index;
272  }
273  bool operator>(const indexed_based_stl_reverse_iterator_base& other) const {
274  eigen_assert(mp_xpr == other.mp_xpr);
275  return m_index < other.m_index;
276  }
277  bool operator>=(const indexed_based_stl_reverse_iterator_base& other) const {
278  eigen_assert(mp_xpr == other.mp_xpr);
279  return m_index <= other.m_index;
280  }
281 
282  bool operator==(const other_iterator& other) const {
283  eigen_assert(mp_xpr == other.mp_xpr);
284  return m_index == other.m_index;
285  }
286  bool operator!=(const other_iterator& other) const {
287  eigen_assert(mp_xpr == other.mp_xpr);
288  return m_index != other.m_index;
289  }
290  bool operator<(const other_iterator& other) const {
291  eigen_assert(mp_xpr == other.mp_xpr);
292  return m_index > other.m_index;
293  }
294  bool operator<=(const other_iterator& other) const {
295  eigen_assert(mp_xpr == other.mp_xpr);
296  return m_index >= other.m_index;
297  }
298  bool operator>(const other_iterator& other) const {
299  eigen_assert(mp_xpr == other.mp_xpr);
300  return m_index < other.m_index;
301  }
302  bool operator>=(const other_iterator& other) const {
303  eigen_assert(mp_xpr == other.mp_xpr);
304  return m_index <= other.m_index;
305  }
306 
307  protected:
308  Derived& derived() { return static_cast<Derived&>(*this); }
309  const Derived& derived() const { return static_cast<const Derived&>(*this); }
310 
311  XprType* mp_xpr;
312  Index m_index;
313 };
314 
315 template <typename XprType>
316 class pointer_based_stl_iterator {
317  enum { is_lvalue = internal::is_lvalue<XprType>::value };
318  typedef pointer_based_stl_iterator<std::remove_const_t<XprType>> non_const_iterator;
319  typedef pointer_based_stl_iterator<std::add_const_t<XprType>> const_iterator;
320  typedef std::conditional_t<internal::is_const<XprType>::value, non_const_iterator, const_iterator> other_iterator;
321  // NOTE: in C++03 we cannot declare friend classes through typedefs because we need to write friend class:
322  friend class pointer_based_stl_iterator<std::add_const_t<XprType>>;
323  friend class pointer_based_stl_iterator<std::remove_const_t<XprType>>;
324 
325  public:
326  typedef Index difference_type;
327  typedef typename XprType::Scalar value_type;
328 #if EIGEN_COMP_CXXVER >= 20 && defined(__cpp_lib_concepts) && __cpp_lib_concepts >= 202002L
329  typedef std::conditional_t<XprType::InnerStrideAtCompileTime == 1, std::contiguous_iterator_tag,
330  std::random_access_iterator_tag>
331  iterator_category;
332 #else
333  typedef std::random_access_iterator_tag iterator_category;
334 #endif
335  typedef std::conditional_t<bool(is_lvalue), value_type*, const value_type*> pointer;
336  typedef std::conditional_t<bool(is_lvalue), value_type&, const value_type&> reference;
337 
338  pointer_based_stl_iterator() noexcept : m_ptr(0) {}
339  pointer_based_stl_iterator(XprType& xpr, Index index) noexcept : m_incr(xpr.innerStride()) {
340  m_ptr = xpr.data() + index * m_incr.value();
341  }
342 
343  pointer_based_stl_iterator(const non_const_iterator& other) noexcept : m_ptr(other.m_ptr), m_incr(other.m_incr) {}
344 
345  pointer_based_stl_iterator& operator=(const non_const_iterator& other) noexcept {
346  m_ptr = other.m_ptr;
347  m_incr.setValue(other.m_incr);
348  return *this;
349  }
350 
351  reference operator*() const { return *m_ptr; }
352  reference operator[](Index i) const { return *(m_ptr + i * m_incr.value()); }
353  pointer operator->() const { return m_ptr; }
354 
355  pointer_based_stl_iterator& operator++() {
356  m_ptr += m_incr.value();
357  return *this;
358  }
359  pointer_based_stl_iterator& operator--() {
360  m_ptr -= m_incr.value();
361  return *this;
362  }
363 
364  pointer_based_stl_iterator operator++(int) {
365  pointer_based_stl_iterator prev(*this);
366  operator++();
367  return prev;
368  }
369  pointer_based_stl_iterator operator--(int) {
370  pointer_based_stl_iterator prev(*this);
371  operator--();
372  return prev;
373  }
374 
375  friend pointer_based_stl_iterator operator+(const pointer_based_stl_iterator& a, Index b) {
376  pointer_based_stl_iterator ret(a);
377  ret += b;
378  return ret;
379  }
380  friend pointer_based_stl_iterator operator-(const pointer_based_stl_iterator& a, Index b) {
381  pointer_based_stl_iterator ret(a);
382  ret -= b;
383  return ret;
384  }
385  friend pointer_based_stl_iterator operator+(Index a, const pointer_based_stl_iterator& b) {
386  pointer_based_stl_iterator ret(b);
387  ret += a;
388  return ret;
389  }
390  friend pointer_based_stl_iterator operator-(Index a, const pointer_based_stl_iterator& b) {
391  pointer_based_stl_iterator ret(b);
392  ret -= a;
393  return ret;
394  }
395 
396  pointer_based_stl_iterator& operator+=(Index b) {
397  m_ptr += b * m_incr.value();
398  return *this;
399  }
400  pointer_based_stl_iterator& operator-=(Index b) {
401  m_ptr -= b * m_incr.value();
402  return *this;
403  }
404 
405  difference_type operator-(const pointer_based_stl_iterator& other) const {
406  return (m_ptr - other.m_ptr) / m_incr.value();
407  }
408 
409  difference_type operator-(const other_iterator& other) const { return (m_ptr - other.m_ptr) / m_incr.value(); }
410 
411  bool operator==(const pointer_based_stl_iterator& other) const { return m_ptr == other.m_ptr; }
412  bool operator!=(const pointer_based_stl_iterator& other) const { return m_ptr != other.m_ptr; }
413  bool operator<(const pointer_based_stl_iterator& other) const { return m_ptr < other.m_ptr; }
414  bool operator<=(const pointer_based_stl_iterator& other) const { return m_ptr <= other.m_ptr; }
415  bool operator>(const pointer_based_stl_iterator& other) const { return m_ptr > other.m_ptr; }
416  bool operator>=(const pointer_based_stl_iterator& other) const { return m_ptr >= other.m_ptr; }
417 
418  bool operator==(const other_iterator& other) const { return m_ptr == other.m_ptr; }
419  bool operator!=(const other_iterator& other) const { return m_ptr != other.m_ptr; }
420  bool operator<(const other_iterator& other) const { return m_ptr < other.m_ptr; }
421  bool operator<=(const other_iterator& other) const { return m_ptr <= other.m_ptr; }
422  bool operator>(const other_iterator& other) const { return m_ptr > other.m_ptr; }
423  bool operator>=(const other_iterator& other) const { return m_ptr >= other.m_ptr; }
424 
425  protected:
426  pointer m_ptr;
427  internal::variable_if_dynamic<Index, XprType::InnerStrideAtCompileTime> m_incr;
428 };
429 
430 template <typename XprType_>
431 struct indexed_based_stl_iterator_traits<generic_randaccess_stl_iterator<XprType_>> {
432  typedef XprType_ XprType;
433  typedef generic_randaccess_stl_iterator<std::remove_const_t<XprType>> non_const_iterator;
434  typedef generic_randaccess_stl_iterator<std::add_const_t<XprType>> const_iterator;
435 };
436 
437 template <typename XprType>
438 class generic_randaccess_stl_iterator
439  : public indexed_based_stl_iterator_base<generic_randaccess_stl_iterator<XprType>> {
440  public:
441  typedef typename XprType::Scalar value_type;
442 
443  protected:
444  enum {
445  has_direct_access = (internal::traits<XprType>::Flags & DirectAccessBit) ? 1 : 0,
446  is_lvalue = internal::is_lvalue<XprType>::value
447  };
448 
449  typedef indexed_based_stl_iterator_base<generic_randaccess_stl_iterator> Base;
450  using Base::m_index;
451  using Base::mp_xpr;
452 
453  // TODO currently const Transpose/Reshape expressions never returns const references,
454  // so lets return by value too.
455  // typedef std::conditional_t<bool(has_direct_access), const value_type&, const value_type> read_only_ref_t;
456  typedef const value_type read_only_ref_t;
457 
458  public:
459  typedef std::conditional_t<bool(is_lvalue), value_type*, const value_type*> pointer;
460  typedef std::conditional_t<bool(is_lvalue), value_type&, read_only_ref_t> reference;
461 
462  generic_randaccess_stl_iterator() : Base() {}
463  generic_randaccess_stl_iterator(XprType& xpr, Index index) : Base(xpr, index) {}
464  generic_randaccess_stl_iterator(const typename Base::non_const_iterator& other) : Base(other) {}
465  using Base::operator=;
466 
467  reference operator*() const { return (*mp_xpr)(m_index); }
468  reference operator[](Index i) const { return (*mp_xpr)(m_index + i); }
469  pointer operator->() const { return &((*mp_xpr)(m_index)); }
470 };
471 
472 template <typename XprType_, DirectionType Direction>
473 struct indexed_based_stl_iterator_traits<subvector_stl_iterator<XprType_, Direction>> {
474  typedef XprType_ XprType;
475  typedef subvector_stl_iterator<std::remove_const_t<XprType>, Direction> non_const_iterator;
476  typedef subvector_stl_iterator<std::add_const_t<XprType>, Direction> const_iterator;
477 };
478 
479 template <typename XprType, DirectionType Direction>
480 class subvector_stl_iterator : public indexed_based_stl_iterator_base<subvector_stl_iterator<XprType, Direction>> {
481  protected:
482  enum { is_lvalue = internal::is_lvalue<XprType>::value };
483 
484  typedef indexed_based_stl_iterator_base<subvector_stl_iterator> Base;
485  using Base::m_index;
486  using Base::mp_xpr;
487 
488  typedef std::conditional_t<Direction == Vertical, typename XprType::ColXpr, typename XprType::RowXpr> SubVectorType;
489  typedef std::conditional_t<Direction == Vertical, typename XprType::ConstColXpr, typename XprType::ConstRowXpr>
490  ConstSubVectorType;
491 
492  public:
493  typedef std::conditional_t<bool(is_lvalue), SubVectorType, ConstSubVectorType> reference;
494  typedef typename reference::PlainObject value_type;
495 
496  private:
497  class subvector_stl_iterator_ptr {
498  public:
499  subvector_stl_iterator_ptr(const reference& subvector) : m_subvector(subvector) {}
500  reference* operator->() { return &m_subvector; }
501 
502  private:
503  reference m_subvector;
504  };
505 
506  public:
507  typedef subvector_stl_iterator_ptr pointer;
508 
509  subvector_stl_iterator() : Base() {}
510  subvector_stl_iterator(XprType& xpr, Index index) : Base(xpr, index) {}
511 
512  reference operator*() const { return (*mp_xpr).template subVector<Direction>(m_index); }
513  reference operator[](Index i) const { return (*mp_xpr).template subVector<Direction>(m_index + i); }
514  pointer operator->() const { return (*mp_xpr).template subVector<Direction>(m_index); }
515 };
516 
517 template <typename XprType_, DirectionType Direction>
518 struct indexed_based_stl_iterator_traits<subvector_stl_reverse_iterator<XprType_, Direction>> {
519  typedef XprType_ XprType;
520  typedef subvector_stl_reverse_iterator<std::remove_const_t<XprType>, Direction> non_const_iterator;
521  typedef subvector_stl_reverse_iterator<std::add_const_t<XprType>, Direction> const_iterator;
522 };
523 
524 template <typename XprType, DirectionType Direction>
525 class subvector_stl_reverse_iterator
526  : public indexed_based_stl_reverse_iterator_base<subvector_stl_reverse_iterator<XprType, Direction>> {
527  protected:
528  enum { is_lvalue = internal::is_lvalue<XprType>::value };
529 
530  typedef indexed_based_stl_reverse_iterator_base<subvector_stl_reverse_iterator> Base;
531  using Base::m_index;
532  using Base::mp_xpr;
533 
534  typedef std::conditional_t<Direction == Vertical, typename XprType::ColXpr, typename XprType::RowXpr> SubVectorType;
535  typedef std::conditional_t<Direction == Vertical, typename XprType::ConstColXpr, typename XprType::ConstRowXpr>
536  ConstSubVectorType;
537 
538  public:
539  typedef std::conditional_t<bool(is_lvalue), SubVectorType, ConstSubVectorType> reference;
540  typedef typename reference::PlainObject value_type;
541 
542  private:
543  class subvector_stl_reverse_iterator_ptr {
544  public:
545  subvector_stl_reverse_iterator_ptr(const reference& subvector) : m_subvector(subvector) {}
546  reference* operator->() { return &m_subvector; }
547 
548  private:
549  reference m_subvector;
550  };
551 
552  public:
553  typedef subvector_stl_reverse_iterator_ptr pointer;
554 
555  subvector_stl_reverse_iterator() : Base() {}
556  subvector_stl_reverse_iterator(XprType& xpr, Index index) : Base(xpr, index) {}
557 
558  reference operator*() const { return (*mp_xpr).template subVector<Direction>(m_index); }
559  reference operator[](Index i) const { return (*mp_xpr).template subVector<Direction>(m_index + i); }
560  pointer operator->() const { return (*mp_xpr).template subVector<Direction>(m_index); }
561 };
562 
563 } // namespace internal
564 
569 template <typename Derived>
571  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
572  return iterator(derived(), 0);
573 }
574 
576 template <typename Derived>
578  return cbegin();
579 }
580 
585 template <typename Derived>
587  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
588  return const_iterator(derived(), 0);
589 }
590 
595 template <typename Derived>
597  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
598  return iterator(derived(), size());
599 }
600 
602 template <typename Derived>
604  return cend();
605 }
606 
611 template <typename Derived>
613  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
614  return const_iterator(derived(), size());
615 }
616 
617 } // namespace Eigen
618 
619 #endif // EIGEN_STLITERATORS_H
const Product< MatrixDerived, PermutationDerived, DefaultProduct > operator*(const MatrixBase< MatrixDerived > &matrix, const PermutationBase< PermutationDerived > &permutation)
Definition: PermutationMatrix.h:474
const unsigned int DirectAccessBit
Definition: Constants.h:159
Namespace containing all symbols from the Eigen library.
Definition: B01_Experimental.dox:1
random_access_iterator_type const_iterator
Definition: DenseBase.h:579
Definition: BFloat16.h:231
iterator begin()
Definition: StlIterators.h:570
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:82
iterator end()
Definition: StlIterators.h:596
random_access_iterator_type iterator
Definition: DenseBase.h:577
const_iterator cbegin() const
Definition: StlIterators.h:586
const_iterator cend() const
Definition: StlIterators.h:612