28#include "stdexec/execution.hpp"
37 template <::STDEXEC::sender Sender,
typename F>
38 constexpr ::STDEXEC::sender
auto operator()(Sender&& sender, F&& f)
const noexcept(
39 std::is_nothrow_constructible_v<std::remove_cvref_t<Sender>, Sender>
40 && std::is_nothrow_constructible_v<std::remove_cvref_t<F>, F>) {
41 return ::STDEXEC::__sexpr{
t(), (F&&) f, (Sender&&) sender};
45 constexpr auto operator()(F&& f)
const noexcept(std::is_nothrow_constructible_v<std::remove_cvref_t<F>, F>) {
46 return ::STDEXEC::__closure(*
this, (F&&) f);
49 template <
typename Sender,
typename Env>
50 static constexpr auto transform_sender(::STDEXEC::set_value_t, Sender&& sender,
const Env&)
51 noexcept(std::is_nothrow_constructible_v<std::remove_cvref_t<Sender>, Sender>) {
52 auto&& [_, f, predecessor] = (Sender&&) sender;
53 static_assert(::STDEXEC::sender<
decltype(predecessor)>);
54 return ::STDEXEC::__sexpr{
tag(), std::tuple((
decltype(f)&&) f, (
decltype(predecessor)&&) predecessor)};
58template <
typename Sender,
typename... Env>
61template <
typename Sender>
63 static constexpr bool value = ::STDEXEC::sender<Sender>;
66template <
typename Sender,
typename Env>
68 static constexpr bool value = ::STDEXEC::sender_in<Sender, Env>;
71template <
typename F,
typename... Env>
73 template <
typename... Args>
75 static_assert(std::is_invocable_v<F, Args...>);
76 using sender_ = std::invoke_result_t<F, Args...>;
80 ::STDEXEC::__nothrow_connectable<
sender_, ::STDEXEC::__receiver_archetype<Env...>>;
82 using type = ::STDEXEC::transform_completion_signatures<
83 ::STDEXEC::completion_signatures_of_t<
sender_, Env...>,
86 ::STDEXEC::completion_signatures<>,
87 ::STDEXEC::completion_signatures<::STDEXEC::set_error_t(std::exception_ptr)>
92 template <
typename... Args>
96template <
typename Sender,
typename F,
typename... Env>
97using completions = ::STDEXEC::transform_completion_signatures<
98 ::STDEXEC::completion_signatures_of_t<Sender, Env...>,
99 ::STDEXEC::completion_signatures<>,
106template <::STDEXEC::receiver Receiver>
111 constexpr ::STDEXEC::env_of_t<Receiver>
get_env() const noexcept {
112 return ::STDEXEC::get_env(
r_);
115 template <
typename... Args>
116 requires ::STDEXEC::receiver_of<Receiver, ::STDEXEC::completion_signatures<::STDEXEC::set_value_t(Args...)>>
118 ::STDEXEC::set_value((Receiver&&)
r_, (Args&&) args...);
121 template <
typename T>
122 requires ::STDEXEC::receiver_of<Receiver, ::STDEXEC::completion_signatures<::STDEXEC::set_error_t(T)>>
124 ::STDEXEC::set_error((Receiver&&)
r_, (T&&)
t);
128 requires ::STDEXEC::receiver_of<Receiver, ::STDEXEC::completion_signatures<::STDEXEC::set_stopped_t()>>
130 ::STDEXEC::set_stopped((Receiver&&)
r_);
134template <
typename F,
typename Receiver,
typename Additional,
typename Signatures,
typename InProgress = std::tuple<>>
142 typename... Signatures,
149 ::STDEXEC::completion_signatures<::STDEXEC::set_value_t(Args...), Signatures...>,
150 std::tuple<States...>
156 ::STDEXEC::completion_signatures<Signatures...>,
157 std::tuple<::STDEXEC::connect_result_t<std::invoke_result_t<F, Args...>,
receiver_ref<Receiver>>, States...>
161template <
typename F,
typename Receiver,
typename Additional,
typename Signature,
typename... Signatures,
typename States>
166 ::STDEXEC::completion_signatures<Signature, Signatures...>,
173 ::STDEXEC::completion_signatures<Signatures...>,
178template <
typename F,
typename Receiver,
typename... Additional,
typename... States>
182 std::tuple<Additional...>,
183 ::STDEXEC::completion_signatures<>,
184 std::tuple<States...>
186 using type = ::STDEXEC::__munique<::STDEXEC::__qq<std::variant>>::__f<Additional..., States...>;
189template <
typename Sender,
typename F,
typename Receiver>
197 template <typename... Args>
199 template <typename... Args>
201 template <typename... Args>
215 static constexpr
bool nothrow_connect_ = ::STDEXEC::__nothrow_connectable<Sender, receiver_type_>;
217 template <typename T>
218 explicit constexpr
state(Sender&& s, T&&
t, Receiver r)
223 return ::STDEXEC::connect((Sender&&) s, receiver_type_{*
this});
228 const auto ptr = std::get_if<operation_state_type_>(&
ops_);
230 ::STDEXEC::start(*ptr);
234template <
typename Sender,
typename F,
typename Receiver>
236 return ::STDEXEC::get_env(
self_.r_);
239template <
typename Sender,
typename F,
typename Receiver>
240template <
typename... Args>
242 constexpr auto nothrow_connect =
250 auto&& sender = std::invoke((F&&) self.f_, (Args&&) args...);
256 auto&& op = self.ops_.template emplace<op_state_type>(::exec::elide([&]()
noexcept(nothrow_connect) {
259 ::STDEXEC::start(op);
261 if constexpr (std::is_nothrow_invocable_v<F, Args...> && nothrow_connect) {
262 STDEXEC_UNREACHABLE();
264 ::STDEXEC::set_error((Receiver&&) self.r_, std::current_exception());
269template <
typename Sender,
typename F,
typename Receiver>
270template <
typename... Args>
272 ::STDEXEC::set_error((Receiver&&)
self_.r_, (Args&&) args...);
275template <
typename Sender,
typename F,
typename Receiver>
276template <
typename... Args>
278 ::STDEXEC::set_stopped((Receiver&&)
self_.r_, (Args&&) args...);
281template <
typename Sender,
typename Receiver>
283 using tuple_type_ = std::remove_cvref_t<::STDEXEC::__data_of<Sender>>;
284 using sender_type_ = ::STDEXEC::__copy_cvref_t<Sender, std::tuple_element_t<1, tuple_type_>>;
287 static constexpr bool value = std::is_nothrow_constructible_v<
290 ::STDEXEC::__copy_cvref_t<Sender, invocable_type_>,
295template <
typename Tuple,
typename,
typename = std::remove_cvref_t<Tuple>>
298template <
typename Tuple,
typename Receiver,
typename F,
typename Sender>
303struct impl :
public ::STDEXEC::__sexpr_defaults {
304 template <
typename Self,
typename... Env>
306 using tuple = std::remove_cvref_t<::STDEXEC::__data_of<Self>>;
307 using f = std::tuple_element_t<0, tuple>;
308 using sender = ::STDEXEC::__copy_cvref_t<Self, std::tuple_element_t<1, tuple>>;
309 static_assert(::STDEXEC::sender<sender>);
310 if constexpr (
sizeof...(Env)) {
311 static_assert(::STDEXEC::sender_in<sender, Env...>);
313 if constexpr (::STDEXEC::__minvocable_q<
completions, sender, f, Env...>) {
316 return ::STDEXEC::__throw_compile_time_error<
318 ::STDEXEC::_WITH_SENDER_<Self>
323 static constexpr auto __get_state = []<
typename Sender,
typename Receiver>(Sender&& sender, Receiver r)
noexcept(
326 auto&& [_, tuple] = (Sender&&) sender;
327 auto&& [f, inner] = (
decltype(tuple)&&) tuple;
329 (
decltype(inner)&&) inner, (
decltype(f)&&) f, (Receiver&&) r);
346struct __sexpr_impl<::exec::detail::invoke::tag> : ::exec::detail::invoke::impl { };
349struct __sexpr_impl<::exec::invoke_t> : ::STDEXEC::__sexpr_defaults {
350 template <
class Sender,
class... Env>
352 using type =
decltype(::STDEXEC::transform_sender(std::declval<Sender>(), std::declval<const Env&>()...));
353 static_assert(!std::is_same_v<std::remove_cvref_t<type>, std::remove_cvref_t<Sender>>);
354 return ::STDEXEC::get_completion_signatures<type, Env...>();
::stdexec::__copy_cvref_t< Sender, std::tuple_element_t< 1, tuple_type_ > > sender_type_
static constexpr bool value
std::tuple_element_t< 0, tuple_type_ > invocable_type_
std::remove_cvref_t<::stdexec::__data_of< Sender > > tuple_type_
constexpr void start() &noexcept
static constexpr bool nothrow_connect_
variant_for_operation_states< F, Receiver, std::tuple< operation_state_type_ >, ::stdexec::completion_signatures_of_t< Sender, receiver_type_ > >::type operation_states_type_
constexpr state(Sender &&s, T &&t, Receiver r) noexcept(std::is_nothrow_constructible_v< F, T > &¬hrow_connect_)
::stdexec::env_of_t< Receiver > env_type_
::stdexec::connect_result_t< Sender, receiver_type_ > operation_state_type_
operation_states_type_ ops_
::stdexec::transform_completion_signatures< ::stdexec::completion_signatures_of_t< Sender, Env... >, ::stdexec::completion_signatures<>, transform_set_value< F, Env... >::template fn > completions
detail::invoke::t invoke_t
constexpr invoke_t invoke
state<::stdexec::__copy_cvref_t< Tuple, Sender >, F, Receiver > type
static constexpr auto __start
static consteval auto __get_completion_signatures()
static constexpr auto __get_state
requires ::stdexec::receiver_of< Receiver, ::stdexec::completion_signatures<::stdexec::set_error_t(T)> > constexpr void set_error(T &&t) &&noexcept
requires ::stdexec::receiver_of< Receiver, ::stdexec::completion_signatures<::stdexec::set_value_t(Args...)> > constexpr void set_value(Args &&... args) &&noexcept
::stdexec::receiver_t receiver_concept
constexpr void set_stopped() &&noexcept
constexpr ::stdexec::env_of_t< Receiver > get_env() const noexcept
static constexpr bool value
static constexpr bool value
constexpr void set_error(Args &&...) &&noexcept
::stdexec::receiver_t receiver_concept
constexpr void set_value(Args &&...) &&noexcept
constexpr void set_stopped(Args &&...) &&noexcept
constexpr env_type_ get_env() const noexcept
static constexpr auto transform_sender(::stdexec::set_value_t, Sender &&sender, const Env &) noexcept(std::is_nothrow_constructible_v< std::remove_cvref_t< Sender >, Sender >)
constexpr ::stdexec::sender auto operator()(Sender &&sender, F &&f) const noexcept(std::is_nothrow_constructible_v< std::remove_cvref_t< Sender >, Sender > &&std::is_nothrow_constructible_v< std::remove_cvref_t< F >, F >)
constexpr auto operator()(F &&f) const noexcept(std::is_nothrow_constructible_v< std::remove_cvref_t< F >, F >)
variant_for_operation_states< F, Receiver, Additional, ::stdexec::completion_signatures< Signatures... >, States >::type type
::stdexec::__munique<::stdexec::__qq< std::variant > >::__f< Additional..., States... > type
variant_for_operation_states< F, Receiver, Additional, ::stdexec::completion_signatures< Signatures... >, std::tuple<::stdexec::connect_result_t< std::invoke_result_t< F, Args... >, receiver_ref< Receiver > >, States... > >::type type
static consteval auto get_completion_signatures()