29#include "stdexec/execution.hpp"
37 template <::exec::enter_scope_sender Scope, ::STDEXEC::sender Sender>
38 constexpr ::STDEXEC::sender
auto operator()(Scope&& scope, Sender&& sender)
const noexcept(
39 std::is_nothrow_constructible_v<std::remove_cvref_t<Scope>, Scope>
40 && std::is_nothrow_constructible_v<std::remove_cvref_t<Sender>, Sender>) {
41 return ::STDEXEC::__sexpr{
t(), ::STDEXEC::__(), (Scope&&) scope, (Sender&&) sender};
48template <
typename Sender,
typename Env>
50 ::STDEXEC::__nothrow_connectable<Sender, ::STDEXEC::__receiver_archetype<Env>> &&
52 std::is_nothrow_move_constructible_v<Sender>;
54template <
typename Sender,
typename Env>
56 ::STDEXEC::completion_signatures_of_t<Sender, Env>,
59 ::STDEXEC::completion_signatures<>,
60 ::STDEXEC::completion_signatures<::STDEXEC::set_error_t(std::exception_ptr)>
64template <
typename Scope,
typename... Env>
66 ::STDEXEC::completion_signatures_of_t<Scope, Env...>,
67 ::STDEXEC::completion_signatures<>,
71template <
typename Sender,
typename Env>
73 ::exec::storage_for_completion_signatures<completion_signatures_of_sender_t<Sender, Env>>;
75template <
typename Env>
77 template <
typename Scope,
typename Sender>
78 using __f = ::STDEXEC::transform_completion_signatures<
84template <
typename Scope,
typename Sender,
typename Receiver>
99 template <
typename... Args>
101 template <
typename... Args>
116 template <
typename... Args>
118 template <
typename... Args>
120 template <
typename... Args>
138 std::variant<enter_state_type_, state_type_, exit_operation_state_type_>
state_;
141 const auto ptr = std::get_if<state_type_>(&
state_);
142 auto sender = std::move(ptr->s);
143 auto&& op =
state_.template emplace<exit_operation_state_type_>(::exec::elide(
144 [&]()
noexcept { return ::STDEXEC::connect(std::move(sender), exit_receiver_type_{{*
this}}); }));
145 ::STDEXEC::start(op);
148 template <
typename... Args>
156 template <
typename S>
157 explicit constexpr state(Scope&& scope, S&& sender, Receiver r)
161 return enter_state_type_{
162 ::STDEXEC::connect((Scope&&) scope, enter_receiver_type_{{*
this}}), (S&&) sender};
167 const auto ptr = std::get_if<enter_state_type_>(&
state_);
169 ::STDEXEC::start(ptr->op);
173template <
typename Scope,
typename Sender,
typename Receiver>
175 return ::STDEXEC::get_env(
self_.r_);
178template <
typename Scope,
typename Sender,
typename Receiver>
185 const auto ptr = std::get_if<enter_state_type_>(&self.state_);
188 auto sender = (Sender&&) ptr->s;
189 auto&&
state = self.state_.template emplace<state_type_>(::exec::elide([&]()
noexcept(nothrow) {
192 ::STDEXEC::start(
state.op);
194 if constexpr (nothrow) {
195 STDEXEC_UNREACHABLE();
197 ::STDEXEC::set_error((Receiver&&) self.r_, std::current_exception());
202template <
typename Scope,
typename Sender,
typename Receiver>
203template <
typename... Args>
205 ::STDEXEC::set_error((Receiver&&)
self_.r_, (Args&&) args...);
208template <
typename Scope,
typename Sender,
typename Receiver>
209template <
typename... Args>
211 ::STDEXEC::set_stopped((Receiver&&)
self_.r_, (Args&&) args...);
214template <
typename Scope,
typename Sender,
typename Receiver>
216 std::move(
self_.storage_).complete((Receiver&&)
self_.r_);
219template <
typename Scope,
typename Sender,
typename Receiver>
220template <
typename... Args>
222 self_.complete_(::STDEXEC::set_value, (Args&&) args...);
225template <
typename Scope,
typename Sender,
typename Receiver>
226template <
typename... Args>
228 self_.complete_(::STDEXEC::set_error, (Args&&) args...);
231template <
typename Scope,
typename Sender,
typename Receiver>
232template <
typename... Args>
234 self_.complete_(::STDEXEC::set_stopped, (Args&&) args...);
240template <
typename Receiver>
242 template <
typename Scope,
typename Sender>
246template <
typename Receiver>
248 template <
typename Scope,
typename Sender>
249 using __f = std::is_nothrow_constructible<
257class impl :
public ::STDEXEC::__sexpr_defaults {
258 template <
typename Sender,
typename... Env>
261 template <
typename Sender,
typename... Env>
263 if constexpr (
sizeof...(Env) == 0) {
264 return STDEXEC::__throw_dependent_sender_error<Sender>();
265 }
else if constexpr (::STDEXEC::__minvocable_q<
completions_, Sender, Env...>) {
268 return ::STDEXEC::__throw_compile_time_error<
270 ::STDEXEC::_WITH_SENDER_<Sender>
275 static constexpr auto __connect = []<
typename Sender,
typename Receiver>(Sender&& sender, Receiver r)
noexcept(
277 -> ::STDEXEC::__children_of<Sender, connect_result<Receiver>> {
278 return ::STDEXEC::__apply(
279 [&](
auto&&,
auto&&,
auto&& scope,
auto&& sender)
noexcept(
282 return ::STDEXEC::__children_of<Sender, connect_result<Receiver>>(
283 (
decltype(scope)&&) scope, (
decltype(sender)&&) sender, (Receiver&&) r);
299struct __sexpr_impl<::exec::within_t> : ::exec::detail::within::impl { };
::stdexec::__children_of< Sender, completions< Env... > > completions_
static constexpr auto __connect
static consteval auto __get_completion_signatures()
::stdexec::connect_result_t< Sender, receiver_type_ > operation_state_type_
constexpr void start() &noexcept
constexpr void complete_(Args &&... args) noexcept
constexpr void exit_() noexcept
::stdexec::env_of_t< Receiver > env_type_
std::variant< enter_state_type_, state_type_, exit_operation_state_type_ > state_
storage_for_completion_signatures_t< Sender, env_type_ > storage_
::stdexec::connect_result_t< exit_scope_sender_type_, exit_receiver_type_ > exit_operation_state_type_
::stdexec::connect_result_t< Scope, enter_receiver_type_ > enter_operation_state_type_
::exec::exit_scope_sender_of_t< Scope, env_type_ > exit_scope_sender_type_
static constexpr bool nothrow_construct_connect_
constexpr state(Scope &&scope, S &&sender, Receiver r) noexcept(std::is_nothrow_constructible_v< Sender, S > &¬hrow_construct_connect_)
::stdexec::transform_completion_signatures< ::stdexec::completion_signatures_of_t< Scope, Env... >, ::stdexec::completion_signatures<>, remove_set_value_t > completion_signatures_of_scope_t
::stdexec::completion_signatures<> remove_set_value_t
::stdexec::transform_completion_signatures< ::stdexec::completion_signatures_of_t< Sender, Env >, std::conditional_t< nothrow_connect_sender< Sender, Env >, ::stdexec::completion_signatures<>, ::stdexec::completion_signatures<::stdexec::set_error_t(std::exception_ptr)> > > completion_signatures_of_sender_t
constexpr bool nothrow_connect_sender
::exec::storage_for_completion_signatures< completion_signatures_of_sender_t< Sender, Env > > storage_for_completion_signatures_t
detail::within::t within_t
constexpr within_t within
detail::exit_scope_sender_of::impl<::stdexec::transform_completion_signatures< ::stdexec::completion_signatures_of_t< Constructor, Env >, ::stdexec::completion_signatures<>, detail::exit_scope_sender_of::transform_set_value< Env >::template fn, detail::exit_scope_sender_of::transform_set_error, ::stdexec::completion_signatures<> > >::type exit_scope_sender_of_t
::stdexec::transform_completion_signatures< typename storage_for_completion_signatures_t< std::remove_cvref_t< Sender >, Env >::completion_signatures, completion_signatures_of_scope_t< Scope, Env > > __f
state< Scope, std::remove_cvref_t< Sender >, Receiver > __f
std::is_nothrow_constructible< typename connect_result< Receiver >::template __f< Scope, Sender >, Scope, Sender, Receiver > __f
constexpr void set_stopped(Args &&...) &&noexcept
constexpr void set_error(Args &&...) &&noexcept
constexpr void set_value(exit_scope_sender_type_) &&noexcept
enter_operation_state_type_ op
constexpr void set_value() &&noexcept
constexpr env_type_ get_env() const noexcept
::stdexec::receiver_t receiver_concept
constexpr void set_error(Args &&...) &&noexcept
constexpr void set_value(Args &&...) &&noexcept
constexpr void set_stopped(Args &&...) &&noexcept
exit_scope_sender_type_ s
constexpr ::stdexec::sender auto operator()(Scope &&scope, Sender &&sender) const noexcept(std::is_nothrow_constructible_v< std::remove_cvref_t< Scope >, Scope > &&std::is_nothrow_constructible_v< std::remove_cvref_t< Sender >, Sender >)