Array1-Impl.h
Go to the documentation of this file.
1 /*************************************************************************
2 > File Name: Array1-Impl.h
3 > Project Name: CubbyFlow
4 > Author: Chan-Ho Chris Ohk
5 > Purpose: 1-D array class.
6 > Created Time: 2017/01/24
7 > Copyright (c) 2018, Chan-Ho Chris Ohk
8 *************************************************************************/
9 #ifndef CUBBYFLOW_ARRAY1_IMPL_H
10 #define CUBBYFLOW_ARRAY1_IMPL_H
11 
12 #include <cassert>
13 
14 namespace CubbyFlow
15 {
16  template <typename T>
18  {
19  // Do nothing
20  }
21 
22  template <typename T>
23  Array<T, 1>::Array(size_t size, const T& initVal)
24  {
25  Resize(size, initVal);
26  }
27 
28  template <typename T>
29  Array<T, 1>::Array(const std::initializer_list<T>& list)
30  {
31  Set(list);
32  }
33 
34  template <typename T>
35  Array<T, 1>::Array(const Array& other)
36  {
37  Set(other);
38  }
39 
40  template <typename T>
42  {
43  *this = std::move(other);
44  }
45 
46  template <typename T>
47  void Array<T, 1>::Set(const T& value)
48  {
49  for (auto& v : m_data)
50  {
51  v = value;
52  }
53  }
54 
55  template <typename T>
56  void Array<T, 1>::Set(const Array& other)
57  {
58  m_data.resize(other.m_data.size());
59  std::copy(other.m_data.begin(), other.m_data.end(), m_data.begin());
60  }
61 
62  template <typename T>
63  void Array<T, 1>::Set(const std::initializer_list<T>& list)
64  {
65  size_t size = list.size();
66  Resize(size);
67 
68  auto colIter = list.begin();
69  for (size_t i = 0; i < size; ++i)
70  {
71  (*this)[i] = *colIter;
72  ++colIter;
73  }
74  }
75 
76  template <typename T>
78  {
79  m_data.clear();
80  }
81 
82  template <typename T>
83  void Array<T, 1>::Resize(size_t size, const T& initVal)
84  {
85  m_data.resize(size, initVal);
86  }
87 
88  template <typename T>
89  T& Array<T, 1>::At(size_t i)
90  {
91  assert(i < size());
92  return m_data[i];
93  }
94 
95  template <typename T>
96  const T& Array<T, 1>::At(size_t i) const
97  {
98  assert(i < size());
99  return m_data[i];
100  }
101 
102  template <typename T>
103  size_t Array<T, 1>::size() const
104  {
105  return m_data.size();
106  }
107 
108  template <typename T>
110  {
111  return m_data.data();
112  }
113 
114  template <typename T>
115  const T* Array<T, 1>::data() const
116  {
117  return m_data.data();
118  }
119 
120  template <typename T>
122  {
123  return m_data.begin();
124  }
125 
126  template <typename T>
128  {
129  return m_data.cbegin();
130  }
131 
132  template <typename T>
134  {
135  return m_data.end();
136  }
137 
138  template <typename T>
140  {
141  return m_data.cend();
142  }
143 
144  template <typename T>
146  {
147  return ArrayAccessor1<T>(size(), data());
148  }
149 
150  template <typename T>
152  {
153  return ConstArrayAccessor1<T>(size(), data());
154  }
155 
156  template <typename T>
158  {
159  std::swap(other.m_data, m_data);
160  }
161 
162  template <typename T>
163  void Array<T, 1>::Append(const T& newVal)
164  {
165  m_data.push_back(newVal);
166  }
167 
168  template <typename T>
169  void Array<T, 1>::Append(const Array& other)
170  {
171  m_data.insert(m_data.end(), other.m_data.begin(), other.m_data.end());
172  }
173 
174  template <typename T>
175  template <typename Callback>
176  void Array<T, 1>::ForEach(Callback func) const
177  {
178  ConstAccessor().ForEach(func);
179  }
180 
181  template <typename T>
182  template <typename Callback>
183  void Array<T, 1>::ForEachIndex(Callback func) const
184  {
185  ConstAccessor().ForEachIndex(func);
186  }
187 
188  template <typename T>
189  template <typename Callback>
190  void Array<T, 1>::ParallelForEach(Callback func)
191  {
192  Accessor().ParallelForEach(func);
193  }
194 
195  template <typename T>
196  template <typename Callback>
197  void Array<T, 1>::ParallelForEachIndex(Callback func) const
198  {
199  ConstAccessor().ParallelForEachIndex(func);
200  }
201 
202  template <typename T>
204  {
205  return m_data[i];
206  }
207 
208  template <typename T>
209  const T& Array<T, 1>::operator[](size_t i) const
210  {
211  return m_data[i];
212  }
213 
214  template <typename T>
216  {
217  Set(value);
218  return *this;
219  }
220 
221  template <typename T>
223  {
224  Set(other);
225  return *this;
226  }
227 
228  template <typename T>
230  {
231  m_data = std::move(other.m_data);
232  return *this;
233  }
234 
235  template <typename T>
236  Array<T, 1>& Array<T, 1>::operator=(const std::initializer_list<T>& list)
237  {
238  Set(list);
239  return *this;
240  }
241 
242  template <typename T>
244  {
245  return Accessor();
246  }
247 
248  template <typename T>
250  {
251  return ConstAccessor();
252  }
253 }
254 
255 #endif
1-D read-only array accessor class.
Definition: ArrayAccessor1.h:185
1-D array class.
Definition: Array1.h:29
Definition: pybind11Utils.h:24
Generic N-dimensional array class interface.
Definition: Array.h:28
1-D array accessor class.
Definition: ArrayAccessor1.h:28