ArrayAccessor1-Impl.h
Go to the documentation of this file.
1 /*************************************************************************
2 > File Name: ArrayAccessor1-Impl.h
3 > Project Name: CubbyFlow
4 > Author: Chan-Ho Chris Ohk
5 > Purpose: 1-D array accessor class.
6 > Created Time: 2017/01/28
7 > Copyright (c) 2018, Chan-Ho Chris Ohk
8 *************************************************************************/
9 #ifndef CUBBYFLOW_ARRAY_ACCESSOR1_IMPL_H
10 #define CUBBYFLOW_ARRAY_ACCESSOR1_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_size(0), m_data(nullptr)
23  {
24  // Do nothing
25  }
26 
27  template <typename T>
28  ArrayAccessor<T, 1>::ArrayAccessor(size_t size, T* const data)
29  {
30  Reset(size, data);
31  }
32 
33  template <typename T>
35  {
36  Set(other);
37  }
38 
39  template <typename T>
41  {
42  Reset(other.m_size, other.m_data);
43  }
44 
45  template <typename T>
46  void ArrayAccessor<T, 1>::Reset(size_t size, T* const data)
47  {
48  m_size = size;
49  m_data = data;
50  }
51 
52  template <typename T>
54  {
55  assert(i < size());
56  return m_data[i];
57  }
58 
59  template <typename T>
60  const T& ArrayAccessor<T, 1>::At(size_t i) const
61  {
62  assert(i < size());
63  return m_data[i];
64  }
65 
66  template <typename T>
67  T* const ArrayAccessor<T, 1>::begin() const
68  {
69  return m_data;
70  }
71 
72  template <typename T>
73  T* const ArrayAccessor<T, 1>::end() const
74  {
75  return m_data + m_size;
76  }
77 
78  template <typename T>
80  {
81  return m_data;
82  }
83 
84  template <typename T>
86  {
87  return m_data + m_size;
88  }
89 
90  template <typename T>
92  {
93  return m_size;
94  }
95 
96  template <typename T>
97  T* const ArrayAccessor<T, 1>::data() const
98  {
99  return m_data;
100  }
101 
102  template <typename T>
104  {
105  std::swap(other.m_data, m_data);
106  std::swap(other.m_size, m_size);
107  }
108 
109  template <typename T>
110  template <typename Callback>
111  void ArrayAccessor<T, 1>::ForEach(Callback func) const
112  {
113  for (size_t i = 0; i < size(); ++i)
114  {
115  func(At(i));
116  }
117  }
118 
119  template <typename T>
120  template <typename Callback>
121  void ArrayAccessor<T, 1>::ForEachIndex(Callback func) const
122  {
123  for (size_t i = 0; i < size(); ++i)
124  {
125  func(i);
126  }
127  }
128 
129  template <typename T>
130  template <typename Callback>
132  {
133  ParallelFor(ZERO_SIZE, size(), [&](size_t i)
134  {
135  func(At(i));
136  });
137  }
138 
139  template <typename T>
140  template <typename Callback>
142  {
143  ParallelFor(ZERO_SIZE, size(), func);
144  }
145 
146  template <typename T>
148  {
149  return m_data[i];
150  }
151 
152  template <typename T>
153  const T& ArrayAccessor<T, 1>::operator[](size_t i) const
154  {
155  return m_data[i];
156  }
157 
158  template <typename T>
160  {
161  Set(other);
162  return *this;
163  }
164 
165  template <typename T>
167  {
168  return ConstArrayAccessor<T, 1>(*this);
169  }
170 
171  template <typename T>
173  m_size(0), m_data(nullptr)
174  {
175  // Do nothing
176  }
177 
178  template <typename T>
179  ConstArrayAccessor<T, 1>::ConstArrayAccessor(size_t size, const T* const data)
180  {
181  m_size = size;
182  m_data = data;
183  }
184 
185  template <typename T>
187  {
188  m_size = other.size();
189  m_data = other.data();
190  }
191 
192  template <typename T>
194  {
195  m_size = other.m_size;
196  m_data = other.m_data;
197  }
198 
199  template <typename T>
200  const T& ConstArrayAccessor<T, 1>::At(size_t i) const
201  {
202  assert(i < size());
203  return m_data[i];
204  }
205 
206  template <typename T>
207  const T* const ConstArrayAccessor<T, 1>::begin() const
208  {
209  return m_data;
210  }
211 
212  template <typename T>
213  const T* const ConstArrayAccessor<T, 1>::end() const
214  {
215  return m_data + m_size;
216  }
217 
218  template <typename T>
220  {
221  return m_size;
222  }
223 
224  template <typename T>
225  const T* const ConstArrayAccessor<T, 1>::data() const
226  {
227  return m_data;
228  }
229 
230  template <typename T>
231  template <typename Callback>
232  void ConstArrayAccessor<T, 1>::ForEach(Callback func) const
233  {
234  for (size_t i = 0; i < size(); ++i)
235  {
236  func(At(i));
237  }
238  }
239 
240  template <typename T>
241  template <typename Callback>
242  void ConstArrayAccessor<T, 1>::ForEachIndex(Callback func) const
243  {
244  for (size_t i = 0; i < size(); ++i)
245  {
246  func(i);
247  }
248  }
249 
250  template <typename T>
251  template <typename Callback>
253  {
254  ParallelFor(ZERO_SIZE, size(), func);
255  }
256 
257  template <typename T>
258  const T& ConstArrayAccessor<T, 1>::operator[](size_t i) const
259  {
260  return m_data[i];
261  }
262 }
263 
264 #endif
1-D read-only array accessor class.
Definition: ArrayAccessor1.h:185
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
constexpr size_t ZERO_SIZE
Zero size_t.
Definition: Constants.h:18
1-D array accessor class.
Definition: ArrayAccessor1.h:28
size_t size() const
Returns size of the array.
Definition: ArrayAccessor1-Impl.h:91
T *const data() const
Returns the raw pointer to the array data.
Definition: ArrayAccessor1-Impl.h:97