Array2-Impl.h
Go to the documentation of this file.
1 /*************************************************************************
2 > File Name: Array2-Impl.h
3 > Project Name: CubbyFlow
4 > Author: Chan-Ho Chris Ohk
5 > Purpose: 2-D array class.
6 > Created Time: 2017/01/25
7 > Copyright (c) 2018, Chan-Ho Chris Ohk
8 *************************************************************************/
9 #ifndef CUBBYFLOW_ARRAY2_IMPL_H
10 #define CUBBYFLOW_ARRAY2_IMPL_H
11 
12 #include <algorithm>
13 #include <cassert>
14 
15 namespace CubbyFlow
16 {
17  template <typename T>
19  {
20  // Do nothing
21  }
22 
23  template <typename T>
24  Array<T, 2>::Array(const Size2& size, const T& initVal)
25  {
26  Resize(size, initVal);
27  }
28 
29  template <typename T>
30  Array<T, 2>::Array(size_t width, size_t height, const T& initVal)
31  {
32  Resize(width, height, initVal);
33  }
34 
35  template <typename T>
36  Array<T, 2>::Array(const std::initializer_list<std::initializer_list<T>>& list)
37  {
38  Set(list);
39  }
40 
41  template <typename T>
42  Array<T, 2>::Array(const Array& other)
43  {
44  Set(other);
45  }
46 
47  template <typename T>
49  {
50  *this = std::move(other);
51  }
52 
53  template <typename T>
54  void Array<T, 2>::Set(const T& value)
55  {
56  for (auto& v : m_data)
57  {
58  v = value;
59  }
60  }
61 
62  template <typename T>
63  void Array<T, 2>::Set(const Array& other)
64  {
65  m_data.resize(other.m_data.size());
66  std::copy(other.m_data.begin(), other.m_data.end(), m_data.begin());
67  m_size = other.m_size;
68  }
69 
70  template <typename T>
71  void Array<T, 2>::Set(const std::initializer_list<std::initializer_list<T>>& list)
72  {
73  size_t height = list.size();
74  size_t width = (height > 0) ? list.begin()->size() : 0;
75 
76  Resize(Size2(width, height));
77 
78  auto rowIter = list.begin();
79  for (size_t j = 0; j < height; ++j)
80  {
81  assert(width == rowIter->size());
82 
83  auto colIter = rowIter->begin();
84  for (size_t i = 0; i < width; ++i)
85  {
86  (*this)(i, j) = *colIter;
87  ++colIter;
88  }
89 
90  ++rowIter;
91  }
92  }
93 
94  template <typename T>
96  {
97  m_data.clear();
98  m_size = Size2(0, 0);
99  }
100 
101  template <typename T>
102  void Array<T, 2>::Resize(const Size2& size, const T& initVal)
103  {
104  Array grid;
105  grid.m_data.resize(size.x * size.y, initVal);
106  grid.m_size = size;
107 
108  size_t iMin = std::min(size.x, m_size.x);
109  size_t jMin = std::min(size.y, m_size.y);
110  for (size_t j = 0; j < jMin; ++j)
111  {
112  for (size_t i = 0; i < iMin; ++i)
113  {
114  grid(i, j) = At(i, j);
115  }
116  }
117 
118  Swap(grid);
119  }
120 
121  template <typename T>
122  void Array<T, 2>::Resize(size_t width, size_t height, const T& initVal)
123  {
124  Resize(Size2(width, height), initVal);
125  }
126 
127  template <typename T>
128  T& Array<T, 2>::At(size_t i)
129  {
130  assert(i < Width() * Height());
131  return m_data[i];
132  }
133 
134  template <typename T>
135  const T& Array<T, 2>::At(size_t i) const
136  {
137  assert(i < Width() * Height());
138  return m_data[i];
139  }
140 
141  template <typename T>
142  T& Array<T, 2>::At(const Point2UI& pt)
143  {
144  return At(pt.x, pt.y);
145  }
146 
147  template <typename T>
148  const T& Array<T, 2>::At(const Point2UI& pt) const
149  {
150  return At(pt.x, pt.y);
151  }
152 
153  template <typename T>
154  T& Array<T, 2>::At(size_t i, size_t j)
155  {
156  assert(i < Width() && j < Height());
157  return m_data[i + Width() * j];
158  }
159 
160  template <typename T>
161  const T& Array<T, 2>::At(size_t i, size_t j) const
162  {
163  assert(i < Width() && j < Height());
164  return m_data[i + Width() * j];
165  }
166 
167  template <typename T>
169  {
170  return m_size;
171  }
172 
173  template <typename T>
174  size_t Array<T, 2>::Width() const
175  {
176  return m_size.x;
177  }
178 
179  template <typename T>
180  size_t Array<T, 2>::Height() const
181  {
182  return m_size.y;
183  }
184 
185  template <typename T>
187  {
188  return m_data.data();
189  }
190 
191  template <typename T>
192  const T* Array<T, 2>::data() const
193  {
194  return m_data.data();
195  }
196 
197  template <typename T>
199  {
200  return m_data.begin();
201  }
202 
203  template <typename T>
205  {
206  return m_data.cbegin();
207  }
208 
209  template <typename T>
211  {
212  return m_data.end();
213  }
214 
215  template <typename T>
217  {
218  return m_data.cend();
219  }
220 
221  template <typename T>
223  {
224  return ArrayAccessor2<T>(size(), data());
225  }
226 
227  template <typename T>
229  {
230  return ConstArrayAccessor2<T>(size(), data());
231  }
232 
233  template <typename T>
235  {
236  std::swap(other.m_data, m_data);
237  std::swap(other.m_size, m_size);
238  }
239 
240  template <typename T>
241  template <typename Callback>
242  void Array<T, 2>::ForEach(Callback func) const
243  {
244  ConstAccessor().ForEach(func);
245  }
246 
247  template <typename T>
248  template <typename Callback>
249  void Array<T, 2>::ForEachIndex(Callback func) const
250  {
251  ConstAccessor().ForEachIndex(func);
252  }
253 
254  template <typename T>
255  template <typename Callback>
256  void Array<T, 2>::ParallelForEach(Callback func)
257  {
258  Accessor().ParallelForEach(func);
259  }
260 
261  template <typename T>
262  template <typename Callback>
263  void Array<T, 2>::ParallelForEachIndex(Callback func) const
264  {
265  ConstAccessor().ParallelForEachIndex(func);
266  }
267 
268  template <typename T>
270  {
271  return m_data[i];
272  }
273 
274  template <typename T>
275  const T& Array<T, 2>::operator[](size_t i) const
276  {
277  return m_data[i];
278  }
279 
280  template <typename T>
281  T& Array<T, 2>::operator()(size_t i, size_t j)
282  {
283  assert(i < Width() && j < Height());
284  return m_data[i + Width() * j];
285  }
286 
287  template <typename T>
288  const T& Array<T, 2>::operator()(size_t i, size_t j) const
289  {
290  assert(i < Width() && j < Height());
291  return m_data[i + Width() * j];
292  }
293 
294  template <typename T>
296  {
297  assert(pt.x < Width() && pt.y < Height());
298  return m_data[pt.x + Width() * pt.y];
299  }
300 
301  template <typename T>
302  const T& Array<T, 2>::operator()(const Point2UI &pt) const
303  {
304  assert(pt.x < Width() && pt.y < Height());
305  return m_data[pt.x + Width() * pt.y];
306  }
307 
308  template <typename T>
310  {
311  Set(value);
312  return *this;
313  }
314 
315  template <typename T>
317  {
318  Set(other);
319  return *this;
320  }
321 
322  template <typename T>
324  {
325  m_data = std::move(other.m_data);
326  m_size = other.m_size;
327  other.m_size = Size2();
328  return *this;
329  }
330 
331  template <typename T>
332  Array<T, 2>& Array<T, 2>::operator=(const std::initializer_list<std::initializer_list<T>>& list)
333  {
334  Set(list);
335  return *this;
336  }
337 
338  template <typename T>
340  {
341  return Accessor();
342  }
343 
344  template <typename T>
346  {
347  return ConstAccessor();
348  }
349 }
350 
351 #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
Definition: pybind11Utils.h:24
Generic N-dimensional array class interface.
Definition: Array.h:28
const T & At(const Point2UI &pt) const
Returns the const reference to the element at (pt.x, pt.y).
Definition: Array2-Impl.h:148
2-D array class.
Definition: Array2.h:42