10 #include <AH/STL/algorithm>
12 #if __cplusplus >= 201400L
13 #define USE_CONSTEXPR_ARRAY_HELPERS constexpr
15 #define USE_CONSTEXPR_ARRAY_HELPERS
31 template <
class T,
class V>
35 : value(start), increment(increment) {}
70 template <
class T,
size_t N,
class G>
73 std::generate(array.begin(), array.end(), generator);
90 template <
size_t N,
class G>
92 ->
Array<decltype(generator()), N> {
93 Array<decltype(generator()), N> array{{}};
94 std::generate(array.begin(), array.end(), generator);
111 template <
class T,
size_t N,
class U>
114 std::transform(std::begin(src), std::end(src), std::begin(dest),
115 [](
const U &src) {
return T(src); });
122 template <
class F,
class U,
size_t N>
125 Array<decltype(
F{}(U{})), N> dest{{}};
126 std::transform(std::begin(src), std::end(src), std::begin(dest), f);
130 #if !defined(__GNUC__) || (__GNUC__ > 7) || \
131 (__GNUC__ == 7 && __GNUC_MINOR__ >= 3) || defined(DOXYGEN)
135 template <
class T,
size_t N,
class... Args>
137 return generateArray<N>([&]() {
return T{args...}; });
140 template <
class T,
size_t N,
class... Args>
142 Array<T, N> array{{}};
143 for (
auto &el : array)
181 template <
class T,
size_t N,
class U,
class V = U>
185 return generateArray<T, N>(g);
203 template <
class T,
size_t M,
size_t N>
208 for (
size_t i = 0; i < M; ++i, ++r)
210 for (
size_t i = 0; i < N; ++i, ++r)
215 template <
class T1,
class T2,
size_t N1,
size_t N2,
bool Reverse1,
216 bool Reverse2,
bool Const1,
bool Const2>
220 Array<decltype(T1() * T2()), N1 + N2 - 1> result = {{}};
221 for (
size_t i = 0; i < N1; ++i)
222 for (
size_t j = 0; j < N2; ++j)
223 result[i + j] += a[i] * b[j];
227 template <
class T1,
class T2,
size_t N1,
size_t N2,
bool Reverse1,
bool Const1>
234 template <
class T1,
class T2,
size_t N1,
size_t N2,
bool Reverse2,
bool Const2>
241 template <
class T1,
class T2,
size_t N1,
size_t N2>
255 template <
class T,
size_t N,
bool Reverse,
bool Const>
256 std::enable_if_t<std::is_arithmetic<T>::value, std::ostream &>
258 for (
const T &el : a.template slice<0, N - 2>())
264 template <
class T,
size_t N>
265 std::enable_if_t<std::is_arithmetic<T>::value, std::ostream &>
267 return os << a.
slice();
274 template <
class T,
size_t N,
bool Reverse,
bool Const>
275 std::enable_if_t<std::is_arithmetic<T>::value, Print &>
277 for (
const T &el : a.template slice<0, N - 2>())
283 template <
class T,
size_t N>
284 std::enable_if_t<std::is_arithmetic<T>::value, Print &>
286 return os << a.
slice();