Files
cppdraft_translate/cppdraft/exec/factories.md
2025-10-25 03:02:53 +03:00

135 lines
5.6 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[exec.factories]
# 33 Execution control library [[exec]](./#exec)
## 33.9 Senders [[exec.snd]](exec.snd#exec.factories)
### 33.9.11 Sender factories [exec.factories]
#### [33.9.11.1](#exec.schedule) execution::schedule [[exec.schedule]](exec.schedule)
[1](#exec.schedule-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2877)
schedule obtains a schedule sender ([[exec.async.ops]](exec.async.ops "33.3Asynchronous operations"))
from a scheduler[.](#exec.schedule-1.sentence-1)
[2](#exec.schedule-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2881)
The name schedule denotes a customization point object[.](#exec.schedule-2.sentence-1)
For a subexpression sch,
the expression schedule(sch) is expression-equivalent tosch.schedule()[.](#exec.schedule-2.sentence-2)
[3](#exec.schedule-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2887)
*Mandates*: The type of sch.schedule() satisfies [sender](exec.snd.concepts#concept:sender "33.9.3Sender concepts[exec.snd.concepts]")[.](#exec.schedule-3.sentence-1)
[4](#exec.schedule-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2891)
If the expressionget_completion_scheduler<set_value_t>(get_env(sch.schedule())) == sch is ill-formed or evaluates to false,
the behavior of calling schedule(sch) is undefined[.](#exec.schedule-4.sentence-1)
#### [33.9.11.2](#exec.just) execution::just, execution::just_error, execution::just_stopped [[exec.just]](exec.just)
[1](#exec.just-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2901)
just, just_error, and just_stopped are sender factories
whose asynchronous operations complete synchronously in their start operation
with a value completion operation,
an error completion operation, or
a stopped completion operation, respectively[.](#exec.just-1.sentence-1)
[2](#exec.just-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2908)
The names just, just_error, and just_stopped denote
customization point objects[.](#exec.just-2.sentence-1)
Let *just-cpo* be one ofjust, just_error, or just_stopped[.](#exec.just-2.sentence-2)
For a pack of subexpressions ts,
let Ts be the pack of types decltype((ts))[.](#exec.just-2.sentence-3)
The expression *just-cpo*(ts...) is ill-formed if
- [(2.1)](#exec.just-2.1)
([*movable-value*](exec.general#concept:movable-value "33.1General[exec.general]")<Ts> &&...) is false, or
- [(2.2)](#exec.just-2.2)
*just-cpo* is just_error andsizeof...(ts) == 1 is false, or
- [(2.3)](#exec.just-2.3)
*just-cpo* is just_stopped andsizeof...(ts) == 0 is false[.](#exec.just-2.sentence-4)
Otherwise, it is expression-equivalent to*make-sender*(*just-cpo*, *product-type*{ts...})[.](#exec.just-2.sentence-5)
For just, just_error, and just_stopped,
let *set-cpo* beset_value, set_error, and set_stopped, respectively[.](#exec.just-2.sentence-6)
The exposition-only class template *impls-for* ([[exec.snd.expos]](exec.snd.expos "33.9.2Exposition-only entities"))
is specialized for *just-cpo* as follows:namespace std::execution {template<>struct *impls-for*<*decayed-typeof*<*just-cpo*>> : *default-impls* {static constexpr auto *start* =[](auto& state, auto& rcvr) noexcept -> void {auto& [...ts] = state; *set-cpo*(std::move(rcvr), std::move(ts)...); }; };}
#### [33.9.11.3](#exec.read.env) execution::read_env [[exec.read.env]](exec.read.env)
[1](#exec.read.env-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2950)
read_env is a sender factory for a sender
whose asynchronous operation completes synchronously in its start operation
with a value completion result equal to
a value read from the receiver's associated environment[.](#exec.read.env-1.sentence-1)
[2](#exec.read.env-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2956)
read_env is a customization point object[.](#exec.read.env-2.sentence-1)
For some query object q,
the expression read_env(q) is expression-equivalent to*make-sender*(read_env, q)[.](#exec.read.env-2.sentence-2)
[3](#exec.read.env-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2962)
The exposition-only class template *impls-for* ([[exec.snd.expos]](exec.snd.expos "33.9.2Exposition-only entities"))
is specialized for read_env as follows:
[🔗](#lib:impls-for%3cdecayed-typeof%3cread_env%3e%3e)
namespace std::execution {template<>struct *impls-for*<*decayed-typeof*<read_env>> : *default-impls* {static constexpr auto start =[](auto query, auto& rcvr) noexcept -> void {*TRY-SET-VALUE*(rcvr, query(get_env(rcvr))); }; }; template<class Sndr, class Env>static consteval void *check-types*();}
[🔗](#lib:check-types,impls-for%3cdecayed-typeof%3cread_env%3e%3e)
`template<class Sndr, class Env>
static consteval void check-types();
`
[4](#exec.read.env-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2988)
Let Q be decay_t<*data-type*<Sndr>>[.](#exec.read.env-4.sentence-1)
[5](#exec.read.env-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2991)
*Throws*: An exception of an unspecified type derived from exception if
the expression Q()(env) is ill-formed or has type void, whereenv is an lvalue subexpression whose type is Env[.](#exec.read.env-5.sentence-1)