2025-01-12 20:37:50 +08:00

52 lines
2.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[/
/ 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
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 receivers 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]