ArrayAccessor3-Impl.h
Go to the documentation of this file.
1 /*************************************************************************
2 > File Name: ArrayAccessor3-Impl.h
3 > Project Name: CubbyFlow
4 > Author: Chan-Ho Chris Ohk, Dongmin Kim
5 > Purpose: 3-D array accessor class.
6 > Created Time: 2017/01/28
7 > Copyright (c) 2018, Chan-Ho Chris Ohk
8 *************************************************************************/
9 #ifndef CUBBYFLOW_ARRAY_ACCESSOR3_IMPL_H
10 #define CUBBYFLOW_ARRAY_ACCESSOR3_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, 3>::ArrayAccessor(const Size3& size, T* const data)
29  {
30  Reset(size, data);
31  }
32 
33  template <typename T>
34  ArrayAccessor<T, 3>::ArrayAccessor(size_t width, size_t height, size_t depth, T* const data)
35  {
36  Reset(width, height, depth, 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, 3>::Reset(const Size3& size, T* const data)
53  {
54  m_size = size;
55  m_data = data;
56  }
57 
58  template <typename T>
59  void ArrayAccessor<T, 3>::Reset(size_t width, size_t height, size_t depth, T* const data)
60  {
61  Reset(Size3(width, height, depth), data);
62  }
63 
64  template <typename T>
66  {
67  assert(i < Width() * Height() * Depth());
68  return m_data[i];
69  }
70 
71  template <typename T>
72  const T& ArrayAccessor<T, 3>::At(size_t i) const
73  {
74  assert(i < Width() * Height() * Depth());
75  return m_data[i];
76  }
77 
78  template <typename T>
80  {
81  return At(pt.x, pt.y, pt.z);
82  }
83 
84  template <typename T>
85  const T& ArrayAccessor<T, 3>::At(const Point3UI& pt) const
86  {
87  return At(pt.x, pt.y, pt.z);
88  }
89 
90  template <typename T>
91  T& ArrayAccessor<T, 3>::At(size_t i, size_t j, size_t k)
92  {
93  assert(i < Width() && j < Height() && k < Depth());
94  return m_data[Index(i, j, k)];
95  }
96 
97  template <typename T>
98  const T& ArrayAccessor<T, 3>::At(size_t i, size_t j, size_t k) const
99  {
100  assert(i < Width() && j < Height() && k < Depth());
101  return m_data[Index(i, j, k)];
102  }
103 
104  template <typename T>
105  T* const ArrayAccessor<T, 3>::begin() const
106  {
107  return m_data;
108  }
109 
110  template <typename T>
111  T* const ArrayAccessor<T, 3>::end() const
112  {
113  return m_data + Width() * Height() * Depth();
114  }
115 
116  template <typename T>
118  {
119  return m_data;
120  }
121 
122  template <typename T>
124  {
125  return m_data + Width() * Height() * Depth();
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>
148  {
149  return m_size.z;
150  }
151 
152  template <typename T>
153  T* const ArrayAccessor<T, 3>::data() const
154  {
155  return m_data;
156  }
157 
158  template <typename T>
160  {
161  std::swap(other.m_data, m_data);
162  std::swap(other.m_size, m_size);
163  }
164 
165  template <typename T>
166  template <typename Callback>
167  void ArrayAccessor<T, 3>::ForEach(Callback func) const
168  {
169  for (size_t k = 0; k < Depth(); ++k)
170  {
171  for (size_t j = 0; j < Height(); ++j)
172  {
173  for (size_t i = 0; i < Width(); ++i)
174  {
175  func(At(i, j, k));
176  }
177  }
178  }
179  }
180 
181  template <typename T>
182  template <typename Callback>
183  void ArrayAccessor<T, 3>::ForEachIndex(Callback func) const
184  {
185  for (size_t k = 0; k < Depth(); ++k)
186  {
187  for (size_t j = 0; j < Height(); ++j)
188  {
189  for (size_t i = 0; i < Width(); ++i)
190  {
191  func(i, j, k);
192  }
193  }
194  }
195  }
196 
197  template <typename T>
198  template <typename Callback>
200  {
201  ParallelFor(ZERO_SIZE, Width(), ZERO_SIZE, Height(), ZERO_SIZE, Depth(), [&](size_t i, size_t j, size_t k)
202  {
203  func(At(i, j, k));
204  });
205  }
206 
207  template <typename T>
208  template <typename Callback>
210  {
211  ParallelFor(ZERO_SIZE, Width(), ZERO_SIZE, Height(), ZERO_SIZE, Depth(), func);
212  }
213 
214  template <typename T>
215  size_t ArrayAccessor<T, 3>::Index(const Point3UI& pt) const
216  {
217  assert(pt.x < Width() && pt.y < Height() && pt.z < Depth());
218  return pt.x + Width() * pt.y + Width() * Height() * pt.z;
219  }
220 
221  template <typename T>
222  size_t ArrayAccessor<T, 3>::Index(size_t i, size_t j, size_t k) const
223  {
224  assert(i < Width() && j < Height() && k < Depth());
225  return i + Width() * j + Width() * Height() * k;
226  }
227 
228  template <typename T>
230  {
231  return m_data[i];
232  }
233 
234  template <typename T>
235  const T& ArrayAccessor<T, 3>::operator[](size_t i) const
236  {
237  return m_data[i];
238  }
239 
240  template <typename T>
242  {
243  return m_data[Index(pt)];
244  }
245 
246  template <typename T>
247  const T& ArrayAccessor<T, 3>::operator()(const Point3UI& pt) const
248  {
249  return m_data[Index(pt)];
250  }
251 
252  template <typename T>
253  T& ArrayAccessor<T, 3>::operator()(size_t i, size_t j, size_t k)
254  {
255  return m_data[Index(i, j, k)];
256  }
257 
258  template <typename T>
259  const T& ArrayAccessor<T, 3>::operator()(size_t i, size_t j, size_t k) const
260  {
261  return m_data[Index(i, j, k)];
262  }
263 
264  template <typename T>
266  {
267  Set(other);
268  return *this;
269  }
270 
271  template <typename T>
273  {
274  return ConstArrayAccessor<T, 3>(*this);
275  }
276 
277  template <typename T>
279  m_data(nullptr)
280  {
281  // Do nothing
282  }
283 
284  template <typename T>
285  ConstArrayAccessor<T, 3>::ConstArrayAccessor(const Size3& size, const T* const data)
286  {
287  m_size = size;
288  m_data = data;
289  }
290 
291  template <typename T>
292  ConstArrayAccessor<T, 3>::ConstArrayAccessor(size_t width, size_t height, size_t depth, const T* const data)
293  {
294  m_size = Size3(width, height, depth);
295  m_data = data;
296  }
297 
298  template <typename T>
300  {
301  m_size = other.size();
302  m_data = other.data();
303  }
304 
305  template <typename T>
307  {
308  m_size = other.m_size;
309  m_data = other.m_data;
310  }
311 
312  template <typename T>
313  const T& ConstArrayAccessor<T, 3>::At(size_t i) const
314  {
315  assert(i < Width() * Height() * Depth());
316  return m_data[i];
317  }
318 
319  template <typename T>
320  const T& ConstArrayAccessor<T, 3>::At(const Point3UI& pt) const
321  {
322  return At(pt.x, pt.y, pt.z);
323  }
324 
325  template <typename T>
326  const T& ConstArrayAccessor<T, 3>::At(size_t i, size_t j, size_t k) const
327  {
328  assert(i < Width());
329  assert(j < Height());
330  assert(k < Depth());
331  return m_data[Index(i, j, k)];
332  }
333 
334  template <typename T>
335  const T* const ConstArrayAccessor<T, 3>::begin() const
336  {
337  return m_data;
338  }
339 
340  template <typename T>
341  const T* const ConstArrayAccessor<T, 3>::end() const
342  {
343  return m_data + Width() * Height() * Depth();
344  }
345 
346  template <typename T>
348  {
349  return m_size;
350  }
351 
352  template <typename T>
354  {
355  return m_size.x;
356  }
357 
358  template <typename T>
360  {
361  return m_size.y;
362  }
363 
364  template <typename T>
366  {
367  return m_size.z;
368  }
369 
370  template <typename T>
371  const T* const ConstArrayAccessor<T, 3>::data() const
372  {
373  return m_data;
374  }
375 
376  template <typename T>
377  template <typename Callback>
378  void ConstArrayAccessor<T, 3>::ForEach(Callback func) const
379  {
380  for (size_t k = 0; k < Depth(); ++k)
381  {
382  for (size_t j = 0; j < Height(); ++j)
383  {
384  for (size_t i = 0; i < Width(); ++i)
385  {
386  func(At(i, j, k));
387  }
388  }
389  }
390  }
391 
392  template <typename T>
393  template <typename Callback>
394  void ConstArrayAccessor<T, 3>::ForEachIndex(Callback func) const
395  {
396  for (size_t k = 0; k < Depth(); ++k)
397  {
398  for (size_t j = 0; j < Height(); ++j)
399  {
400  for (size_t i = 0; i < Width(); ++i)
401  {
402  func(i, j, k);
403  }
404  }
405  }
406  }
407 
408  template <typename T>
409  template <typename Callback>
411  {
412  ParallelFor(ZERO_SIZE, Width(), ZERO_SIZE, Height(), ZERO_SIZE, Depth(), func);
413  }
414 
415  template <typename T>
417  {
418  assert(pt.x < m_size.x && pt.y < m_size.y && pt.z < m_size.z);
419  return pt.x + Width() * pt.y + Width() * Height() * pt.z;
420  }
421 
422  template <typename T>
423  size_t ConstArrayAccessor<T, 3>::Index(size_t i, size_t j, size_t k) const
424  {
425  assert(i < m_size.x && j < m_size.y && k < m_size.z);
426  return i + Width() * j + Width() * Height() * k;
427  }
428 
429  template <typename T>
430  const T& ConstArrayAccessor<T, 3>::operator[](size_t i) const
431  {
432  return m_data[i];
433  }
434 
435  template <typename T>
436  const T& ConstArrayAccessor<T, 3>::operator()(size_t i, size_t j, size_t k) const
437  {
438  return m_data[Index(i, j, k)];
439  }
440 
441  template <typename T>
443  {
444  return m_data[Index(pt)];
445  }
446 }
447 
448 #endif
3-D array accessor class.
Definition: ArrayAccessor3.h:31
3-D read-only array accessor class.
Definition: ArrayAccessor3.h:269
3-D point class.
Definition: Point3.h:26
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 z
Z (or the third) component of the point.
Definition: Point3.h:38
T y
Y (or the second) component of the point.
Definition: Point3.h:35
constexpr size_t ZERO_SIZE
Zero size_t.
Definition: Constants.h:18
T x
X (or the first) component of the point.
Definition: Point3.h:29
Size3 size() const
Returns the size of the array.
Definition: ArrayAccessor3-Impl.h:129
T *const data() const
Returns the raw pointer to the array data.
Definition: ArrayAccessor3-Impl.h:153
Point3< size_t > Size3
Definition: Size3.h:16