File: Receiver.qbk

package info (click to toggle)
boost1.74 1.74.0-9
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 464,084 kB
  • sloc: cpp: 3,338,324; xml: 131,293; python: 33,088; ansic: 14,336; asm: 4,034; sh: 3,351; makefile: 1,193; perl: 1,036; yacc: 478; php: 212; ruby: 102; lisp: 24; sql: 13; csh: 6
file content (51 lines) | stat: -rw-r--r-- 2,175 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[/
 / Copyright (c) 2003-2020 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]