DP3
Cursor.h
Go to the documentation of this file.
1 // Cursor.h: Multi-dimensional iterators.
2 //
3 // Copyright (C) 2020 ASTRON (Netherlands Institute for Radio Astronomy)
4 // SPDX-License-Identifier: GPL-3.0-or-later
5 
6 #ifndef DP3_BASE_CURSOR_H_
7 #define DP3_BASE_CURSOR_H_
8 
9 #include <cassert>
10 #include <complex>
11 
12 namespace dp3 {
13 namespace base {
14 
16 
18 
19 template <typename T>
20 class cursor {
21  public:
22  cursor() : itsPointer(0), itsRank(0) {}
23 
24  cursor(T *pointer) : itsPointer(pointer), itsRank(1) {
25  std::fill(itsStrides, itsStrides + MAX_RANK, 0);
26  itsStrides[0] = 1;
27  }
28 
29  template <typename T_STRIDE>
30  cursor(T *pointer, size_t rank, const T_STRIDE *strides)
31  : itsPointer(pointer), itsRank(rank) {
32  assert(rank <= MAX_RANK);
33  std::copy(strides, strides + itsRank, itsStrides);
34  std::fill(itsStrides + itsRank, itsStrides + MAX_RANK, 0);
35  }
36 
37  size_t rank() const { return itsRank; }
38 
40  itsPointer += itsStrides[0];
41  return *this;
42  }
43 
45  cursor tmp = *this;
46  itsPointer += itsStrides[0];
47  return tmp;
48  }
49 
50  cursor &operator+=(size_t n) {
51  itsPointer += n * itsStrides[0];
52  return *this;
53  }
54 
55  cursor &operator-=(size_t n) {
56  itsPointer -= n * itsStrides[0];
57  return *this;
58  }
59 
60  T &operator*() { return *itsPointer; }
61 
62  const T &operator*() const { return *itsPointer; }
63 
64  T *operator->() { return itsPointer; }
65 
66  const T *operator->() const { return itsPointer; }
67 
68  T &operator[](size_t n) { return *(itsPointer + n * itsStrides[0]); }
69 
70  const T &operator[](size_t n) const {
71  return *(itsPointer + n * itsStrides[0]);
72  }
73 
74  void forward(size_t i) { itsPointer += itsStrides[i]; }
75 
76  void forward(size_t i, size_t n) { itsPointer += n * itsStrides[i]; }
77 
78  void backward(size_t i) { itsPointer -= itsStrides[i]; }
79 
80  void backward(size_t i, size_t n) { itsPointer -= n * itsStrides[i]; }
81 
82  T *address() { return itsPointer; }
83 
84  const T *address() const { return itsPointer; }
85 
86  size_t stride(size_t i) const { return itsStrides[i]; }
87 
88  private:
89  static const size_t MAX_RANK = 5;
90 
91  T *itsPointer;
92  size_t itsRank;
93  size_t itsStrides[MAX_RANK] = {0};
94 };
95 
96 template <typename T>
97 class const_cursor {
98  public:
99  const_cursor() : itsPointer(nullptr), itsRank(0) {}
100 
101  const_cursor(const T *pointer) : itsPointer(pointer), itsRank(1) {
102  std::fill(itsStrides, itsStrides + MAX_RANK, 0);
103  itsStrides[0] = 1;
104  }
105 
106  template <typename T_STRIDE>
107  const_cursor(const T *pointer, size_t rank, const T_STRIDE *strides)
108  : itsPointer(pointer), itsRank(rank) {
109  std::copy(strides, strides + itsRank, itsStrides);
110  std::fill(itsStrides + itsRank, itsStrides + MAX_RANK, 0);
111  }
112 
113  const_cursor(const cursor<T> &other)
114  : itsPointer(other.address()), itsRank(other.rank()) {
115  for (size_t i = 0; i < itsRank; ++i) {
116  itsStrides[i] = other.stride(i);
117  }
118  std::fill(itsStrides + itsRank, itsStrides + MAX_RANK, 0);
119  }
120 
121  size_t rank() const { return itsRank; }
122 
124  itsPointer += itsStrides[0];
125  return *this;
126  }
127 
129  const_cursor tmp = *this;
130  itsPointer += itsStrides[0];
131  return tmp;
132  }
133 
135  itsPointer += n * itsStrides[0];
136  return *this;
137  }
138 
140  itsPointer -= n * itsStrides[0];
141  return *this;
142  }
143 
144  const T &operator*() const { return *itsPointer; }
145 
146  const T *operator->() const { return itsPointer; }
147 
148  const T &operator[](size_t n) const {
149  return *(itsPointer + n * itsStrides[0]);
150  }
151 
152  void forward(size_t i) { itsPointer += itsStrides[i]; }
153 
154  void forward(size_t i, size_t n) { itsPointer += n * itsStrides[i]; }
155 
156  void backward(size_t i) { itsPointer -= itsStrides[i]; }
157 
158  void backward(size_t i, size_t n) { itsPointer -= n * itsStrides[i]; }
159 
160  const T *address() const { return itsPointer; }
161 
162  size_t stride(size_t i) const { return itsStrides[i]; }
163 
164  private:
165  static const size_t MAX_RANK = 5;
166 
167  const T *itsPointer;
168  size_t itsRank;
169  size_t itsStrides[MAX_RANK] = {0};
170 };
171 
173 
174 } // namespace base
175 } // namespace dp3
176 
177 #endif
Definition: Cursor.h:97
const_cursor(const T *pointer)
Definition: Cursor.h:101
void backward(size_t i, size_t n)
Definition: Cursor.h:158
size_t stride(size_t i) const
Definition: Cursor.h:162
void forward(size_t i)
Definition: Cursor.h:152
const_cursor operator++(int)
Definition: Cursor.h:128
const T & operator*() const
Definition: Cursor.h:144
const_cursor(const T *pointer, size_t rank, const T_STRIDE *strides)
Definition: Cursor.h:107
const T & operator[](size_t n) const
Definition: Cursor.h:148
const T * address() const
Definition: Cursor.h:160
const_cursor & operator++()
Definition: Cursor.h:123
void forward(size_t i, size_t n)
Definition: Cursor.h:154
void backward(size_t i)
Definition: Cursor.h:156
const T * operator->() const
Definition: Cursor.h:146
const_cursor()
Definition: Cursor.h:99
const_cursor(const cursor< T > &other)
Definition: Cursor.h:113
const_cursor & operator-=(size_t n)
Definition: Cursor.h:139
const_cursor & operator+=(size_t n)
Definition: Cursor.h:134
size_t rank() const
Definition: Cursor.h:121
Multi-dimensional iterators.
Definition: Cursor.h:20
T * operator->()
Definition: Cursor.h:64
cursor & operator+=(size_t n)
Definition: Cursor.h:50
cursor()
Definition: Cursor.h:22
cursor(T *pointer, size_t rank, const T_STRIDE *strides)
Definition: Cursor.h:30
const T * operator->() const
Definition: Cursor.h:66
T & operator*()
Definition: Cursor.h:60
size_t stride(size_t i) const
Definition: Cursor.h:86
cursor & operator-=(size_t n)
Definition: Cursor.h:55
cursor(T *pointer)
Definition: Cursor.h:24
void forward(size_t i)
Definition: Cursor.h:74
const T & operator[](size_t n) const
Definition: Cursor.h:70
T & operator[](size_t n)
Definition: Cursor.h:68
size_t rank() const
Definition: Cursor.h:37
void backward(size_t i, size_t n)
Definition: Cursor.h:80
void forward(size_t i, size_t n)
Definition: Cursor.h:76
const T & operator*() const
Definition: Cursor.h:62
void backward(size_t i)
Definition: Cursor.h:78
cursor operator++(int)
Definition: Cursor.h:44
const T * address() const
Definition: Cursor.h:84
T * address()
Definition: Cursor.h:82
cursor & operator++()
Definition: Cursor.h:39
This file has generic helper routines for testing steps.
Definition: AntennaConfig.h:53