52 lines
2.1 KiB
Plaintext
52 lines
2.1 KiB
Plaintext
[/
|
||
/ Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
||
/
|
||
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||
/]
|
||
|
||
[section:Receiver Receiver concepts]
|
||
|
||
A receiver represents the continuation of an asynchronous operation. An
|
||
asynchronous operation may complete with a (possibly empty) set of values, an
|
||
error, or it may be cancelled. A receiver has three principal operations
|
||
corresponding to the three ways an asynchronous operation may complete:
|
||
`set_value`, `set_error`, and `set_done`. These are collectively known as a
|
||
receiver’s ['completion-signal operations].
|
||
|
||
|
||
template<class T, class E = exception_ptr>
|
||
concept receiver =
|
||
move_constructible<remove_cvref_t<T>> &&
|
||
constructible_from<remove_cvref_t<T>, T> &&
|
||
requires(remove_cvref_t<T>&& t, E&& e) {
|
||
{ execution::set_done(std::move(t)) } noexcept;
|
||
{ execution::set_error(std::move(t), (E&&) e) } noexcept;
|
||
};
|
||
|
||
template<class T, class... An>
|
||
concept receiver_of =
|
||
receiver<T> &&
|
||
requires(remove_cvref_t<T>&& t, An&&... an) {
|
||
execution::set_value(std::move(t), (An&&) an...);
|
||
};
|
||
|
||
The receiver’s completion-signal operations have semantic requirements that are
|
||
collectively known as the ['receiver contract], described below:
|
||
|
||
* None of a receiver’s completion-signal operations shall be invoked before
|
||
`execution::start` has been called on the operation state object that was
|
||
returned by `execution::connect` to connect that receiver to a sender.
|
||
|
||
* Once `execution::start` has been called on the operation state object,
|
||
exactly one of the receiver’s completion-signal operations shall complete
|
||
non-exceptionally before the receiver is destroyed.
|
||
|
||
* If `execution::set_value` exits with an exception, it is still valid to call
|
||
`execution::set_error` or `execution::set_done` on the receiver.
|
||
|
||
Once one of a receiver’s completion-signal operations has completed
|
||
non-exceptionally, the receiver contract has been satisfied.
|
||
|
||
[endsect]
|