Loading...
Searching...
No Matches
Array-Impl.hpp
Go to the documentation of this file.
1// This code is based on Jet framework.
2// Copyright (c) 2018 Doyub Kim
3// CubbyFlow is voxel-based fluid simulation engine for computer games.
4// Copyright (c) 2020 CubbyFlow Team
5// Core Part: Chris Ohk, Junwoo Hwang, Jihong Sin, Seungwoo Yoo
6// AI Part: Dongheon Cho, Minseo Kim
7// We are making my contributions/submissions to this project solely in our
8// personal capacity and are not conveying any rights to any intellectual
9// property of any third parties.
10
11#ifndef CUBBYFLOW_ARRAY_IMPL_HPP
12#define CUBBYFLOW_ARRAY_IMPL_HPP
13
15
16namespace CubbyFlow
17{
18template <typename T, size_t N>
19class Array;
20
21namespace Internal
22{
23template <typename T, size_t N, size_t I>
25{
26 template <typename... Args>
27 static void Call(Vector<size_t, N>& size, T& value, size_t n, Args... args)
28 {
29 size[N - I - 1] = n;
30
32 }
33};
34
35template <typename T, size_t N>
37{
38 static void Call(Vector<size_t, N>& size, T& value, size_t n)
39 {
40 Call(size, value, n, T{});
41 }
42
43 static void Call(Vector<size_t, N>& size, T& value, size_t n,
44 const T& initVal)
45 {
46 size[N - 1] = n;
47 value = initVal;
48 }
49};
51template <typename T, size_t N, size_t I>
53{
54 static size_t Call(Vector<size_t, N>& size,
56 {
57 size[I - 1] = lst.size();
59 size_t i = 0;
60
61 for (auto subLst : lst)
62 {
63 if (i == 0)
64 {
66 }
67 else
68 {
70 [[maybe_unused]] size_t otherSize =
72
73 assert(otherSize == tempSizeN[I - 2]);
74 }
75
76 ++i;
77 }
78
79 return size[I - 1];
80 }
81};
83template <typename T, size_t N>
85{
86 static size_t Call(Vector<size_t, N>& size,
88 {
89 size[0] = lst.size();
91 return size[0];
92 }
93};
94
95template <typename T, size_t N, size_t I>
99 {
100 size_t i = 0;
101
102 for (auto subLst : lst)
103 {
104 assert(i < arr.Size()[I - 1]);
105
107
108 ++i;
109 }
110 }
111
112 template <typename... RemainingIndices>
115 {
116 size_t i = 0;
117
118 for (auto subLst : lst)
119 {
120 assert(i < arr.Size()[I - 1]);
121
123 ++i;
124 }
125 }
126};
127
128template <typename T, size_t N>
130{
132 {
133 size_t i = 0;
134
135 for (auto val : lst)
136 {
137 assert(i < arr.Size()[0]);
138
139 arr(i) = val;
140 ++i;
141 }
142 }
143
144 template <typename... RemainingIndices>
147 {
148 size_t i = 0;
149
150 for (auto val : lst)
151 {
152 assert(i < arr.Size()[0]);
153
154 arr(i, indices...) = val;
155 ++i;
156 }
157 }
158};
159} // namespace Internal
160
161template <typename T, size_t N>
163{
164 // Do nothing
165}
166
167template <typename T, size_t N>
169{
170 m_data.resize(Product<size_t, N>(size_, 1), initVal);
171 Base::SetPtrAndSize(m_data.data(), size_);
172}
173
174template <typename T, size_t N>
175template <typename... Args>
177{
179 T initVal;
180
182 m_data.resize(Product<size_t, N>(size, 1), initVal);
183 Base::SetPtrAndSize(m_data.data(), size);
184}
185
186template <typename T, size_t N>
196
197template <typename T, size_t N>
198template <typename OtherDerived>
203
204template <typename T, size_t N>
205template <typename OtherDerived>
210
211template <typename T, size_t N>
213{
215}
216
217template <typename T, size_t N>
219{
220 *this = std::move(other);
221}
222
223template <typename T, size_t N>
225{
227
228 return *this;
229}
230
231template <typename T, size_t N>
233{
234 m_data = std::move(other.m_data);
235
236 Base::SetPtrAndSize(other.data(), other.Size());
237 other.SetPtrAndSize(nullptr, Vector<size_t, N>{});
238
239 return *this;
240}
241
242template <typename T, size_t N>
243template <typename OtherDerived>
250
251template <typename T, size_t N>
252template <typename OtherDerived>
260
261template <typename T, size_t N>
262template <typename D>
264{
265 Resize(other.Size());
267 [&](auto... idx) { this->At(idx...) = other(idx...); });
268}
269
270template <typename T, size_t N>
271template <typename D>
273{
274 Resize(other.Size());
276 [&](auto... idx) { this->At(idx...) = other(idx...); });
277}
278
279template <typename T, size_t N>
281{
282 std::fill(m_data.begin(), m_data.end(), val);
283}
284
285template <typename T, size_t N>
287{
289 Vector<size_t, N> minSize = Min(m_size, newArray.m_size);
290
292 [&](auto... idx) { newArray(idx...) = (*this)(idx...); });
293
294 *this = std::move(newArray);
295}
296
297template <typename T, size_t N>
298template <typename... Args>
308
309template <typename T, size_t N>
310template <size_t M>
311std::enable_if_t<(M == 1), void> Array<T, N>::Append(const T& val)
312{
313 m_data.push_back(val);
314
315 Base::SetPtrAndSize(m_data.data(), m_data.size());
316}
317
318template <typename T, size_t N>
319template <typename OtherDerived, size_t M>
320std::enable_if_t<(M == 1), void> Array<T, N>::Append(
322{
323 m_data.insert(m_data.end(), extra.begin(), extra.end());
324
325 Base::SetPtrAndSize(m_data.data(), m_data.size());
326}
327
328template <typename T, size_t N>
329template <typename OtherDerived, size_t M>
330std::enable_if_t<(M == 1), void> Array<T, N>::Append(
332{
333 m_data.insert(m_data.end(), extra.begin(), extra.end());
334
335 Base::SetPtrAndSize(m_data.data(), m_data.size());
336}
337
338template <typename T, size_t N>
340{
341 Base::ClearPtrAndSize();
342
343 m_data.clear();
344}
345
346template <typename T, size_t N>
348{
349 Base::SwapPtrAndSize(other);
350
351 std::swap(m_data, other.m_data);
352}
353
354template <typename T, size_t N>
356{
357 return ArrayView<T, N>(*this);
358}
359
360template <typename T, size_t N>
365} // namespace CubbyFlow
366
367#endif
void SetPtrAndSize(Pointer ptr, size_t ni, Args... args)
Definition ArrayBase-Impl.hpp:250
Definition Array.hpp:36
void CopyFrom(const ArrayBase< T, N, D > &other)
Definition Array-Impl.hpp:263
void Resize(Vector< size_t, N > size_, const T &initVal=T{})
Definition Array-Impl.hpp:286
ArrayView< T, N > View()
Definition Array-Impl.hpp:355
Array & operator=(const Array &other)
Definition Array-Impl.hpp:224
Array()
Definition Array-Impl.hpp:162
void Swap(Array &other)
Definition Array-Impl.hpp:347
void Fill(const T &val)
Definition Array-Impl.hpp:280
void Clear()
Definition Array-Impl.hpp:339
void CopyFrom(const MatrixExpression< T, R, C, E > &expression)
Copies from generic expression.
Definition MatrixDenseBase-Impl.hpp:21
ValueType Min() const
Definition MatrixExpression-Impl.hpp:99
Definition Matrix.hpp:30
Iterator begin()
Definition Matrix-Impl.hpp:272
Pointer data()
Definition Matrix-Impl.hpp:298
Iterator end()
Definition Matrix-Impl.hpp:285
Definition pybind11Utils.hpp:21
void ForEachIndex(const Vector< IndexType, N > &begin, const Vector< IndexType, N > &end, const Func &func)
Definition IterationUtils-Impl.hpp:51
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738
static void Call(Vector< size_t, N > &size, T &value, size_t n, const T &initVal)
Definition Array-Impl.hpp:43
static void Call(Vector< size_t, N > &size, T &value, size_t n)
Definition Array-Impl.hpp:38
Definition Array-Impl.hpp:25
static void Call(Vector< size_t, N > &size, T &value, size_t n, Args... args)
Definition Array-Impl.hpp:27
static size_t Call(Vector< size_t, N > &size, NestedInitializerListsT< T, 1 > lst)
Definition Array-Impl.hpp:86
Definition Array-Impl.hpp:53
static size_t Call(Vector< size_t, N > &size, NestedInitializerListsT< T, I > lst)
Definition Array-Impl.hpp:54
static void Call(Array< T, N > &arr, NestedInitializerListsT< T, 1 > lst, RemainingIndices... indices)
Definition Array-Impl.hpp:145
static void call(Array< T, N > &arr, NestedInitializerListsT< T, 1 > lst)
Definition Array-Impl.hpp:131
Definition Array-Impl.hpp:97
static void Call(Array< T, N > &arr, NestedInitializerListsT< T, I > lst, RemainingIndices... indices)
Definition Array-Impl.hpp:113
static void Call(Array< T, N > &arr, NestedInitializerListsT< T, I > lst)
Definition Array-Impl.hpp:98