22namespace sequoia::utilities
26 template<
class T,
class InitType,
class Fn>
27 requires std::is_invocable_r_v<T, Fn, InitType>
29 constexpr T to_element(std::initializer_list<InitType> l,
const std::size_t i, Fn fn)
31 if constexpr(std::is_default_constructible_v<InitType>)
33 return fn((i < l.size()) ? *(l.begin() + i) : InitType{});
38 throw std::logic_error(
"Insuffucient arguments to initialize an array of objects which cannot be default constructed.");
40 return fn(*(l.begin() + i));
44 template<
class T, std::size_t N,
class InitType, std::size_t... I,
class Fn>
45 requires std::is_invocable_r_v<T, Fn, InitType>
47 constexpr std::array<T, N> to_array([[maybe_unused]] std::initializer_list<InitType> l, [[maybe_unused]] std::index_sequence<I...>, Fn&& fn)
49 return std::array<T, N>{ to_element<T>(l, I, std::forward<Fn>(fn))...};
53 template<
class T, std::
size_t N,
class InitType=T,
class Fn=std::
identity>
54 requires std::is_invocable_r_v<T, Fn, InitType>
56 constexpr std::array<T, N> to_array(std::initializer_list<InitType> l, Fn fn = Fn{})
59 throw std::out_of_range{std::string{
"initializer_list of size "}.append(std::to_string(l.size())).append(
" too big for array: expected at most ")
60 .append(std::to_string(N)).append(
" elements")};
62 return impl::to_array<T, N>(l, std::make_index_sequence<N>{}, fn);
68 template<
class T, std::
size_t N,
class Fn>
69 requires std::is_invocable_r_v<T, Fn, std::size_t>
72 return [&] <std::size_t... Is>(std::index_sequence<Is...>){
73 return std::array<T, N>{f(Is)...};
74 }(std::make_index_sequence<N>{});
80 template<
class T, std::
size_t N,
class Fn = std::
identity>
81 requires std::is_invocable_r_v<T, Fn, T>
83 constexpr std::array<T, N> to_array(std::span<const T, N> data, Fn f = {})
85 return [&] <std::size_t... Is> (std::index_sequence<Is...>){
86 return std::array<T, N>{f(data[Is])...};
87 }(std::make_index_sequence<N>{});
constexpr std::array< T, N > make_array(Fn f)
Definition: ArrayUtilities.hpp:71