Eigen  3.4.90 (git rev 9589cc4e7fd8e4538bedef80dd36c7738977a8be)
 
Loading...
Searching...
No Matches
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
16namespace Eigen {
17
18namespace internal {
19
20template <typename IteratorType>
21struct indexed_based_stl_iterator_traits;
22
23template <typename Derived>
24class 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() EIGEN_NO_THROW : mp_xpr(0), m_index(0) {}
40 indexed_based_stl_iterator_base(XprType& xpr, Index index) EIGEN_NO_THROW : mp_xpr(&xpr), m_index(index) {}
41
42 indexed_based_stl_iterator_base(const non_const_iterator& other) EIGEN_NO_THROW : mp_xpr(other.mp_xpr),
43 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
169template <typename Derived>
170class 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
315template <typename XprType>
316class 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_CPLUSPLUS >= 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() EIGEN_NO_THROW : m_ptr(0) {}
339 pointer_based_stl_iterator(XprType& xpr, Index index) EIGEN_NO_THROW : 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) EIGEN_NO_THROW : m_ptr(other.m_ptr),
344 m_incr(other.m_incr) {}
345
346 pointer_based_stl_iterator& operator=(const non_const_iterator& other) EIGEN_NO_THROW {
347 m_ptr = other.m_ptr;
348 m_incr.setValue(other.m_incr);
349 return *this;
350 }
351
352 reference operator*() const { return *m_ptr; }
353 reference operator[](Index i) const { return *(m_ptr + i * m_incr.value()); }
354 pointer operator->() const { return m_ptr; }
355
356 pointer_based_stl_iterator& operator++() {
357 m_ptr += m_incr.value();
358 return *this;
359 }
360 pointer_based_stl_iterator& operator--() {
361 m_ptr -= m_incr.value();
362 return *this;
363 }
364
365 pointer_based_stl_iterator operator++(int) {
366 pointer_based_stl_iterator prev(*this);
367 operator++();
368 return prev;
369 }
370 pointer_based_stl_iterator operator--(int) {
371 pointer_based_stl_iterator prev(*this);
372 operator--();
373 return prev;
374 }
375
376 friend pointer_based_stl_iterator operator+(const pointer_based_stl_iterator& a, Index b) {
377 pointer_based_stl_iterator ret(a);
378 ret += b;
379 return ret;
380 }
381 friend pointer_based_stl_iterator operator-(const pointer_based_stl_iterator& a, Index b) {
382 pointer_based_stl_iterator ret(a);
383 ret -= b;
384 return ret;
385 }
386 friend pointer_based_stl_iterator operator+(Index a, const pointer_based_stl_iterator& b) {
387 pointer_based_stl_iterator ret(b);
388 ret += a;
389 return ret;
390 }
391 friend pointer_based_stl_iterator operator-(Index a, const pointer_based_stl_iterator& b) {
392 pointer_based_stl_iterator ret(b);
393 ret -= a;
394 return ret;
395 }
396
397 pointer_based_stl_iterator& operator+=(Index b) {
398 m_ptr += b * m_incr.value();
399 return *this;
400 }
401 pointer_based_stl_iterator& operator-=(Index b) {
402 m_ptr -= b * m_incr.value();
403 return *this;
404 }
405
406 difference_type operator-(const pointer_based_stl_iterator& other) const {
407 return (m_ptr - other.m_ptr) / m_incr.value();
408 }
409
410 difference_type operator-(const other_iterator& other) const { return (m_ptr - other.m_ptr) / m_incr.value(); }
411
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 bool operator>=(const pointer_based_stl_iterator& other) const { return m_ptr >= other.m_ptr; }
418
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 bool operator>=(const other_iterator& other) const { return m_ptr >= other.m_ptr; }
425
426 protected:
427 pointer m_ptr;
428 internal::variable_if_dynamic<Index, XprType::InnerStrideAtCompileTime> m_incr;
429};
430
431template <typename XprType_>
432struct indexed_based_stl_iterator_traits<generic_randaccess_stl_iterator<XprType_>> {
433 typedef XprType_ XprType;
434 typedef generic_randaccess_stl_iterator<std::remove_const_t<XprType>> non_const_iterator;
435 typedef generic_randaccess_stl_iterator<std::add_const_t<XprType>> const_iterator;
436};
437
438template <typename XprType>
439class generic_randaccess_stl_iterator
440 : public indexed_based_stl_iterator_base<generic_randaccess_stl_iterator<XprType>> {
441 public:
442 typedef typename XprType::Scalar value_type;
443
444 protected:
445 enum {
446 has_direct_access = (internal::traits<XprType>::Flags & DirectAccessBit) ? 1 : 0,
447 is_lvalue = internal::is_lvalue<XprType>::value
448 };
449
450 typedef indexed_based_stl_iterator_base<generic_randaccess_stl_iterator> Base;
451 using Base::m_index;
452 using Base::mp_xpr;
453
454 // TODO currently const Transpose/Reshape expressions never returns const references,
455 // so lets return by value too.
456 // typedef std::conditional_t<bool(has_direct_access), const value_type&, const value_type> read_only_ref_t;
457 typedef const value_type read_only_ref_t;
458
459 public:
460 typedef std::conditional_t<bool(is_lvalue), value_type*, const value_type*> pointer;
461 typedef std::conditional_t<bool(is_lvalue), value_type&, read_only_ref_t> reference;
462
463 generic_randaccess_stl_iterator() : Base() {}
464 generic_randaccess_stl_iterator(XprType& xpr, Index index) : Base(xpr, index) {}
465 generic_randaccess_stl_iterator(const typename Base::non_const_iterator& other) : Base(other) {}
466 using Base::operator=;
467
468 reference operator*() const { return (*mp_xpr)(m_index); }
469 reference operator[](Index i) const { return (*mp_xpr)(m_index + i); }
470 pointer operator->() const { return &((*mp_xpr)(m_index)); }
471};
472
473template <typename XprType_, DirectionType Direction>
474struct indexed_based_stl_iterator_traits<subvector_stl_iterator<XprType_, Direction>> {
475 typedef XprType_ XprType;
476 typedef subvector_stl_iterator<std::remove_const_t<XprType>, Direction> non_const_iterator;
477 typedef subvector_stl_iterator<std::add_const_t<XprType>, Direction> const_iterator;
478};
479
480template <typename XprType, DirectionType Direction>
481class subvector_stl_iterator : public indexed_based_stl_iterator_base<subvector_stl_iterator<XprType, Direction>> {
482 protected:
483 enum { is_lvalue = internal::is_lvalue<XprType>::value };
484
485 typedef indexed_based_stl_iterator_base<subvector_stl_iterator> Base;
486 using Base::m_index;
487 using Base::mp_xpr;
488
489 typedef std::conditional_t<Direction == Vertical, typename XprType::ColXpr, typename XprType::RowXpr> SubVectorType;
490 typedef std::conditional_t<Direction == Vertical, typename XprType::ConstColXpr, typename XprType::ConstRowXpr>
491 ConstSubVectorType;
492
493 public:
494 typedef std::conditional_t<bool(is_lvalue), SubVectorType, ConstSubVectorType> reference;
495 typedef typename reference::PlainObject value_type;
496
497 private:
498 class subvector_stl_iterator_ptr {
499 public:
500 subvector_stl_iterator_ptr(const reference& subvector) : m_subvector(subvector) {}
501 reference* operator->() { return &m_subvector; }
502
503 private:
504 reference m_subvector;
505 };
506
507 public:
508 typedef subvector_stl_iterator_ptr pointer;
509
510 subvector_stl_iterator() : Base() {}
511 subvector_stl_iterator(XprType& xpr, Index index) : Base(xpr, index) {}
512
513 reference operator*() const { return (*mp_xpr).template subVector<Direction>(m_index); }
514 reference operator[](Index i) const { return (*mp_xpr).template subVector<Direction>(m_index + i); }
515 pointer operator->() const { return (*mp_xpr).template subVector<Direction>(m_index); }
516};
517
518template <typename XprType_, DirectionType Direction>
519struct indexed_based_stl_iterator_traits<subvector_stl_reverse_iterator<XprType_, Direction>> {
520 typedef XprType_ XprType;
521 typedef subvector_stl_reverse_iterator<std::remove_const_t<XprType>, Direction> non_const_iterator;
522 typedef subvector_stl_reverse_iterator<std::add_const_t<XprType>, Direction> const_iterator;
523};
524
525template <typename XprType, DirectionType Direction>
526class subvector_stl_reverse_iterator
527 : public indexed_based_stl_reverse_iterator_base<subvector_stl_reverse_iterator<XprType, Direction>> {
528 protected:
529 enum { is_lvalue = internal::is_lvalue<XprType>::value };
530
531 typedef indexed_based_stl_reverse_iterator_base<subvector_stl_reverse_iterator> Base;
532 using Base::m_index;
533 using Base::mp_xpr;
534
535 typedef std::conditional_t<Direction == Vertical, typename XprType::ColXpr, typename XprType::RowXpr> SubVectorType;
536 typedef std::conditional_t<Direction == Vertical, typename XprType::ConstColXpr, typename XprType::ConstRowXpr>
537 ConstSubVectorType;
538
539 public:
540 typedef std::conditional_t<bool(is_lvalue), SubVectorType, ConstSubVectorType> reference;
541 typedef typename reference::PlainObject value_type;
542
543 private:
544 class subvector_stl_reverse_iterator_ptr {
545 public:
546 subvector_stl_reverse_iterator_ptr(const reference& subvector) : m_subvector(subvector) {}
547 reference* operator->() { return &m_subvector; }
548
549 private:
550 reference m_subvector;
551 };
552
553 public:
554 typedef subvector_stl_reverse_iterator_ptr pointer;
555
556 subvector_stl_reverse_iterator() : Base() {}
557 subvector_stl_reverse_iterator(XprType& xpr, Index index) : Base(xpr, index) {}
558
559 reference operator*() const { return (*mp_xpr).template subVector<Direction>(m_index); }
560 reference operator[](Index i) const { return (*mp_xpr).template subVector<Direction>(m_index + i); }
561 pointer operator->() const { return (*mp_xpr).template subVector<Direction>(m_index); }
562};
563
564} // namespace internal
565
570template <typename Derived>
572 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
573 return iterator(derived(), 0);
574}
575
577template <typename Derived>
579 return cbegin();
580}
581
586template <typename Derived>
588 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
589 return const_iterator(derived(), 0);
590}
591
593 * \only_for_vectors
594 * \sa begin(), cend()
595 */
596template <typename Derived>
598 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
599 return iterator(derived(), size());
600}
601
603template <typename Derived>
605 return cend();
606}
607
612template <typename Derived>
614 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
615 return const_iterator(derived(), size());
616}
617
618} // namespace Eigen
619
620#endif // EIGEN_STLITERATORS_H
random_access_iterator_type const_iterator
Definition DenseBase.h:574
iterator begin()
Definition StlIterators.h:571
iterator end()
Definition StlIterators.h:597
const_iterator cbegin() const
Definition StlIterators.h:587
const_iterator cend() const
Definition StlIterators.h:613
random_access_iterator_type iterator
Definition DenseBase.h:572
const unsigned int DirectAccessBit
Definition Constants.h:159
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:82