ArrayAccessor2-Impl.h
Go to the documentation of this file.
1 /*************************************************************************
2 > File Name: ArrayAccessor2-Impl.h
3 > Project Name: CubbyFlow
4 > Author: Chan-Ho Chris Ohk, Dongmin Kim
5 > Purpose: 2-D array accessor class.
6 > Created Time: 2017/01/28
7 > Copyright (c) 2018, Chan-Ho Chris Ohk
8 *************************************************************************/
9 #ifndef CUBBYFLOW_ARRAY_ACCESSOR2_IMPL_H
10 #define CUBBYFLOW_ARRAY_ACCESSOR2_IMPL_H
11 
12 #include <Core/Utils/Constants.h>
13 #include <Core/Utils/Parallel.h>
14 
15 #include <algorithm>
16 #include <cassert>
17 
18 namespace CubbyFlow
19 {
20  template <typename T>
22  m_data(nullptr)
23  {
24  // Do nothing
25  }
26 
27  template <typename T>
28  ArrayAccessor<T, 2>::ArrayAccessor(const Size2& size, T* const data)
29  {
30  Reset(size, data);
31  }
32 
33  template <typename T>
34  ArrayAccessor<T, 2>::ArrayAccessor(size_t width, size_t height, T* const data)
35  {
36  Reset(width, height, data);
37  }
38 
39  template <typename T>
41  {
42  Set(other);
43  }
44 
45  template <typename T>
47  {
48  Reset(other.m_size, other.m_data);
49  }
50 
51  template <typename T>
52  void ArrayAccessor<T, 2>::Reset(const Size2& size, T* const data)
53  {
54  m_size = size;
55  m_data = data;
56  }
57 
58  template <typename T>
59  void ArrayAccessor<T, 2>::Reset(size_t width, size_t height, T* const data)
60  {
61  Reset(Size2(width, height), data);
62  }
63 
64  template <typename T>
66  {
67  assert(i < Width() * Height());
68  return m_data[i];
69  }
70 
71  template <typename T>
72  const T& ArrayAccessor<T, 2>::At(size_t i) const
73  {
74  assert(i < Width() * Height());
75  return m_data[i];
76  }
77 
78  template <typename T>
80  {
81  return At(pt.x, pt.y);
82  }
83 
84  template <typename T>
85  const T& ArrayAccessor<T, 2>::At(const Point2UI& pt) const
86  {
87  return At(pt.x, pt.y);
88  }
89 
90  template <typename T>
91  T& ArrayAccessor<T, 2>::At(size_t i, size_t j)
92  {
93  assert(i < Width() && j < Height());
94  return m_data[Index(i, j)];
95  }
96 
97  template <typename T>
98  const T& ArrayAccessor<T, 2>::At(size_t i, size_t j) const
99  {
100  assert(i < Width() && j < Height());
101  return m_data[Index(i, j)];
102  }
103 
104  template <typename T>
105  T* const ArrayAccessor<T, 2>::begin() const
106  {
107  return m_data;
108  }
109 
110  template <typename T>
111  T* const ArrayAccessor<T, 2>::end() const
112  {
113  return m_data + Width() * Height();
114  }
115 
116  template <typename T>
118  {
119  return m_data;
120  }
121 
122  template <typename T>
124  {
125  return m_data + Width() * Height();
126  }
127 
128  template <typename T>
130  {
131  return m_size;
132  }
133 
134  template <typename T>
136  {
137  return m_size.x;
138  }
139 
140  template <typename T>
142  {
143  return m_size.y;
144  }
145 
146  template <typename T>
147  T* const ArrayAccessor<T, 2>::data() const
148  {
149  return m_data;
150  }
151 
152  template <typename T>
154  {
155  std::swap(other.m_data, m_data);
156  std::swap(other.m_size, m_size);
157  }
158 
159  template <typename T>
160  template <typename Callback>
161  void ArrayAccessor<T, 2>::ForEach(Callback func) const
162  {
163  for (size_t j = 0; j < Height(); ++j)
164  {
165  for (size_t i = 0; i < Width(); ++i)
166  {
167  func(At(i, j));
168  }
169  }
170  }
171 
172  template <typename T>
173  template <typename Callback>
174  void ArrayAccessor<T, 2>::ForEachIndex(Callback func) const
175  {
176  for (size_t j = 0; j < Height(); ++j)
177  {
178  for (size_t i = 0; i < Width(); ++i)
179  {
180  func(i, j);
181  }
182  }
183  }
184 
185  template <typename T>
186  template <typename Callback>
188  {
189  ParallelFor(ZERO_SIZE, Width(), ZERO_SIZE, Height(), [&](size_t i, size_t j)
190  {
191  func(At(i, j));
192  });
193  }
194 
195  template <typename T>
196  template <typename Callback>
198  {
199  ParallelFor(ZERO_SIZE, Width(), ZERO_SIZE, Height(), func);
200  }
201 
202  template <typename T>
203  size_t ArrayAccessor<T, 2>::Index(const Point2UI& pt) const
204  {
205  assert(pt.x < Width() && pt.y < Height());
206  return pt.x + Width() * pt.y;
207  }
208 
209  template <typename T>
210  size_t ArrayAccessor<T, 2>::Index(size_t i, size_t j) const
211  {
212  assert(i < Width() && j < Height());
213  return i + Width() * j;
214  }
215 
216  template <typename T>
218  {
219  return m_data[i];
220  }
221 
222  template <typename T>
223  const T& ArrayAccessor<T, 2>::operator[](size_t i) const
224  {
225  return m_data[i];
226  }
227 
228  template <typename T>
230  {
231  return m_data[Index(pt.x, pt.y)];
232  }
233 
234  template <typename T>
235  const T& ArrayAccessor<T, 2>::operator()(const Point2UI& pt) const
236  {
237  return m_data[Index(pt.x, pt.y)];
238  }
239 
240  template <typename T>
241  T& ArrayAccessor<T, 2>::operator()(size_t i, size_t j)
242  {
243  return m_data[Index(i, j)];
244  }
245 
246  template <typename T>
247  const T& ArrayAccessor<T, 2>::operator()(size_t i, size_t j) const
248  {
249  return m_data[Index(i, j)];
250  }
251 
252  template <typename T>
254  {
255  Set(other);
256  return *this;
257  }
258 
259  template <typename T>
261  {
262  return ConstArrayAccessor<T, 2>(*this);
263  }
264 
265  template <typename T>
267  m_data(nullptr)
268  {
269  // Do nothing
270  }
271 
272  template <typename T>
273  ConstArrayAccessor<T, 2>::ConstArrayAccessor(const Size2& size, const T* const data)
274  {
275  m_size = size;
276  m_data = data;
277  }
278 
279  template <typename T>
280  ConstArrayAccessor<T, 2>::ConstArrayAccessor(size_t width, size_t height, const T* const data)
281  {
282  m_size = Size2(width, height);
283  m_data = data;
284  }
285 
286  template <typename T>
288  {
289  m_size = other.size();
290  m_data = other.data();
291  }
292 
293  template <typename T>
295  {
296  m_size = other.m_size;
297  m_data = other.m_data;
298  }
299 
300  template <typename T>
301  const T& ConstArrayAccessor<T, 2>::At(size_t i) const
302  {
303  assert(i < Width() * Height());
304  return m_data[i];
305  }
306 
307  template <typename T>
308  const T& ConstArrayAccessor<T, 2>::At(const Point2UI& pt) const
309  {
310  return m_data[Index(pt)];
311  }
312 
313  template <typename T>
314  const T& ConstArrayAccessor<T, 2>::At(size_t i, size_t j) const
315  {
316  assert(i < Width() && j < Height());
317  return m_data[Index(i, j)];
318  }
319 
320  template <typename T>
321  const T* const ConstArrayAccessor<T, 2>::begin() const
322  {
323  return m_data;
324  }
325 
326  template <typename T>
327  const T* const ConstArrayAccessor<T, 2>::end() const
328  {
329  return m_data + Width() * Height();
330  }
331 
332  template <typename T>
334  {
335  return m_size;
336  }
337 
338  template <typename T>
340  {
341  return m_size.x;
342  }
343 
344  template <typename T>
346  {
347  return m_size.y;
348  }
349 
350  template <typename T>
351  const T* const ConstArrayAccessor<T, 2>::data() const
352  {
353  return m_data;
354  }
355 
356  template <typename T>
357  template <typename Callback>
358  void ConstArrayAccessor<T, 2>::ForEach(Callback func) const
359  {
360  for (size_t j = 0; j < Height(); ++j)
361  {
362  for (size_t i = 0; i < Width(); ++i)
363  {
364  func(At(i, j));
365  }
366  }
367  }
368 
369  template <typename T>
370  template <typename Callback>
371  void ConstArrayAccessor<T, 2>::ForEachIndex(Callback func) const
372  {
373  for (size_t j = 0; j < Height(); ++j)
374  {
375  for (size_t i = 0; i < Width(); ++i)
376  {
377  func(i, j);
378  }
379  }
380  }
381 
382  template <typename T>
383  template <typename Callback>
385  {
386  ParallelFor(ZERO_SIZE, Width(), ZERO_SIZE, Height(), func);
387  }
388 
389  template <typename T>
391  {
392  assert(pt.x < Width() && pt.y < Height());
393  return pt.x + Width() * pt.y;
394  }
395 
396  template <typename T>
397  size_t ConstArrayAccessor<T, 2>::Index(size_t i, size_t j) const
398  {
399  assert(i < Width() && j < Height());
400  return i + Width() * j;
401  }
402 
403  template <typename T>
404  const T& ConstArrayAccessor<T, 2>::operator[](size_t i) const
405  {
406  return m_data[i];
407  }
408 
409  template <typename T>
411  {
412  return m_data[Index(pt)];
413  }
414 
415  template <typename T>
416  const T& ConstArrayAccessor<T, 2>::operator()(size_t i, size_t j) const
417  {
418  return m_data[Index(i, j)];
419  }
420 }
421 
422 #endif
2-D read-only array accessor class.
Definition: ArrayAccessor2.h:261
T x
X (or the first) component of the point.
Definition: Point2.h:28
2-D point class.
Definition: Point2.h:25
2-D array accessor class.
Definition: ArrayAccessor2.h:31
Point2< size_t > Size2
Definition: Size2.h:16
T y
Y (or the second) component of the point.
Definition: Point2.h:34
Generic N-dimensional array accessor class interface.
Definition: ArrayAccessor.h:31
Definition: pybind11Utils.h:24
void ParallelFor(IndexType beginIndex, IndexType endIndex, const Function &function, ExecutionPolicy policy)
Makes a for-loop from beginIndex to endIndex in parallel.
Definition: Parallel-Impl.h:201
Generic N-dimensional read-only array accessor class interface.
Definition: ArrayAccessor.h:52
T *const data() const
Returns the raw pointer to the array data.
Definition: ArrayAccessor2-Impl.h:147
Size2 size() const
Returns the size of the array.
Definition: ArrayAccessor2-Impl.h:129
constexpr size_t ZERO_SIZE
Zero size_t.
Definition: Constants.h:18