cMHN 1.2
C++ library for learning MHNs with pRC
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 requires requires { Sizes<N, Ns...>::size(); }
18 class CommonArray<A, T, N, Ns...>
19 {
20 public:
21 static constexpr auto Allocation = A;
22 using Type = T;
23 using Sizes = pRC::Sizes<N, Ns...>;
24
25 static constexpr auto Dimension = Sizes::Dimension;
26
27 static constexpr auto size()
28 {
29 return Sizes::size();
30 }
31
32 static constexpr auto size(Index const dimension)
33 {
34 return Sizes::size(dimension);
35 }
36
37 static constexpr auto indexToSubscripts(Index const index)
38 requires IsConstructible<Subscripts<N, Ns...>, Index>
39 {
40 return Subscripts<N, Ns...>(index);
41 }
42
43 template<IsConvertible<Index>... Is>
44 requires IsConstructible<Subscripts<N, Ns...>, Index> &&
45 IsConstructible<Index, Subscripts<N, Ns...>> &&
46 (sizeof...(Is) == Dimension)
47 static constexpr auto subscriptsToIndex(Is const... subscripts)
48 {
49 return Index(Subscripts<N, Ns...>(subscripts...));
50 }
51
52 static constexpr auto subscriptsToIndex(
53 Subscripts<N, Ns...> const &subscripts)
54 requires IsConstructible<Index, Subscripts<N, Ns...>>
55 {
56 return Index(subscripts);
57 }
58
59 private:
60 static consteval auto flattenable()
61 {
62 return (sizeof(StackArray<StackArray<T, N>, Ns...>) ==
63 sizeof(StackArray<T, size()>) ||
64 size() == 0) &&
66 IsStandardLayout<StackArray<T, size()>> &&
67 offsetof(CommonArray, mData) == 0;
68 }
69
70 public:
71 ~CommonArray() = default;
72 constexpr CommonArray() = default;
73
74 constexpr CommonArray(CommonArray const &other)
75 {
76 *this = other;
77 }
78
81 {
82 operator= <Allocation, T>(other);
83 }
84
87 : mData(move(other.mData))
88 {
89 }
90
91 template<pRC::Allocation B, IsConvertible<T> R>
93 {
94 *this = other;
95 }
96
97 constexpr CommonArray &operator=(CommonArray const &rhs) &
98 {
99 return operator= <A, T>(rhs);
100 }
101
105 [this, &rhs](auto const i)
106 {
107 (*this)[i] = move(rhs[i]);
108 });
109 return *this;
110 }
111
112 constexpr CommonArray &
114 requires(Allocation == pRC::Allocation::Heap) {
115 mData = move(rhs.mData);
116 return *this;
117 }
118
119 template<pRC::Allocation B, IsConvertible<T> R>
120 constexpr auto &operator=(CommonArray<B, R, N, Ns...> const &rhs) &
121 {
123 [this, &rhs](auto const i)
124 {
125 (*this)[i] = rhs[i];
126 });
127 return *this;
128 }
129
130 template<IsConvertible<Index>... Is>
131 requires(sizeof...(Is) == sizeof...(Ns))
132 constexpr decltype(auto) operator()(Index const subscript,
133 Is const... subscripts) &&
134 {
135 return move(mData)(subscripts...)[subscript];
136 }
137
138 template<IsConvertible<Index>... Is>
139 requires(sizeof...(Is) == sizeof...(Ns))
140 constexpr decltype(auto) operator()(Index const subscript,
141 Is const... subscripts) const &&
142 {
143 return move(mData)(subscripts...)[subscript];
144 }
145
146 template<IsConvertible<Index>... Is>
147 requires(sizeof...(Is) == sizeof...(Ns))
148 constexpr decltype(auto) operator()(Index const subscript,
149 Is const... subscripts) &
150 {
151 return mData(subscripts...)[subscript];
152 }
153
154 template<IsConvertible<Index>... Is>
155 requires(sizeof...(Is) == sizeof...(Ns))
156 constexpr decltype(auto) operator()(Index const subscript,
157 Is const... subscripts) const &
158 {
159 return mData(subscripts...)[subscript];
160 }
161
162 constexpr decltype(auto) operator()(
163 Subscripts<N, Ns...> const &subscripts) &&
164 {
165 return expand(
167 [this](auto const &subscripts,
168 auto const... seq) -> decltype(auto)
169 {
170 return move(*this)(subscripts[seq]...);
171 },
172 subscripts);
173 }
174
175 constexpr decltype(auto) operator()(
176 Subscripts<N, Ns...> const &subscripts) const &&
177 {
178 return expand(
180 [this](auto const &subscripts,
181 auto const... seq) -> decltype(auto)
182 {
183 return move(*this)(subscripts[seq]...);
184 },
185 subscripts);
186 }
187
188 constexpr decltype(auto) operator()(
189 Subscripts<N, Ns...> const &subscripts) &
190 {
191 return expand(
193 [this](auto const &subscripts,
194 auto const... seq) -> decltype(auto)
195 {
196 return this->operator()(subscripts[seq]...);
197 },
198 subscripts);
199 }
200
201 constexpr decltype(auto) operator()(
202 Subscripts<N, Ns...> const &subscripts) const &
203 {
204 return expand(
206 [this](auto const &subscripts,
207 auto const... seq) -> decltype(auto)
208 {
209 return this->operator()(subscripts[seq]...);
210 },
211 subscripts);
212 }
213
214 constexpr decltype(auto) operator[](Index const index) &&
215 requires(flattenable())
216 {
217 return move(
218 *reinterpret_cast<StackArray<T, size()> *>(data()))[index];
219 }
220
221 constexpr decltype(auto) operator[](Index const index) const &&
222 requires(flattenable())
223 {
224 return move(*reinterpret_cast<StackArray<T, size()> const *>(
225 data()))[index];
226 }
227
228 constexpr decltype(auto) operator[](Index const index) &
229 requires(flattenable())
230 {
231 return (*reinterpret_cast<StackArray<T, size()> *>(data()))[index];
232 }
233
234 constexpr decltype(auto) operator[](Index const index) const &
235 requires(flattenable())
236 {
237 return (*reinterpret_cast<StackArray<T, size()> const *>(
238 data()))[index];
239 }
240
241 constexpr auto data() && = delete;
242 constexpr auto data() const && = delete;
243
244 constexpr auto data() &
245 {
246 return mData.data();
247 }
248
249 constexpr auto data() const &
250 {
251 return mData.data();
252 }
253
254 private:
255 BEGIN_IGNORE_DIAGNOSTIC_GCC("-Wpedantic")
256 CommonArray<A, StackArray<T, N>, Ns...> mData;
258 };
259
260 template<class T>
261 concept IsArray = !IsReference<T> && requires {
262 {
263 []<Allocation A, class U, Size... Ns>(
264 CommonArray<A, U, Ns...> const &&)
265 {
266 }(std::declval<T>())
267 };
268 };
269}
270#endif // pRC_CORE_CONTAINER_ARRAY_H
constexpr CommonArray(StackArray< T, N, Ns... > &&other)
Definition array.hpp:79
constexpr CommonArray(CommonArray const &other)
Definition array.hpp:74
constexpr decltype(auto) operator()(Index const subscript, Is const ... subscripts) const &&
Definition array.hpp:140
constexpr CommonArray & operator=(CommonArray &&rhs) &
Definition array.hpp:102
constexpr decltype(auto) operator()(Index const subscript, Is const ... subscripts) &
Definition array.hpp:148
static constexpr auto subscriptsToIndex(Is const ... subscripts)
Definition array.hpp:47
static constexpr auto size()
Definition array.hpp:27
constexpr CommonArray(HeapArray< T, N, Ns... > &&other)
Definition array.hpp:85
static constexpr auto subscriptsToIndex(Subscripts< N, Ns... > const &subscripts)
Definition array.hpp:52
constexpr auto data() const &&=delete
constexpr auto & operator=(CommonArray< B, R, N, Ns... > const &rhs) &
Definition array.hpp:120
constexpr CommonArray & operator=(CommonArray const &rhs) &
Definition array.hpp:97
constexpr decltype(auto) operator()(Index const subscript, Is const ... subscripts) &&
Definition array.hpp:132
static constexpr auto indexToSubscripts(Index const index)
Definition array.hpp:37
constexpr decltype(auto) operator()(Index const subscript, Is const ... subscripts) const &
Definition array.hpp:156
constexpr CommonArray & operator=(CommonArray &&rhs) &
Definition array.hpp:113
constexpr auto data() &&=delete
constexpr auto data() const &
Definition array.hpp:249
static constexpr auto size(Index const dimension)
Definition array.hpp:32
constexpr CommonArray(CommonArray< B, R, N, Ns... > const &other)
Definition array.hpp:92
Definition declarations.hpp:12
Definition value.hpp:12
Definition sequence.hpp:29
static constexpr Size Dimension
Definition sequence.hpp:47
static constexpr auto size()
Definition sequence.hpp:69
Definition subscripts.hpp:21
Definition array.hpp:261
Definition concepts.hpp:37
Definition concepts.hpp:19
Definition concepts.hpp:52
pRC::Float<> T
Definition externs_nonTT.hpp:1
int i
Definition gmock-matchers-comparisons_test.cc:603
Definition cholesky.hpp:10
Size Index
Definition basics.hpp:32
std::size_t Size
Definition basics.hpp:31
static constexpr auto makeSeries()
Definition sequence.hpp:390
CommonArray(T const (&)[N]) -> CommonArray< Allocation::Stack, T, N >
static constexpr auto range(F &&f, Xs &&...args)
Definition range.hpp:18
Allocation
Definition allocation.hpp:18
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
Definition sequence.hpp:383
#define BEGIN_IGNORE_DIAGNOSTIC_GCC(warning)
Definition pragma.hpp:42
#define END_IGNORE_DIAGNOSTIC_GCC
Definition pragma.hpp:43