39 [[maybe_unused]]
auto fill_fn = [&] {
42 const size_t total_size = (
ranges.size() + ... + 0);
43 result.reserve(total_size);
46 return [&result](
auto&& range) {
48 std::ranges::begin(range), std::ranges::end(range), std::back_inserter(
unwrap_strong_type(result)));
54 [[maybe_unused]]
constexpr size_t total_size = (
decltype(std::span{
ranges})::extent + ... + 0);
55 static_assert(result.size() == total_size,
"size of result buffer does not match the sum of input buffers");
58 const size_t total_size = (
ranges.size() + ... + 0);
60 "result buffer has static extent that does not match the sum of input buffers");
64 return [itr = std::ranges::begin(result)](
auto&& range)
mutable {
65 std::copy(std::ranges::begin(range), std::ranges::end(range), itr);
66 std::advance(itr, std::ranges::size(range));
72 (fill_fn(std::forward<Rs>(
ranges)), ...);
91 requires(all_same_v<std::ranges::range_value_t<Rs>...>)
93 if constexpr(std::same_as<detail::AutoDetect, OutR>) {
95 static_assert(
sizeof...(Rs) > 0,
"Cannot auto-detect the output type if not a single input range is provided.");
96 using candidate_result_t = std::remove_cvref_t<std::tuple_element_t<0, std::tuple<Rs...>>>;
97 using result_range_value_t = std::remove_cvref_t<std::ranges::range_value_t<candidate_result_t>>;
102 constexpr size_t total_size = (
decltype(std::span{
ranges})::extent + ... + 0);
103 using out_array_t = std::array<result_range_value_t, total_size>;
110 "First input range has static extent, but a dynamically allocated output range is required. Please explicitly specify a dynamically allocatable output type.");