Poplar and PopLibs
Iterators.hpp
1// Copyright (c) 2018 Graphcore Ltd. All rights reserved.
2
3#ifndef _poplar_Iterators_hpp_
4#define _poplar_Iterators_hpp_
5
6#include <iterator>
7
8#include <poplar/Alignment.hpp>
9
10namespace poplar {
11
12// Forward iterator.
13template <typename T>
14class ForwardIterator
15 : public std::iterator<std::forward_iterator_tag, const T> {
16 const T **p;
17
18public:
19 ForwardIterator(void **q) { p = (const T **)q; }
20 const T &operator*() const { return **p; }
21 const T *operator->() const { return *p; }
22 bool operator==(const ForwardIterator &y) const { return p == y.p; }
23 bool operator!=(const ForwardIterator &y) const { return p != y.p; }
24 ForwardIterator &operator++() {
25 p++;
26 return *this;
27 }
28 ForwardIterator operator++(int) {
29 ForwardIterator it(*this);
30 p++;
31 return it;
32 }
33};
34
35template <typename T>
36using StdRandomAccessIterator =
37 std::iterator<std::random_access_iterator_tag, const T>;
38
39// Dereferencing random-access iterator.
40template <typename T, unsigned MinAlign>
41class DerefRandomAccessIterator : public StdRandomAccessIterator<T> {
42 friend DerefRandomAccessIterator<const T, MinAlign>;
43 T *const *p;
44
45public:
46 using typename StdRandomAccessIterator<T>::difference_type;
47 using reference = T &;
48 explicit DerefRandomAccessIterator(T **q) : p(q) {}
49 DerefRandomAccessIterator(
50 const DerefRandomAccessIterator<typename std::remove_const<T>::type,
51 MinAlign> &other)
52 : p(other.p) {}
53 T &operator*() const { return *poplar_assume_aligned<MinAlign, T>(*p); }
54 T *operator->() const { return poplar_assume_aligned<MinAlign, T>(*p); }
55 DerefRandomAccessIterator &
56 operator=(const DerefRandomAccessIterator &) = default;
57 DerefRandomAccessIterator &operator++() {
58 p++;
59 return *this;
60 }
61 DerefRandomAccessIterator operator++(int) {
62 DerefRandomAccessIterator it(*this);
63 p++;
64 return it;
65 }
66 DerefRandomAccessIterator &operator--() {
67 p--;
68 return *this;
69 }
70 DerefRandomAccessIterator operator--(int) {
71 DerefRandomAccessIterator it(*this);
72 p--;
73 return it;
74 }
75 DerefRandomAccessIterator &operator+=(const difference_type &n) {
76 p += n;
77 return *this;
78 }
79 friend const DerefRandomAccessIterator
80 operator+(const difference_type &n, DerefRandomAccessIterator out) {
81 out += n;
82 return out;
83 }
84 friend const DerefRandomAccessIterator
85 operator+(DerefRandomAccessIterator out, const difference_type &n) {
86 out += n;
87 return out;
88 }
89 DerefRandomAccessIterator &operator-=(const difference_type &n) {
90 p -= n;
91 return *this;
92 }
93 DerefRandomAccessIterator operator-(const difference_type &n) const {
94 DerefRandomAccessIterator it(*this);
95 return it -= n;
96 }
97 reference operator[](const difference_type &n) const {
98 return *poplar_assume_aligned<MinAlign, T>(p[n]);
99 }
100 friend difference_type operator-(const DerefRandomAccessIterator &a,
101 const DerefRandomAccessIterator &b) {
102 return a.p - b.p;
103 }
104 friend bool operator==(const DerefRandomAccessIterator &a,
105 const DerefRandomAccessIterator &b) {
106 return a.p == b.p;
107 }
108 friend bool operator!=(const DerefRandomAccessIterator &a,
109 const DerefRandomAccessIterator &b) {
110 return a.p != b.p;
111 }
112 friend bool operator<(const DerefRandomAccessIterator &a,
113 const DerefRandomAccessIterator &b) {
114 return a.p < b.p;
115 }
116 friend bool operator>(const DerefRandomAccessIterator &a,
117 const DerefRandomAccessIterator &b) {
118 return a.p > b.p;
119 }
120 friend bool operator<=(const DerefRandomAccessIterator &a,
121 const DerefRandomAccessIterator &b) {
122 return a.p <= b.p;
123 }
124 friend bool operator>=(const DerefRandomAccessIterator &a,
125 const DerefRandomAccessIterator &b) {
126 return a.p >= b.p;
127 }
128}; // End DerefRandomAccessIterator.
129
130} // namespace poplar
131
132#endif // _poplar_Iterators_hpp_
Poplar classes and functions.
Definition: ArrayRef.hpp:14