|
| 1 | +#include <beman/execution26/execution.hpp> |
| 2 | +#include <type_traits> |
| 3 | +#include <string> |
| 4 | +#include <memory_resource> |
| 5 | +#include <utility> |
| 6 | +#include <iostream> |
| 7 | + |
| 8 | +namespace ex = beman::execution26; |
| 9 | + |
| 10 | +template <typename Receiver> |
| 11 | +struct just_op_state { |
| 12 | + using operation_state_concept = ex::operation_state_t; |
| 13 | + std::remove_cvref_t<Receiver> rec; |
| 14 | + std::pmr::string value; |
| 15 | + |
| 16 | + template <typename R> |
| 17 | + just_op_state(R&& r, std::pmr::string&& value) |
| 18 | + : rec(std::forward<R>(r)), value(std::move(value), ex::get_allocator(ex::get_env(rec))) {} |
| 19 | + |
| 20 | + void start() & noexcept { ex::set_value(std::move(rec), std::move(value)); } |
| 21 | +}; |
| 22 | + |
| 23 | +struct test_receiver { |
| 24 | + using receiver_concept = ex::receiver_t; |
| 25 | + auto set_value(auto&&...) && noexcept -> void { std::cout << "set_value\n"; } |
| 26 | + auto set_error(auto&&) && noexcept -> void { std::cout << "set_error\n"; } |
| 27 | + auto set_stopped() && noexcept -> void { std::cout << "set_stopped\n"; } |
| 28 | +}; |
| 29 | + |
| 30 | +static_assert(ex::receiver<test_receiver>); |
| 31 | +static_assert(ex::operation_state<just_op_state<test_receiver>>); |
| 32 | + |
| 33 | +template <typename T> |
| 34 | +struct just_sender { |
| 35 | + using sender_concept = ex::sender_t; |
| 36 | + using completion_signatures = ex::completion_signatures<ex::set_value_t(T)>; |
| 37 | + |
| 38 | + T value; |
| 39 | + template <ex::receiver Receiver> |
| 40 | + auto connect(Receiver&& r) && -> just_op_state<Receiver> { |
| 41 | + return {std::forward<Receiver>(r), std::move(value)}; |
| 42 | + } |
| 43 | +}; |
| 44 | + |
| 45 | +static_assert(ex::sender<just_sender<std::pmr::string>>); |
| 46 | +static_assert(ex::sender_in<just_sender<std::pmr::string>>); |
| 47 | + |
| 48 | +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 e = ex::detail::write_env(std::move(w), |
| 53 | + ex::detail::make_env(ex::get_allocator, std::pmr::polymorphic_allocator<>())); |
| 54 | + |
| 55 | + std::cout << "before start\n"; |
| 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"; |
| 62 | + std::cout << "after start\n"; |
| 63 | +} |
0 commit comments