This commit is contained in:
2025-10-25 03:02:53 +03:00
commit 043225d523
3416 changed files with 681196 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
[exec.stop.when]
# 33 Execution control library [[exec]](./#exec)
## 33.9 Senders [[exec.snd]](exec.snd#exec.stop.when)
### 33.9.12 Sender adaptors [[exec.adapt]](exec.adapt#exec.stop.when)
#### 33.9.12.17 Exposition-only execution::*stop-when* [exec.stop.when]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L5154)
*stop-when* fuses an additional stop token t into a sender so that, upon connecting to a receiver r,
the resulting operation state receives stop requests from botht and the token returned from get_stop_token(get_env(r))[.](#1.sentence-1)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L5161)
The name *stop-when* denotes an exposition-only sender adaptor[.](#2.sentence-1)
For subexpressions sndr and token:
- [(2.1)](#2.1)
If decltype((sndr)) does not satisfy [sender](exec.snd.concepts#concept:sender "33.9.3Sender concepts[exec.snd.concepts]"), orremove_cvref_t<decltype((token))> does not satisfy [stoppable_token](stoptoken.concepts#concept:stoppable_token "32.3.3Stop token concepts[stoptoken.concepts]"),
then *stop-when*(sndr, token) is ill-formed[.](#2.1.sentence-1)
- [(2.2)](#2.2)
Otherwise,
if remove_cvref_t<decltype((token))> models[unstoppable_token](stoptoken.concepts#concept:unstoppable_token "32.3.3Stop token concepts[stoptoken.concepts]") then*stop-when*(sndr, token) is expression-equivalent tosndr[.](#2.2.sentence-1)
- [(2.3)](#2.3)
Otherwise,*stop-when*(sndr, token) returns a sender osndr[.](#2.3.sentence-1)
If osndr is connected to a receiver r,
let rtoken be the result of get_stop_token(get_env(r))[.](#2.3.sentence-2)
* [(2.3.1)](#2.3.1)
If the type of rtoken models [unstoppable_token](stoptoken.concepts#concept:unstoppable_token "32.3.3Stop token concepts[stoptoken.concepts]") then
the effects of connecting osndr to r are equivalent toconnect(write_env(sndr, prop(get_stop_token, token)), r)[.](#2.3.1.sentence-1)
* [(2.3.2)](#2.3.2)
Otherwise,
the effects of connecting osndr to r are equivalent toconnect(write_env(sndr, prop(get_stop_token, stoken)), r) where stoken is an object of
an exposition-only type *stoken-t* such that:
+
[(2.3.2.1)](#2.3.2.1)
*stoken-t* models [stoppable_token](stoptoken.concepts#concept:stoppable_token "32.3.3Stop token concepts[stoptoken.concepts]");
+
[(2.3.2.2)](#2.3.2.2)
stoken.stop_requested() returns token.stop_requested() || rtoken.stop_reques-
ted();
+
[(2.3.2.3)](#2.3.2.3)
stoken.stop_possible() returns token.stop_possible() || rtoken.stop_possible(); and
+
[(2.3.2.4)](#2.3.2.4)
for types Fn and Init such that both [invocable](concept.invocable#concept:invocable "18.7.2Concept invocable[concept.invocable]")<Fn> and [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<Fn, Init> are modeled, *stoken-t*::callback_type<Fn> models [*stoppable-callback-for*](stoptoken.concepts#concept:stoppable-callback-for "32.3.3Stop token concepts[stoptoken.concepts]")<Fn, *stoken-t*, Init>[.](#2.3.2.sentence-1)
[*Note [1](#note-1)*:
For an object fn of type Fn constructed from a value, init, of type Init,
registering fn using *stoken-t*::callback_type<Fn>(stoken, init) results in an invocation of fn when
a callback registered with token or rtoken would be invoked[.](#2.3.2.4.sentence-2)
fn is invoked at most once[.](#2.3.2.4.sentence-3)
— *end note*]