From 156f5e5359baf1a7f2c8584602a3af441af480e9 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Thu, 5 Dec 2024 10:18:50 +0800 Subject: [PATCH] when_all: add Sentinel support to when_all_succeed() Extend `when_all_succeed()` to accept ranges with heterogeneous iterator and sentinel types by adding a separate template parameter for the sentinel. Signed-off-by: Kefu Chai --- include/seastar/core/when_all.hh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/seastar/core/when_all.hh b/include/seastar/core/when_all.hh index dcaf5fb902d..c6caf60b96e 100644 --- a/include/seastar/core/when_all.hh +++ b/include/seastar/core/when_all.hh @@ -286,9 +286,9 @@ complete_when_all(std::vector&& futures, typename std::vector::i }); } -template +template inline auto -do_when_all(FutureIterator begin, FutureIterator end) noexcept { +do_when_all(FutureIterator begin, Sentinel end) noexcept { using itraits = std::iterator_traits; auto make_values_vector = [] (size_t size) noexcept { memory::scoped_critical_alloc_section _; @@ -300,7 +300,7 @@ do_when_all(FutureIterator begin, FutureIterator end) noexcept { make_values_vector(iterator_range_estimate_vector_capacity(begin, end)); // Important to invoke the *begin here, in case it's a function iterator, // so we launch all computation in parallel. - std::move(begin, end, std::back_inserter(ret)); + std::ranges::move(begin, end, std::back_inserter(ret)); return complete_when_all(std::move(ret), ret.begin()); } @@ -508,14 +508,14 @@ inline auto when_all_succeed(FutOrFuncs&&... fut_or_funcs) noexcept { /// \param end an \c InputIterator designating the end of the range of futures /// \return an \c std::vector<> of all the valus in the input SEASTAR_MODULE_EXPORT -template ::value_type> +template ::value_type> requires requires (FutureIterator i) { *i++; { i != i } -> std::convertible_to; requires is_future>::value; } inline auto -when_all_succeed(FutureIterator begin, FutureIterator end) noexcept { +when_all_succeed(FutureIterator begin, Sentinel end) noexcept { using itraits = std::iterator_traits; using result_transform = internal::extract_values_from_futures_vector; try {