81 lines
3.5 KiB
Markdown
81 lines
3.5 KiB
Markdown
[exec.continues.on]
|
||
|
||
# 33 Execution control library [[exec]](./#exec)
|
||
|
||
## 33.9 Senders [[exec.snd]](exec.snd#exec.continues.on)
|
||
|
||
### 33.9.12 Sender adaptors [[exec.adapt]](exec.adapt#exec.continues.on)
|
||
|
||
#### 33.9.12.6 execution::continues_on [exec.continues.on]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3289)
|
||
|
||
continues_on adapts a sender into one
|
||
that completes on the specified scheduler[.](#1.sentence-1)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3293)
|
||
|
||
The name continues_on denotes a pipeable sender adaptor object[.](#2.sentence-1)
|
||
|
||
For subexpressions sch and sndr,
|
||
if decltype((sch)) does not satisfy [scheduler](exec.sched#concept:scheduler "33.6 Schedulers [exec.sched]"), ordecltype((sndr)) does not satisfy [sender](exec.snd.concepts#concept:sender "33.9.3 Sender concepts [exec.snd.concepts]"),continues_on(sndr, sch) is ill-formed[.](#2.sentence-2)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3300)
|
||
|
||
Otherwise,
|
||
the expression continues_on(sndr, sch) is expression-equivalent to:transform_sender(*get-domain-early*(sndr), *make-sender*(continues_on, sch, sndr)) except that sndr is evaluated only once[.](#3.sentence-1)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3308)
|
||
|
||
The exposition-only class template *impls-for* ([[exec.snd.expos]](exec.snd.expos "33.9.2 Exposition-only entities"))
|
||
is specialized for continues_on_t as follows:namespace std::execution {template<>struct *impls-for*<continues_on_t> : *default-impls* {static constexpr auto *get-attrs* =[](const auto& data, const auto& child) noexcept -> decltype(auto) {return *JOIN-ENV*(*SCHED-ATTRS*(data), *FWD-ENV*(get_env(child))); }; };}
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3323)
|
||
|
||
Let sndr and env be subexpressions
|
||
such that Sndr is decltype((sndr))[.](#5.sentence-1)
|
||
|
||
If [*sender-for*](exec.snd.concepts#concept:sender-for "33.9.3 Sender concepts [exec.snd.concepts]")<Sndr, continues_on_t> is false,
|
||
then
|
||
the expression continues_on.transform_sender(sndr, env) is ill-formed;
|
||
otherwise, it is equal to:auto [_, data, child] = sndr;return schedule_from(std::move(data), std::move(child));
|
||
|
||
[*Note [1](#note-1)*:
|
||
|
||
This causes the continues_on(sndr, sch) sender to becomeschedule_from(sch, sndr) when it is connected with a receiver
|
||
whose execution domain does not customize continues_on[.](#5.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3340)
|
||
|
||
Let out_sndr be a subexpression denoting
|
||
a sender returned from continues_on(sndr, sch) or one equal to such, and
|
||
let OutSndr be the type decltype((out_sndr))[.](#6.sentence-1)
|
||
|
||
Let out_rcvr be a subexpression denoting a receiver
|
||
that has an environment of type Env such that [sender_in](exec.snd.concepts#concept:sender_in "33.9.3 Sender concepts [exec.snd.concepts]")<OutSndr, Env> is true[.](#6.sentence-2)
|
||
|
||
Let op be an lvalue referring to the operation state
|
||
that results from connecting out_sndr with out_rcvr[.](#6.sentence-3)
|
||
|
||
Calling start(op) shall
|
||
start sndr on the current execution agent and
|
||
execute completion operations on out_rcvr on an execution agent of the execution resource associated with sch[.](#6.sentence-4)
|
||
|
||
If scheduling onto sch fails,
|
||
an error completion on out_rcvr shall be executed
|
||
on an unspecified execution agent[.](#6.sentence-5)
|