|
14 | 14 | // * limitations under the License.
|
15 | 15 | // */
|
16 | 16 |
|
17 |
| -// #include <catch2/catch.hpp> |
18 |
| -// #include <stdexec/execution.hpp> |
19 |
| -// #include <test_common/receivers.hpp> |
20 |
| - |
21 |
| -// namespace ex = stdexec; |
22 |
| - |
23 |
| -// struct recv_no_set_value { |
24 |
| -// friend void tag_invoke(ex::set_stopped_t, recv_no_set_value) noexcept {} |
25 |
| -// friend void tag_invoke(ex::set_error_t, recv_no_set_value, std::exception_ptr) noexcept {} |
26 |
| -// friend ex::env<> tag_invoke(ex::get_env_t, const recv_no_set_value&) noexcept { |
27 |
| -// return {}; |
28 |
| -// } |
29 |
| -// }; |
30 |
| - |
31 |
| -// struct recv_set_value_except { |
32 |
| -// friend void tag_invoke(ex::set_value_t, recv_set_value_except) {} |
33 |
| -// friend void tag_invoke(ex::set_stopped_t, recv_set_value_except) noexcept {} |
34 |
| -// friend void tag_invoke(ex::set_error_t, recv_set_value_except, std::exception_ptr) noexcept {} |
35 |
| -// friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_value_except&) noexcept { |
36 |
| -// return {}; |
37 |
| -// } |
38 |
| -// }; |
39 |
| - |
40 |
| -// struct recv_set_value_noexcept { |
41 |
| -// friend void tag_invoke(ex::set_value_t, recv_set_value_noexcept) noexcept {} |
42 |
| -// friend void tag_invoke(ex::set_stopped_t, recv_set_value_noexcept) noexcept {} |
43 |
| -// friend void tag_invoke(ex::set_error_t, recv_set_value_noexcept, std::exception_ptr) noexcept |
44 |
| -// {} friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_value_noexcept&) noexcept { |
45 |
| -// return {}; |
46 |
| -// } |
47 |
| -// }; |
48 |
| - |
49 |
| -// struct recv_set_error_except { |
50 |
| -// friend void tag_invoke(ex::set_value_t, recv_set_error_except) noexcept {} |
51 |
| -// friend void tag_invoke(ex::set_stopped_t, recv_set_error_except) noexcept {} |
52 |
| -// friend void tag_invoke(ex::set_error_t, recv_set_error_except, std::exception_ptr) { |
53 |
| -// throw std::logic_error{"err"}; |
54 |
| -// } |
55 |
| -// friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_error_except&) noexcept { |
56 |
| -// return {}; |
57 |
| -// } |
58 |
| -// }; |
59 |
| -// struct recv_set_stopped_except { |
60 |
| -// friend void tag_invoke(ex::set_value_t, recv_set_stopped_except) noexcept {} |
61 |
| -// friend void tag_invoke(ex::set_stopped_t, recv_set_stopped_except) { throw |
62 |
| -// std::logic_error{"err"}; } friend void tag_invoke(ex::set_error_t, recv_set_stopped_except, |
63 |
| -// std::exception_ptr) noexcept {} friend ex::env<> tag_invoke(ex::get_env_t, const |
64 |
| -// recv_set_stopped_except&) noexcept { |
65 |
| -// return {}; |
66 |
| -// } |
67 |
| -// }; |
68 |
| - |
69 |
| -// struct recv_non_movable { |
70 |
| -// recv_non_movable() = default; |
71 |
| -// ~recv_non_movable() = default; |
72 |
| -// recv_non_movable(recv_non_movable&&) = delete; |
73 |
| -// recv_non_movable& operator=(recv_non_movable&&) = delete; |
74 |
| -// recv_non_movable(const recv_non_movable&) = default; |
75 |
| -// recv_non_movable& operator=(const recv_non_movable&) = default; |
76 |
| - |
77 |
| -// friend void tag_invoke(ex::set_value_t, recv_non_movable) noexcept {} |
78 |
| -// friend void tag_invoke(ex::set_stopped_t, recv_non_movable) noexcept {} |
79 |
| -// friend void tag_invoke(ex::set_error_t, recv_non_movable, std::exception_ptr) noexcept {} |
80 |
| -// friend ex::env<> tag_invoke(ex::get_env_t, const recv_non_movable&) noexcept { |
81 |
| -// return {}; |
82 |
| -// } |
83 |
| -// }; |
84 |
| - |
85 |
| -// TEST_CASE("receiver types satisfy the receiver concept", "[concepts][receiver]") { |
86 |
| -// using namespace empty_recv; |
87 |
| - |
88 |
| -// REQUIRE(ex::receiver<recv0>); |
89 |
| -// REQUIRE(ex::receiver<recv_int>); |
90 |
| -// REQUIRE(ex::receiver<recv0_ec>); |
91 |
| -// REQUIRE(ex::receiver<recv_int_ec>); |
92 |
| -// REQUIRE(ex::receiver<recv0_ec, std::error_code>); |
93 |
| -// REQUIRE(ex::receiver<recv_int_ec, std::error_code>); |
94 |
| -// REQUIRE(ex::receiver<expect_void_receiver>); |
95 |
| -// REQUIRE(ex::receiver<expect_void_receiver_ex>); |
96 |
| -// REQUIRE(ex::receiver<expect_value_receiver<ex::env<>, int>>); |
97 |
| -// REQUIRE(ex::receiver<expect_value_receiver<ex::env<>, double>>); |
98 |
| -// REQUIRE(ex::receiver<expect_stopped_receiver>); |
99 |
| -// REQUIRE(ex::receiver<expect_stopped_receiver_ex>); |
100 |
| -// REQUIRE(ex::receiver<expect_error_receiver>); |
101 |
| -// REQUIRE(ex::receiver<expect_error_receiver_ex>); |
102 |
| -// REQUIRE(ex::receiver<logging_receiver>); |
103 |
| -// } |
104 |
| - |
105 |
| -// TEST_CASE("receiver types satisfy the receiver_of concept", "[concepts][receiver]") { |
106 |
| -// using namespace empty_recv; |
107 |
| - |
108 |
| -// REQUIRE(ex::receiver_of<recv0>); |
109 |
| -// REQUIRE(ex::receiver_of<recv_int, int>); |
110 |
| -// REQUIRE(ex::receiver_of<recv0_ec>); |
111 |
| -// REQUIRE(ex::receiver_of<recv_int_ec, int>); |
112 |
| -// REQUIRE(ex::receiver_of<expect_void_receiver>); |
113 |
| -// REQUIRE(ex::receiver_of<expect_void_receiver_ex>); |
114 |
| -// REQUIRE(ex::receiver_of<expect_value_receiver<ex::env<>, int>, int>); |
115 |
| -// REQUIRE(ex::receiver_of<expect_value_receiver<ex::env<>, double>, double>); |
116 |
| -// REQUIRE(ex::receiver_of<expect_stopped_receiver, char>); |
117 |
| -// REQUIRE(ex::receiver_of<expect_stopped_receiver_ex, char>); |
118 |
| -// REQUIRE(ex::receiver_of<expect_error_receiver, char>); |
119 |
| -// REQUIRE(ex::receiver_of<expect_error_receiver_ex, char>); |
120 |
| -// REQUIRE(ex::receiver_of<logging_receiver>); |
121 |
| -// } |
122 |
| - |
123 |
| -// TEST_CASE( |
124 |
| -// "receiver type w/o set_value models receiver but not receiver_of", "[concepts][receiver]") { |
125 |
| -// REQUIRE(ex::receiver<recv_no_set_value>); |
126 |
| -// REQUIRE(!ex::receiver_of<recv_no_set_value>); |
127 |
| -// } |
128 |
| - |
129 |
| -// TEST_CASE("type with set_value noexcept is a receiver", "[concepts][receiver]") { |
130 |
| -// REQUIRE(ex::receiver<recv_set_value_noexcept>); |
131 |
| -// REQUIRE(ex::receiver_of<recv_set_value_noexcept>); |
132 |
| -// } |
133 |
| -// TEST_CASE("type with throwing set_value is not a receiver", "[concepts][receiver]") { |
134 |
| -// REQUIRE(!ex::receiver<recv_set_value_except>); |
135 |
| -// REQUIRE(!ex::receiver_of<recv_set_value_except>); |
136 |
| -// } |
137 |
| -// TEST_CASE("type with throwing set_error is not a receiver", "[concepts][receiver]") { |
138 |
| -// REQUIRE(!ex::receiver<recv_set_error_except>); |
139 |
| -// REQUIRE(!ex::receiver_of<recv_set_error_except>); |
140 |
| -// } |
141 |
| -// TEST_CASE("type with throwing set_stopped is not a receiver", "[concepts][receiver]") { |
142 |
| -// REQUIRE(!ex::receiver<recv_set_stopped_except>); |
143 |
| -// REQUIRE(!ex::receiver_of<recv_set_stopped_except>); |
144 |
| -// } |
145 |
| - |
146 |
| -// TEST_CASE("non-movable type is not a receiver", "[concepts][receiver]") { |
147 |
| -// REQUIRE(!ex::receiver<recv_non_movable>); |
148 |
| -// REQUIRE(!ex::receiver_of<recv_non_movable>); |
149 |
| -// } |
| 17 | +#include <catch2/catch.hpp> |
| 18 | +#include <stdexec/execution.hpp> |
| 19 | +#include <test_common/receivers.hpp> |
| 20 | + |
| 21 | +namespace ex = stdexec; |
| 22 | + |
| 23 | +struct recv_no_set_value { |
| 24 | + using receiver_concept = stdexec::receiver_t; |
| 25 | + |
| 26 | + friend void tag_invoke(ex::set_stopped_t, recv_no_set_value) noexcept {} |
| 27 | + friend void tag_invoke(ex::set_error_t, recv_no_set_value, std::exception_ptr) noexcept {} |
| 28 | + friend ex::env<> tag_invoke(ex::get_env_t, const recv_no_set_value&) noexcept { |
| 29 | + return {}; |
| 30 | + } |
| 31 | +}; |
| 32 | + |
| 33 | +struct recv_set_value_except { |
| 34 | + using receiver_concept = stdexec::receiver_t; |
| 35 | + |
| 36 | + friend void tag_invoke(ex::set_value_t, recv_set_value_except) {} |
| 37 | + friend void tag_invoke(ex::set_stopped_t, recv_set_value_except) noexcept {} |
| 38 | + friend void tag_invoke(ex::set_error_t, recv_set_value_except, std::exception_ptr) noexcept {} |
| 39 | + friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_value_except&) noexcept { |
| 40 | + return {}; |
| 41 | + } |
| 42 | +}; |
| 43 | + |
| 44 | +struct recv_set_value_noexcept { |
| 45 | + using receiver_concept = stdexec::receiver_t; |
| 46 | + |
| 47 | + friend void tag_invoke(ex::set_value_t, recv_set_value_noexcept) noexcept {} |
| 48 | + friend void tag_invoke(ex::set_stopped_t, recv_set_value_noexcept) noexcept {} |
| 49 | + friend void tag_invoke(ex::set_error_t, recv_set_value_noexcept, std::exception_ptr) noexcept |
| 50 | + {} friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_value_noexcept&) noexcept { |
| 51 | + return {}; |
| 52 | + } |
| 53 | +}; |
| 54 | + |
| 55 | +struct recv_set_error_except { |
| 56 | + using receiver_concept = stdexec::receiver_t; |
| 57 | + |
| 58 | + friend void tag_invoke(ex::set_value_t, recv_set_error_except) noexcept {} |
| 59 | + friend void tag_invoke(ex::set_stopped_t, recv_set_error_except) noexcept {} |
| 60 | + friend void tag_invoke(ex::set_error_t, recv_set_error_except, std::exception_ptr) { |
| 61 | + throw std::logic_error{"err"}; |
| 62 | + } |
| 63 | + friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_error_except&) noexcept { |
| 64 | + return {}; |
| 65 | + } |
| 66 | +}; |
| 67 | +struct recv_set_stopped_except { |
| 68 | + using receiver_concept = stdexec::receiver_t; |
| 69 | + |
| 70 | + friend void tag_invoke(ex::set_value_t, recv_set_stopped_except) noexcept {} |
| 71 | + friend void tag_invoke(ex::set_stopped_t, recv_set_stopped_except) { throw |
| 72 | + std::logic_error{"err"}; } friend void tag_invoke(ex::set_error_t, recv_set_stopped_except, |
| 73 | + std::exception_ptr) noexcept {} friend ex::env<> tag_invoke(ex::get_env_t, const |
| 74 | + recv_set_stopped_except&) noexcept { |
| 75 | + return {}; |
| 76 | + } |
| 77 | +}; |
| 78 | + |
| 79 | +struct recv_non_movable { |
| 80 | + using receiver_concept = stdexec::receiver_t; |
| 81 | + |
| 82 | + recv_non_movable() = default; |
| 83 | + ~recv_non_movable() = default; |
| 84 | + recv_non_movable(recv_non_movable&&) = delete; |
| 85 | + recv_non_movable& operator=(recv_non_movable&&) = delete; |
| 86 | + recv_non_movable(const recv_non_movable&) = default; |
| 87 | + recv_non_movable& operator=(const recv_non_movable&) = default; |
| 88 | + |
| 89 | + friend void tag_invoke(ex::set_value_t, recv_non_movable) noexcept {} |
| 90 | + friend void tag_invoke(ex::set_stopped_t, recv_non_movable) noexcept {} |
| 91 | + friend void tag_invoke(ex::set_error_t, recv_non_movable, std::exception_ptr) noexcept {} |
| 92 | + friend ex::env<> tag_invoke(ex::get_env_t, const recv_non_movable&) noexcept { |
| 93 | + return {}; |
| 94 | + } |
| 95 | +}; |
| 96 | + |
| 97 | +TEST_CASE("receiver types satisfy the receiver concept", "[concepts][receiver]") { |
| 98 | + using namespace empty_recv; |
| 99 | + |
| 100 | + REQUIRE(ex::receiver<recv0>); |
| 101 | + REQUIRE(ex::receiver<recv_int>); |
| 102 | + REQUIRE(ex::receiver<recv0_ec>); |
| 103 | + REQUIRE(ex::receiver<recv_int_ec>); |
| 104 | + REQUIRE(ex::receiver<expect_void_receiver<>>); |
| 105 | + REQUIRE(ex::receiver<expect_void_receiver_ex>); |
| 106 | + REQUIRE(ex::receiver<expect_value_receiver<ex::env<>, int>>); |
| 107 | + REQUIRE(ex::receiver<expect_value_receiver<ex::env<>, double>>); |
| 108 | + REQUIRE(ex::receiver<expect_stopped_receiver<>>); |
| 109 | + REQUIRE(ex::receiver<expect_stopped_receiver_ex<>>); |
| 110 | + REQUIRE(ex::receiver<expect_error_receiver<>>); |
| 111 | + REQUIRE(ex::receiver<expect_error_receiver_ex<std::error_code>>); |
| 112 | + REQUIRE(ex::receiver<logging_receiver>); |
| 113 | +} |
| 114 | + |
| 115 | +TEST_CASE("receiver types satisfy the receiver_of concept", "[concepts][receiver]") { |
| 116 | + using namespace empty_recv; |
| 117 | + |
| 118 | + REQUIRE(ex::receiver_of<recv_int, ex::completion_signatures<ex::set_value_t(int)>>); |
| 119 | + REQUIRE(ex::receiver_of<recv0_ec, ex::completion_signatures<ex::set_error_t(std::error_code)>>); |
| 120 | + REQUIRE(ex::receiver_of<recv_int_ec, ex::completion_signatures<ex::set_error_t(std::error_code)>>); |
| 121 | + REQUIRE(ex::receiver_of<recv_int_ec, ex::completion_signatures<ex::set_value_t(int)>>); |
| 122 | + REQUIRE(ex::receiver_of<expect_value_receiver<ex::env<>, int>, ex::completion_signatures<ex::set_value_t(int)>>); |
| 123 | + REQUIRE(ex::receiver_of<expect_value_receiver<ex::env<>, double>, ex::completion_signatures<ex::set_value_t(double)>>); |
| 124 | + REQUIRE(ex::receiver_of<expect_stopped_receiver<>, ex::completion_signatures<ex::set_value_t(char)>>); |
| 125 | + REQUIRE(ex::receiver_of<expect_stopped_receiver_ex<>, ex::completion_signatures<ex::set_value_t(char)>>); |
| 126 | + REQUIRE(ex::receiver_of<expect_error_receiver<>, ex::completion_signatures<ex::set_value_t(char)>>); |
| 127 | + REQUIRE(ex::receiver_of<expect_error_receiver_ex<std::error_code>, ex::completion_signatures<ex::set_value_t(char)>>); |
| 128 | + REQUIRE(ex::receiver_of<logging_receiver, ex::completion_signatures<ex::set_value_t(char)>>); |
| 129 | +} |
| 130 | + |
| 131 | +TEST_CASE( |
| 132 | + "receiver type w/o set_value models receiver but not receiver_of", "[concepts][receiver]") { |
| 133 | + REQUIRE(ex::receiver<recv_no_set_value>); |
| 134 | + REQUIRE(!ex::receiver_of<recv_no_set_value, ex::completion_signatures<ex::set_value_t()>>); |
| 135 | +} |
| 136 | + |
| 137 | +TEST_CASE("type with set_value noexcept is a receiver", "[concepts][receiver]") { |
| 138 | + REQUIRE(ex::receiver<recv_set_value_noexcept>); |
| 139 | + REQUIRE(ex::receiver_of<recv_set_value_noexcept, ex::completion_signatures<ex::set_value_t()>>); |
| 140 | +} |
| 141 | + |
| 142 | +TEST_CASE("non-movable type is not a receiver", "[concepts][receiver]") { |
| 143 | + REQUIRE(!ex::receiver<recv_non_movable>); |
| 144 | + REQUIRE(!ex::receiver_of<recv_non_movable, ex::completion_signatures<ex::set_value_t()>>); |
| 145 | +} |
0 commit comments