Skip to content

Commit 7f6f034

Browse files
committed
fixed how when_all determines its error completions
1 parent eec4266 commit 7f6f034

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

examples/sender-demo.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,18 @@ static_assert(ex::sender<just_sender<std::pmr::string>>);
4646
static_assert(ex::sender_in<just_sender<std::pmr::string>>);
4747

4848
int main() {
49-
auto j = just_sender{std::pmr::string("value")};
50-
auto t = std::move(j) | ex::then([](std::pmr::string v) { return v + " then"; });
51-
auto w = ex::when_all(std::move(t));
52-
auto t2 = std::move(w) | ex::then([](auto&& v) { std::cout << "got " << v << "\n"; });
53-
auto e = ex::detail::write_env(std::move(t2),
49+
auto j = just_sender{std::pmr::string("value")};
50+
auto t = std::move(j) | ex::then([](std::pmr::string v) { return v + " then"; });
51+
auto w = ex::when_all(std::move(t));
52+
auto e = ex::detail::write_env(std::move(w),
5453
ex::detail::make_env(ex::get_allocator, std::pmr::polymorphic_allocator<>()));
5554

56-
auto o = ex::connect(std::move(e), test_receiver{});
5755
std::cout << "before start\n";
58-
ex::start(o);
59-
// auto r = ex::sync_wait(std::move(w) | ex::then([](auto&&){}));
56+
auto r = ex::sync_wait(std::move(e));
57+
if (r) {
58+
auto [v] = *r;
59+
std::cout << "produced='" << v << "'\n";
60+
} else
61+
std::cout << "operation was cancelled\n";
6062
std::cout << "after start\n";
6163
}

include/beman/execution26/detail/when_all.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,13 +231,15 @@ template <typename Data, typename Env, typename... Sender>
231231
struct completion_signatures_for_impl<
232232
::beman::execution26::detail::basic_sender<::beman::execution26::detail::when_all_t, Data, Sender...>,
233233
Env> {
234+
template <typename... E>
235+
using error_comps = ::beman::execution26::completion_signatures<::beman::execution26::set_error_t(E)...>;
234236
using value_types =
235237
typename ::beman::execution26::detail::when_all_value_types<::beman::execution26::detail::meta::combine<
236238
::beman::execution26::
237239
value_types_of_t<Sender, Env, ::beman::execution26::detail::type_list, ::std::type_identity_t>...>>::
238240
type;
239241
using error_types = ::beman::execution26::detail::meta::unique<::beman::execution26::detail::meta::combine<
240-
::beman::execution26::error_types_of_t<Sender, Env, ::beman::execution26::completion_signatures>...>>;
242+
::beman::execution26::error_types_of_t<Sender, Env, error_comps>...>>;
241243
using type = ::beman::execution26::detail::meta::combine<value_types, error_types>;
242244
};
243245
} // namespace beman::execution26::detail

0 commit comments

Comments
 (0)