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]
|