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();