3#ifndef _poplar_Iterators_hpp_
4#define _poplar_Iterators_hpp_
8#include <poplar/Alignment.hpp>
15 :
public std::iterator<std::forward_iterator_tag, const T> {
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++() {
28 ForwardIterator operator++(
int) {
29 ForwardIterator it(*
this);
36using StdRandomAccessIterator =
37 std::iterator<std::random_access_iterator_tag, const T>;
40template <
typename T,
unsigned MinAlign>
41class DerefRandomAccessIterator :
public StdRandomAccessIterator<T> {
42 friend DerefRandomAccessIterator<const T, MinAlign>;
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,
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++() {
61 DerefRandomAccessIterator operator++(
int) {
62 DerefRandomAccessIterator it(*
this);
66 DerefRandomAccessIterator &operator--() {
70 DerefRandomAccessIterator operator--(
int) {
71 DerefRandomAccessIterator it(*
this);
75 DerefRandomAccessIterator &operator+=(
const difference_type &n) {
79 friend const DerefRandomAccessIterator
80 operator+(
const difference_type &n, DerefRandomAccessIterator out) {
84 friend const DerefRandomAccessIterator
85 operator+(DerefRandomAccessIterator out,
const difference_type &n) {
89 DerefRandomAccessIterator &operator-=(
const difference_type &n) {
93 DerefRandomAccessIterator operator-(
const difference_type &n)
const {
94 DerefRandomAccessIterator it(*
this);
97 reference operator[](
const difference_type &n)
const {
98 return *poplar_assume_aligned<MinAlign, T>(p[n]);
100 friend difference_type operator-(
const DerefRandomAccessIterator &a,
101 const DerefRandomAccessIterator &b) {
104 friend bool operator==(
const DerefRandomAccessIterator &a,
105 const DerefRandomAccessIterator &b) {
108 friend bool operator!=(
const DerefRandomAccessIterator &a,
109 const DerefRandomAccessIterator &b) {
112 friend bool operator<(
const DerefRandomAccessIterator &a,
113 const DerefRandomAccessIterator &b) {
116 friend bool operator>(
const DerefRandomAccessIterator &a,
117 const DerefRandomAccessIterator &b) {
120 friend bool operator<=(
const DerefRandomAccessIterator &a,
121 const DerefRandomAccessIterator &b) {
124 friend bool operator>=(
const DerefRandomAccessIterator &a,
125 const DerefRandomAccessIterator &b) {
Poplar classes and functions.
Definition: ArrayRef.hpp:14