blob: 183c617af2825722eaf3ffa0cb38b94cb09d3469 [file] [log] [blame]
[/
/ Copyright (c) 2003-2021 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
receivers ['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 receivers 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 receivers 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 receivers completion-signal operations has completed
non-exceptionally, the receiver contract has been satisfied.
[endsect]