1 /*
2  * Copyright (c) 2023 NVIDIA Corporation
3  *
4  * Licensed under the Apache License Version 2.0 with LLVM Exceptions
5  * (the "License"); you may not use this file except in compliance with
6  * the License. You may obtain a copy of the License at
7  *
8  *   https://llvm.org/LICENSE.txt
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17 
18 #include "__concepts.hpp"
19 #include "__config.hpp"
20 #include "__meta.hpp"
21 #include "__type_traits.hpp"
22 
23 namespace stdexec
24 {
25 struct __none_such;
26 
27 //////////////////////////////////////////////////////////////////////////////////////////////////
28 struct default_domain;
29 
30 //////////////////////////////////////////////////////////////////////////////////////////////////
31 namespace __receivers
32 {
33 struct set_value_t;
34 struct set_error_t;
35 struct set_stopped_t;
36 } // namespace __receivers
37 
38 using __receivers::set_error_t;
39 using __receivers::set_stopped_t;
40 using __receivers::set_value_t;
41 extern const set_value_t set_value;
42 extern const set_error_t set_error;
43 extern const set_stopped_t set_stopped;
44 
45 template <class _Tag>
46 concept __completion_tag =
47     __one_of<_Tag, set_value_t, set_error_t, set_stopped_t>;
48 
49 struct receiver_t;
50 
51 template <class _Sender>
52 extern const bool enable_receiver;
53 
54 //////////////////////////////////////////////////////////////////////////////////////////////////
55 namespace __env
56 {
57 struct get_env_t;
58 
59 struct empty_env
60 {
61     using __t = empty_env;
62     using __id = empty_env;
63 };
64 } // namespace __env
65 
66 using __env::empty_env;
67 using __env::get_env_t;
68 extern const get_env_t get_env;
69 
70 template <class _EnvProvider>
71 using env_of_t = __call_result_t<get_env_t, _EnvProvider>;
72 
73 //////////////////////////////////////////////////////////////////////////////////////////////////
74 enum class forward_progress_guarantee
75 {
76     concurrent,
77     parallel,
78     weakly_parallel
79 };
80 
81 namespace __queries
82 {
83 struct forwarding_query_t;
84 struct execute_may_block_caller_t;
85 struct get_forward_progress_guarantee_t;
86 struct __has_algorithm_customizations_t;
87 struct get_scheduler_t;
88 struct get_delegatee_scheduler_t;
89 struct get_allocator_t;
90 struct get_stop_token_t;
91 template <__completion_tag _CPO>
92 struct get_completion_scheduler_t;
93 } // namespace __queries
94 
95 using __queries::__has_algorithm_customizations_t;
96 using __queries::execute_may_block_caller_t;
97 using __queries::forwarding_query_t;
98 using __queries::get_allocator_t;
99 using __queries::get_completion_scheduler_t;
100 using __queries::get_delegatee_scheduler_t;
101 using __queries::get_forward_progress_guarantee_t;
102 using __queries::get_scheduler_t;
103 using __queries::get_stop_token_t;
104 
105 extern const forwarding_query_t forwarding_query;
106 extern const execute_may_block_caller_t execute_may_block_caller;
107 extern const __has_algorithm_customizations_t __has_algorithm_customizations;
108 extern const get_forward_progress_guarantee_t get_forward_progress_guarantee;
109 extern const get_scheduler_t get_scheduler;
110 extern const get_delegatee_scheduler_t get_delegatee_scheduler;
111 extern const get_allocator_t get_allocator;
112 extern const get_stop_token_t get_stop_token;
113 template <__completion_tag _CPO>
114 extern const get_completion_scheduler_t<_CPO> get_completion_scheduler;
115 
116 template <class _Tp>
117 using stop_token_of_t = __decay_t<__call_result_t<get_stop_token_t, _Tp>>;
118 
119 template <class _Sender, class _CPO>
120 concept __has_completion_scheduler =
121     __callable<get_completion_scheduler_t<_CPO>, env_of_t<const _Sender&>>;
122 
123 template <class _Sender, class _CPO>
124 using __completion_scheduler_for =
125     __call_result_t<get_completion_scheduler_t<_CPO>, env_of_t<const _Sender&>>;
126 
127 //////////////////////////////////////////////////////////////////////////////////////////////////
128 namespace __get_completion_signatures
129 {
130 struct get_completion_signatures_t;
131 } // namespace __get_completion_signatures
132 
133 using __get_completion_signatures::get_completion_signatures_t;
134 extern const get_completion_signatures_t get_completion_signatures;
135 
136 //////////////////////////////////////////////////////////////////////////////////////////////////
137 namespace __connect
138 {
139 struct connect_t;
140 } // namespace __connect
141 
142 using __connect::connect_t;
143 extern const connect_t connect;
144 
145 template <class _Sender, class _Receiver>
146 using connect_result_t = __call_result_t<connect_t, _Sender, _Receiver>;
147 
148 template <class _Sender, class _Receiver>
149 concept __nothrow_connectable =
150     __nothrow_callable<connect_t, _Sender, _Receiver>;
151 
152 struct sender_t;
153 
154 template <class _Sender>
155 extern const bool enable_sender;
156 
157 //////////////////////////////////////////////////////////////////////////////////////////////////
158 namespace __start
159 {
160 struct start_t;
161 } // namespace __start
162 
163 using __start::start_t;
164 extern const start_t start;
165 
166 //////////////////////////////////////////////////////////////////////////////////////////////////
167 namespace __schedule
168 {
169 struct schedule_t;
170 } // namespace __schedule
171 
172 using __schedule::schedule_t;
173 extern const schedule_t schedule;
174 
175 //////////////////////////////////////////////////////////////////////////////////////////////////
176 namespace __as_awaitable
177 {
178 struct as_awaitable_t;
179 } // namespace __as_awaitable
180 
181 using __as_awaitable::as_awaitable_t;
182 extern const as_awaitable_t as_awaitable;
183 
184 //////////////////////////////////////////////////////////////////////////////////////////////////
185 namespace __transfer
186 {
187 struct transfer_t;
188 } // namespace __transfer
189 
190 using __transfer::transfer_t;
191 extern const transfer_t transfer;
192 
193 //////////////////////////////////////////////////////////////////////////////////////////////////
194 namespace __transfer_just
195 {
196 struct transfer_just_t;
197 } // namespace __transfer_just
198 
199 using __transfer_just::transfer_just_t;
200 extern const transfer_just_t transfer_just;
201 
202 //////////////////////////////////////////////////////////////////////////////////////////////////
203 namespace __bulk
204 {
205 struct bulk_t;
206 } // namespace __bulk
207 
208 using __bulk::bulk_t;
209 extern const bulk_t bulk;
210 
211 //////////////////////////////////////////////////////////////////////////////////////////////////
212 namespace __split
213 {
214 struct split_t;
215 struct __split_t;
216 } // namespace __split
217 
218 using __split::split_t;
219 extern const split_t split;
220 
221 //////////////////////////////////////////////////////////////////////////////////////////////////
222 namespace __ensure_started
223 {
224 struct ensure_started_t;
225 struct __ensure_started_t;
226 } // namespace __ensure_started
227 
228 using __ensure_started::ensure_started_t;
229 extern const ensure_started_t ensure_started;
230 
231 //////////////////////////////////////////////////////////////////////////////////////////////////
232 namespace __on_v2
233 {
234 struct on_t;
235 } // namespace __on_v2
236 
237 namespace v2
238 {
239 using __on_v2::on_t;
240 } // namespace v2
241 
242 namespace __detail
243 {
244 struct __sexpr_apply_t;
245 } // namespace __detail
246 
247 using __detail::__sexpr_apply_t;
248 extern const __sexpr_apply_t __sexpr_apply;
249 } // namespace stdexec
250 
251 template <class...>
print()252 [[deprecated]] void print()
253 {}
254 
255 template <class>
256 struct undef;
257