From 45e2170d682376cd30a67bddfdc73a22f5b528d8 Mon Sep 17 00:00:00 2001 From: Alisdair Meredith Date: Mon, 23 Jun 2025 13:56:19 -0400 Subject: [PATCH] P3570R2 optional variants in sender/receiver --- source/exec.tex | 43 +++++++++++++++++++++++++++++++++++++++++++ source/support.tex | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/source/exec.tex b/source/exec.tex index 4c1f228437..4016776a63 100644 --- a/source/exec.tex +++ b/source/exec.tex @@ -464,6 +464,7 @@ struct @\libglobal{get_forward_progress_guarantee_t}@ { @\unspec@ }; template struct @\libglobal{get_completion_scheduler_t}@ { @\unspec@ }; + struct get_await_completion_adaptor_t { @\unspec@ }; inline constexpr get_domain_t @\libglobal{get_domain}@{}; inline constexpr get_scheduler_t @\libglobal{get_scheduler}@{}; @@ -472,6 +473,7 @@ inline constexpr get_forward_progress_guarantee_t @\libglobal{get_forward_progress_guarantee}@{}; template constexpr get_completion_scheduler_t @\libglobal{get_completion_scheduler}@{}; + inline constexpr get_await_completion_adaptor_t get_await_completion_adaptor{}; struct @\libglobal{get_env_t}@ { @\unspec@ }; inline constexpr get_env_t @\libglobal{get_env}@{}; @@ -1007,6 +1009,27 @@ \tcode{forwarding_query(get_completion_scheduler<\exposid{completion-tag}>)} is a core constant expression and has value \tcode{true}. +\rSec2[exec.get.await.adapt]{\tcode{execution::get_await_completion_adaptor}} + +\pnum +\tcode{get_await_completion_adaptor} asks a queryable object for +its associated awaitable completion adaptor. + +\pnum +The name \tcode{get_await_completion_adaptor} denotes a query object. +For a subexpression \tcode{env}, +\begin{codeblock} +get_await_completion_adaptor(env) +\end{codeblock} +is expression-equivalent to +\begin{codeblock} +@\exposidnc{MANDATE-NOTHROW}@(@\exposid{AS-CONST}@(env).query(get_await_completion_adaptor)) +\end{codeblock} + +\pnum +\tcode{forwarding_query(execution::get_await_completion_adaptor)} +is a core constant expression and has value \tcode{true}. + \rSec1[exec.sched]{Schedulers} \pnum @@ -5489,6 +5512,13 @@ { p.unhandled_stopped() } -> @\libconcept{convertible_to}@>; }; + template + concept @\defexposconcept{has-queryable-await-completion-adaptor}@ = // \expos + @\libconcept{sender}@ && + requires(Sndr&& sender) { + get_await_completion_adaptor(get_env(sender)); + }; + template class @\exposidnc{sender-awaitable}@; // \expos } @@ -5630,6 +5660,19 @@ in a coroutine with promise type \tcode{U} is expression-equivalent to the same expression in a coroutine with promise type \tcode{Promise}. \item +Otherwise, \tcode{\exposid{sender-awaitable}\{\exposid{adapted-expr}, p\}} +if +\begin{codeblock} +@\exposid{has-queryable-await-completion-adaptor}@ +\end{codeblock} +and +\begin{codeblock} +@\exposid{awaitable-sender}@} +\end{codeblock} +are both satisfied, where \exposid{adapted-expr} is +\tcode{get_await_completion_adaptor(get_env(expr))(expr)}, +except that \tcode{expr} is evaluated only once. +\item Otherwise, \tcode{\exposid{sender-awaitable}\{expr, p\}} if \tcode{\exposconcept{awaitable-sender}} is \tcode{true}. \item diff --git a/source/support.tex b/source/support.tex index 736c659ef7..92ff0db948 100644 --- a/source/support.tex +++ b/source/support.tex @@ -816,7 +816,7 @@ #define @\defnlibxname{cpp_lib_saturation_arithmetic}@ 202311L // also in \libheader{numeric} #define @\defnlibxname{cpp_lib_scoped_lock}@ 201703L // also in \libheader{mutex} #define @\defnlibxname{cpp_lib_semaphore}@ 201907L // also in \libheader{semaphore} -#define @\defnlibxname{cpp_lib_senders}@ 202406L // also in \libheader{execution} +#define @\defnlibxname{cpp_lib_senders}@ 202506L // also in \libheader{execution} #define @\defnlibxname{cpp_lib_shared_mutex}@ 201505L // also in \libheader{shared_mutex} #define @\defnlibxname{cpp_lib_shared_ptr_arrays}@ 201707L // also in \libheader{memory} #define @\defnlibxname{cpp_lib_shared_ptr_weak_type}@ 201606L // also in \libheader{memory}