Loading...
Searching...
No Matches
ArrayBase-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_BASE_IMPL_HPP
12#define CUBBYFLOW_ARRAY_BASE_IMPL_HPP
13
14namespace CubbyFlow
15{
16template <typename T, size_t N, typename D>
17size_t ArrayBase<T, N, D>::Index(size_t i) const
18{
19 return i;
20}
21
22template <typename T, size_t N, typename D>
23template <typename... Args>
24size_t ArrayBase<T, N, D>::Index(size_t i, Args... args) const
25{
26 static_assert(sizeof...(args) == N - 1, "Invalid number of indices.");
27
28 return i + m_size[0] * IndexInternal(1, args...);
29}
30
31template <typename T, size_t N, typename D>
32template <size_t... I>
35 return IndexInternal(idx, std::make_index_sequence<N>{});
36}
38template <typename T, size_t N, typename D>
40{
41 return m_ptr;
42}
44template <typename T, size_t N, typename D>
47 return m_ptr;
48}
50template <typename T, size_t N, typename D>
53 return m_size;
55
56template <typename T, size_t N, typename D>
57template <size_t M>
58std::enable_if_t<(M > 0), size_t> ArrayBase<T, N, D>::Width() const
59{
60 return m_size.x;
61}
63template <typename T, size_t N, typename D>
64template <size_t M>
65std::enable_if_t<(M > 1), size_t> ArrayBase<T, N, D>::Height() const
67 return m_size.y;
69
70template <typename T, size_t N, typename D>
71template <size_t M>
72std::enable_if_t<(M > 2), size_t> ArrayBase<T, N, D>::Depth() const
73{
74 return m_size.z;
75}
77template <typename T, size_t N, typename D>
79{
80 return Length() == 0;
81}
82
83template <typename T, size_t N, typename D>
85{
86 return Product<size_t, N>(m_size, 1);
87}
89template <typename T, size_t N, typename D>
91{
92 return m_ptr;
93}
94
95template <typename T, size_t N, typename D>
97{
98 return m_ptr;
99}
101template <typename T, size_t N, typename D>
104 return m_ptr + Length();
105}
106
107template <typename T, size_t N, typename D>
110 return m_ptr + Length();
112
113template <typename T, size_t N, typename D>
115{
116 return end() - 1;
117}
119template <typename T, size_t N, typename D>
121{
122 return end() - 1;
123}
124
125template <typename T, size_t N, typename D>
127{
128 return begin() - 1;
129}
130
131template <typename T, size_t N, typename D>
133{
134 return begin() - 1;
135}
136
137template <typename T, size_t N, typename D>
139{
140 return m_ptr[i];
141}
142
143template <typename T, size_t N, typename D>
144const T& ArrayBase<T, N, D>::At(size_t i) const
145{
146 return m_ptr[i];
147}
148
149template <typename T, size_t N, typename D>
150template <typename... Args>
152{
153 return data()[Index(i, args...)];
154}
155
156template <typename T, size_t N, typename D>
157template <typename... Args>
158const T& ArrayBase<T, N, D>::At(size_t i, Args... args) const
159{
160 return m_ptr[Index(i, args...)];
161}
162
163template <typename T, size_t N, typename D>
165{
166 return data()[Index(idx)];
167}
168
169template <typename T, size_t N, typename D>
171{
172 return data()[Index(idx)];
173}
174
175template <typename T, size_t N, typename D>
177{
178 return At(i);
179}
180
181template <typename T, size_t N, typename D>
182const T& ArrayBase<T, N, D>::operator[](size_t i) const
183{
184 return At(i);
185}
186
187template <typename T, size_t N, typename D>
188template <typename... Args>
190{
191 return At(i, args...);
192}
193
194template <typename T, size_t N, typename D>
195template <typename... Args>
196const T& ArrayBase<T, N, D>::operator()(size_t i, Args... args) const
197{
198 return At(i, args...);
199}
200
201template <typename T, size_t N, typename D>
203{
204 return At(idx);
205}
206
207template <typename T, size_t N, typename D>
209{
210 return At(idx);
211}
212
213template <typename T, size_t N, typename D>
215{
216 // Do nothing
217}
218
219template <typename T, size_t N, typename D>
221{
222 SetPtrAndSize(other.m_ptr, other.m_size);
223}
224
225template <typename T, size_t N, typename D>
227{
228 *this = std::move(other);
229}
230
231template <typename T, size_t N, typename D>
233{
234 SetPtrAndSize(other.data(), other.Size());
235
236 return *this;
237}
238
239template <typename T, size_t N, typename D>
241{
242 SetPtrAndSize(other.data(), other.Size());
243 other.SetPtrAndSize(nullptr, Vector<size_t, N>{});
244
245 return *this;
246}
247
248template <typename T, size_t N, typename D>
249template <typename... Args>
251{
252 SetPtrAndSize(ptr, Vector<size_t, N>{ ni, args... });
253}
254
255template <typename T, size_t N, typename D>
257{
258 m_ptr = data;
259 m_size = size;
260}
261
262template <typename T, size_t N, typename D>
264{
265 SetPtrAndSize(nullptr, Vector<size_t, N>{});
266}
267
268template <typename T, size_t N, typename D>
270{
271 std::swap(m_ptr, other.m_ptr);
272 std::swap(m_size, other.m_size);
273}
274
275template <typename T, size_t N, typename D>
276template <typename... Args>
277size_t ArrayBase<T, N, D>::IndexInternal(size_t d, size_t i, Args... args) const
278{
279 return i + m_size[d] * IndexInternal(d + 1, args...);
280}
281
282template <typename T, size_t N, typename D>
283size_t ArrayBase<T, N, D>::IndexInternal(size_t, size_t i) const
284{
285 return i;
286}
287
288template <typename T, size_t N, typename D>
289template <size_t... I>
290size_t ArrayBase<T, N, D>::IndexInternal(const Vector<size_t, N>& idx,
291 std::index_sequence<I...>) const
292{
293 return Index(idx[I]...);
294}
295} // namespace CubbyFlow
296
297#endif
Definition ArrayBase.hpp:20
Pointer data()
Definition ArrayBase-Impl.hpp:39
bool IsEmpty() const
Definition ArrayBase-Impl.hpp:78
ArrayBase()
Definition ArrayBase-Impl.hpp:214
void ClearPtrAndSize()
Definition ArrayBase-Impl.hpp:263
Reference operator[](size_t i)
Definition ArrayBase-Impl.hpp:176
Iterator begin()
Definition ArrayBase-Impl.hpp:90
void SetPtrAndSize(Pointer ptr, size_t ni, Args... args)
Definition ArrayBase-Impl.hpp:250
Reference operator()(size_t i, Args... args)
size_t Length() const
Definition ArrayBase-Impl.hpp:84
Iterator rend()
Definition ArrayBase-Impl.hpp:126
void SwapPtrAndSize(ArrayBase &other)
Definition ArrayBase-Impl.hpp:269
Iterator end()
Definition ArrayBase-Impl.hpp:102
const Vector< size_t, N > & Size() const
Definition ArrayBase-Impl.hpp:51
Reference At(size_t i)
Definition ArrayBase-Impl.hpp:138
size_t Index(size_t i) const
Definition ArrayBase-Impl.hpp:17
Iterator rbegin()
Definition ArrayBase-Impl.hpp:114
ArrayBase & operator=(const ArrayBase &other)
Definition ArrayBase-Impl.hpp:232
ValueType Length() const
Definition MatrixExpression-Impl.hpp:278
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
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738