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

129 lines
5.7 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.cmplsig]
# 33 Execution control library [[exec]](./#exec)
## 33.10 Completion signatures [exec.cmplsig]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L6027)
completion_signatures is a type
that encodes a set of completion signatures ([[exec.async.ops]](exec.async.ops "33.3Asynchronous operations"))[.](#1.sentence-1)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L6031)
[*Example [1](#example-1)*: struct my_sender {using sender_concept = sender_t; using completion_signatures = execution::completion_signatures< set_value_t(),
set_value_t(int, float),
set_error_t(exception_ptr),
set_error_t(error_code),
set_stopped_t()>;};
Declares my_sender to be a sender
that can complete by calling one of the following
for a receiver expression rcvr:
- [(2.1)](#2.1)
set_value(rcvr)
- [(2.2)](#2.2)
set_value(rcvr, int{...}, float{...})
- [(2.3)](#2.3)
set_error(rcvr, exception_ptr{...})
- [(2.4)](#2.4)
set_error(rcvr, error_code{...})
- [(2.5)](#2.5)
set_stopped(rcvr)
— *end example*]
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L6057)
This subclause makes use of the following exposition-only entities:template<class Fn>concept [*completion-signature*](#concept:completion-signature "33.10Completion signatures[exec.cmplsig]") = *see below*;
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L6064)
A type Fn satisfies [*completion-signature*](#concept:completion-signature "33.10Completion signatures[exec.cmplsig]") if and only if it is a function type with one of the following forms:
- [(4.1)](#4.1)
set_value_t(Vs...),
where Vs is a pack of object or reference types[.](#4.1.sentence-1)
- [(4.2)](#4.2)
set_error_t(Err),
where Err is an object or reference type[.](#4.2.sentence-1)
- [(4.3)](#4.3)
set_stopped_t()
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L6078)
template<bool>struct *indirect-meta-apply* {template<template<class...> class T, class... As>using *meta-apply* = T<As...>; // *exposition only*};
template<class...>concept [*always-true*](#concept:always-true "33.10Completion signatures[exec.cmplsig]") = true; // *exposition only*template<class Tag, [*valid-completion-signatures*](execution.syn#concept:valid-completion-signatures "33.4Header <execution> synopsis[execution.syn]") Completions, template<class...> class Tuple, template<class...> class Variant>using *gather-signatures* = *see below*;
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L6096)
Let Fns be a pack of the arguments of
the completion_signatures specialization named by Completions,
let TagFns be a pack of the function types in Fns whose return types are Tag, and
let Tsn be a pack of the function argument types
in the n-th type in TagFns[.](#6.sentence-1)
Then, given two variadic templates Tuple and Variant,
the type *gather-signatures*<Tag, Completions, Tuple, Variant> names the type*META-APPLY*(Variant, *META-APPLY*(Tuple, Ts0...), *META-APPLY*(Tuple, Ts1...),
…, *META-APPLY*(Tuple, Tsm−1...)) where m is the size of the pack TagFns andMETA-APPLY(T, As...) is equivalent to:typename *indirect-meta-apply*<*always-true*<As...>>::template *meta-apply*<T, As...>
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L6118)
[*Note [1](#note-1)*:
The purpose of *META-APPLY* is to make it valid
to use non-variadic templates as Variant and Tuple arguments
to *gather-signatures*[.](#7.sentence-1)
— *end note*]
[8](#8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L6125)
[🔗](#lib:execution::completion_signatures)
namespace std::execution {template<[*completion-signature*](#concept:completion-signature "33.10Completion signatures[exec.cmplsig]")... Fns>struct completion_signatures {template<class Tag>static constexpr size_t *count-of*(Tag) { return *see below*; }template<class Fn>static constexpr void *for-each*(Fn&& fn) { // *exposition only*(std::forward<Fn>(fn)(static_cast<Fns*>(nullptr)), ...); }}; template<class Sndr, class Env = env<>, template<class...> class Tuple = *decayed-tuple*, template<class...> class Variant = *variant-or-empty*>requires [sender_in](exec.snd.concepts#concept:sender_in "33.9.3Sender concepts[exec.snd.concepts]")<Sndr, Env>using value_types_of_t =*gather-signatures*<set_value_t, completion_signatures_of_t<Sndr, Env>, Tuple, Variant>; template<class Sndr, class Env = env<>, template<class...> class Variant = *variant-or-empty*>requires [sender_in](exec.snd.concepts#concept:sender_in "33.9.3Sender concepts[exec.snd.concepts]")<Sndr, Env>using error_types_of_t =*gather-signatures*<set_error_t, completion_signatures_of_t<Sndr, Env>,
type_identity_t, Variant>; template<class Sndr, class Env = env<>>requires [sender_in](exec.snd.concepts#concept:sender_in "33.9.3Sender concepts[exec.snd.concepts]")<Sndr, Env>constexpr bool sends_stopped =![same_as](concept.same#concept:same_as "18.4.2Concept same_­as[concept.same]")<*type-list*<>, *gather-signatures*<set_stopped_t, completion_signatures_of_t<Sndr, Env>, *type-list*, *type-list*>>;}
[9](#9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L6165)
For a subexpression tag,
let Tag be the decayed type of tag[.](#9.sentence-1)
completion_signatures<Fns...>::*count-of*(
tag) returns the count of function types in Fns... that
are of the form Tag(Ts...) where Ts is a pack of types[.](#9.sentence-2)