pRC
multi-purpose Tensor Train library for C++
Loading...
Searching...
No Matches
array.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_CONTAINER_ARRAY_H
4#define pRC_CORE_CONTAINER_ARRAY_H
5
13
14namespace pRC
15{
16 template<Allocation A, class T, Size N, Size... Ns>
17 class CommonArray<A, T, N, Ns...>
18 {
19 static_assert((Ns * ... * N) <= NumericLimits<Size>::max() &&
21
22 public:
24 using Type = T;
25 using Sizes = pRC::Sizes<N, Ns...>;
26 using Dimension = typename Sizes::Dimension;
27
28 template<class E = typename Sizes::IsLinearizable, If<E> = 0>
29 static constexpr auto size()
30 {
31 return Sizes::size();
32 }
33
34 static constexpr auto size(Index const dimension)
35 {
36 return Sizes::size(dimension);
37 }
38
39 template<class E = IsConstructible<Subscripts<N, Ns...>, Index>,
40 If<E> = 0>
41 static constexpr auto indexToSubscripts(Index const index)
42 {
43 return Subscripts<N, Ns...>(index);
44 }
45
46 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
47 If<IsSatisfied<(sizeof...(Is) == Dimension())>> = 0,
50 If<E> = 0>
51 static constexpr auto subscriptsToIndex(Is const... subscripts)
52 {
54 }
55
56 template<class E = IsConstructible<Index, Subscripts<N, Ns...>>,
57 If<E> = 0>
58 static constexpr auto subscriptsToIndex(
60 {
61 return Index(subscripts);
62 }
63
64 public:
65 ~CommonArray() = default;
66 constexpr CommonArray() = default;
67
68 constexpr CommonArray(CommonArray const &other)
69 {
70 *this = other;
71 }
72
73 template<pRC::Allocation B = Allocation(),
76 {
77 operator=<Allocation{}, T>(other);
78 }
79
80 template<pRC::Allocation B = Allocation(),
83 : mData(move(other.mData))
84 {
85 }
86
87 template<pRC::Allocation B, class R, If<IsConvertible<R, T>> = 0>
89 {
90 *this = other;
91 }
92
93 constexpr CommonArray &operator=(CommonArray const &rhs) &
94 {
95 return operator=<A, T>(rhs);
96 }
97
99 {
100 if constexpr(Allocation() == pRC::Allocation::Stack)
101 {
103 [this, &rhs](auto const i)
104 {
105 (*this)[i] = move(rhs[i]);
106 });
107 }
108 else
109 {
110 mData = move(rhs.mData);
111 }
112 return *this;
113 }
114
115 template<pRC::Allocation B, class R, If<IsConvertible<R, T>> = 0>
116 constexpr auto &operator=(CommonArray<B, R, N, Ns...> const &rhs) &
117 {
119 [this, &rhs](auto const i)
120 {
121 (*this)[i] = rhs[i];
122 });
123 return *this;
124 }
125
126 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
127 If<IsSatisfied<(sizeof...(Is) == sizeof...(Ns))>> = 0>
128 constexpr decltype(auto) operator()(Index const subscript,
129 Is const... subscripts) &&
130 {
131 return move(mData)(subscripts...)[subscript];
132 }
133
134 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
135 If<IsSatisfied<(sizeof...(Is) == sizeof...(Ns))>> = 0>
136 constexpr decltype(auto) operator()(Index const subscript,
137 Is const... subscripts) const &&
138 {
139 return move(mData)(subscripts...)[subscript];
140 }
141
142 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
143 If<IsSatisfied<(sizeof...(Is) == sizeof...(Ns))>> = 0>
144 constexpr decltype(auto) operator()(Index const subscript,
145 Is const... subscripts) &
146 {
147 return mData(subscripts...)[subscript];
148 }
149
150 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
151 If<IsSatisfied<(sizeof...(Is) == sizeof...(Ns))>> = 0>
152 constexpr decltype(auto) operator()(Index const subscript,
153 Is const... subscripts) const &
154 {
155 return mData(subscripts...)[subscript];
156 }
157
158 constexpr decltype(auto) operator()(
159 Subscripts<N, Ns...> const &subscripts) &&
160 {
161 return expand(
163 [this](auto const &subscripts,
164 auto const... seq) -> decltype(auto)
165 {
166 return move(*this)(subscripts[seq]...);
167 },
168 subscripts);
169 }
170
171 constexpr decltype(auto) operator()(
172 Subscripts<N, Ns...> const &subscripts) const &&
173 {
174 return expand(
176 [this](auto const &subscripts,
177 auto const... seq) -> decltype(auto)
178 {
179 return move(*this)(subscripts[seq]...);
180 },
181 subscripts);
182 }
183
184 constexpr decltype(auto) operator()(
185 Subscripts<N, Ns...> const &subscripts) &
186 {
187 return expand(
189 [this](auto const &subscripts,
190 auto const... seq) -> decltype(auto)
191 {
192 return this->operator()(subscripts[seq]...);
193 },
194 subscripts);
195 }
196
197 constexpr decltype(auto) operator()(
198 Subscripts<N, Ns...> const &subscripts) const &
199 {
200 return expand(
202 [this](auto const &subscripts,
203 auto const... seq) -> decltype(auto)
204 {
205 return this->operator()(subscripts[seq]...);
206 },
207 subscripts);
208 }
209
210 constexpr decltype(auto) operator[](Index const index) &&
211 {
212 checkFlattenable();
213 return move(
214 *reinterpret_cast<StackArray<T, size()> *>(data()))[index];
215 }
216
217 constexpr decltype(auto) operator[](Index const index) const &&
218 {
219 checkFlattenable();
220 return move(*reinterpret_cast<StackArray<T, size()> const *>(
221 data()))[index];
222 }
223
224 constexpr decltype(auto) operator[](Index const index) &
225 {
226 checkFlattenable();
227 return (*reinterpret_cast<StackArray<T, size()> *>(data()))[index];
228 }
229
230 constexpr decltype(auto) operator[](Index const index) const &
231 {
232 checkFlattenable();
233 return (*reinterpret_cast<StackArray<T, size()> const *>(
234 data()))[index];
235 }
236
237 constexpr auto data() && = delete;
238 constexpr auto data() const && = delete;
239
241 {
242 return mData.data();
243 }
244
245 constexpr auto data() const &
246 {
247 return mData.data();
248 }
249
250 private:
251 static constexpr auto checkFlattenable()
252 {
253 if constexpr((sizeof(StackArray<StackArray<T, N>, Ns...>) !=
254 sizeof(StackArray<T, size()>) &&
255 size() != 0) ||
257 !IsStandardLayout<StackArray<T, size()>>() ||
258 offsetof(CommonArray, mData) != 0)
259 {
260 static_assert(False<T>(),
261 "Unable to flatten multi-dimensional array. Must be some "
262 "weird underlying type.");
263 }
264 }
265
266 private:
267 BEGIN_IGNORE_DIAGNOSTIC_GCC("-Wpedantic")
268 CommonArray<A, StackArray<T, N>, Ns...> mData;
270 };
271}
272#endif // pRC_CORE_CONTAINER_ARRAY_H
constexpr decltype(auto) operator()(Index const subscript, Is const ... subscripts) &
Definition array.hpp:144
constexpr CommonArray(CommonArray const &other)
Definition array.hpp:68
constexpr auto & operator=(CommonArray< B, R, N, Ns... > const &rhs) &
Definition array.hpp:116
Constant< pRC::Allocation, A > Allocation
Definition array.hpp:23
static constexpr auto subscriptsToIndex(Subscripts< N, Ns... > const &subscripts)
Definition array.hpp:58
constexpr decltype(auto) operator()(Index const subscript, Is const ... subscripts) const &&
Definition array.hpp:136
static constexpr auto size()
Definition array.hpp:29
constexpr CommonArray(HeapArray< T, N, Ns... > &&other)
Definition array.hpp:82
constexpr CommonArray & operator=(CommonArray &&rhs) &
Definition array.hpp:98
constexpr auto data() const &&=delete
constexpr decltype(auto) operator()(Index const subscript, Is const ... subscripts) &&
Definition array.hpp:128
constexpr CommonArray & operator=(CommonArray const &rhs) &
Definition array.hpp:93
static constexpr auto subscriptsToIndex(Is const ... subscripts)
Definition array.hpp:51
typename Sizes::Dimension Dimension
Definition array.hpp:26
constexpr CommonArray(CommonArray< B, R, N, Ns... > const &other)
Definition array.hpp:88
T Type
Definition array.hpp:24
constexpr decltype(auto) operator()(Index const subscript, Is const ... subscripts) const &
Definition array.hpp:152
constexpr auto data() &&=delete
constexpr auto data() const &
Definition array.hpp:245
static constexpr auto size(Index const dimension)
Definition array.hpp:34
constexpr CommonArray(StackArray< T, N, Ns... > &&other)
Definition array.hpp:75
static constexpr auto indexToSubscripts(Index const index)
Definition array.hpp:41
Definition type_traits.hpp:49
Definition sequence.hpp:56
static constexpr auto size()
Definition sequence.hpp:88
Constant< Size, sizeof...(Ns)> Dimension
Definition sequence.hpp:74
Constant< Bool, linearizable()> IsLinearizable
Definition sequence.hpp:75
Definition subscripts.hpp:20
Definition cholesky.hpp:18
CommonArray< Allocation::Stack, T, Ns... > StackArray
Definition type_traits.hpp:52
std::conjunction< Bs... > All
Definition type_traits.hpp:77
std::is_constructible< T, Args... > IsConstructible
Definition type_traits.hpp:143
std::enable_if_t< B{}, int > If
Definition type_traits.hpp:68
std::size_t Size
Definition type_traits.hpp:20
std::integral_constant< T, V > Constant
Definition type_traits.hpp:34
std::is_standard_layout< T > IsStandardLayout
Definition type_traits.hpp:155
static constexpr auto makeSeries()
Definition sequence.hpp:361
Constant< Bool, B > IsSatisfied
Definition type_traits.hpp:71
static constexpr Conditional< IsSatisfied< C >, RemoveConstReference< X >, X > copy(X &&a)
Definition copy.hpp:13
Allocation
Definition allocation.hpp:19
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
forwards the values in a pRC::Sequence to a function as parameters
Definition sequence.hpp:354
Size Index
Definition type_traits.hpp:21
#define BEGIN_IGNORE_DIAGNOSTIC_GCC(warning)
Definition pragma.hpp:42
#define END_IGNORE_DIAGNOSTIC_GCC
Definition pragma.hpp:43
Definition limits.hpp:13