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