@@ -83,11 +83,19 @@ auto interpret_as_result(std::tuple<Error, Arg> && args) -> system::result<Arg,
83
83
struct as_result_tag {};
84
84
struct as_tuple_tag {};
85
85
86
- template <awaitable Aw>
86
+ template <awaitable_type Aw>
87
87
struct as_result_t
88
88
{
89
89
as_result_t (Aw && aw) : aw_(std::forward<Aw>(aw)) {}
90
90
91
+ template <typename Aw_>
92
+ requires requires (Aw_ && aw) {{std::forward<Aw_>(aw).operator co_await ()} -> awaitable_type;}
93
+ as_result_t (Aw_ && aw) : aw_(std::forward<Aw_>(aw).operator co_await ()) {}
94
+
95
+ template <typename Aw_>
96
+ requires requires (Aw_ && aw) {{operator co_await (std::forward<Aw_>(aw))} -> awaitable_type;}
97
+ as_result_t (Aw_ && aw) : aw_(operator co_await (std::forward<Aw_>(aw))) {}
98
+
91
99
bool await_ready () { return aw_.await_ready ();}
92
100
template <typename T>
93
101
auto await_suspend (std::coroutine_handle<T> h) { return aw_.await_suspend (h);}
@@ -133,9 +141,17 @@ struct as_result_t
133
141
};
134
142
135
143
136
- template <awaitable Aw>
144
+ template <awaitable_type Aw>
137
145
as_result_t (Aw &&) -> as_result_t<Aw>;
138
146
147
+ template <typename Aw_>
148
+ requires requires (Aw_ && aw) {{std::forward<Aw_>(aw).operator co_await ()} -> awaitable_type;}
149
+ as_result_t (Aw_ && aw) -> as_result_t <decltype(std::forward<Aw_>(aw).operator co_await ())>;
150
+
151
+ template <typename Aw_>
152
+ requires requires (Aw_ && aw) {{operator co_await (std::forward<Aw_>(aw))} -> awaitable_type;}
153
+ as_result_t (Aw_ && aw) -> as_result_t <decltype(operator co_await (std::forward<Aw_>(aw)))>;
154
+
139
155
template <awaitable_type Aw>
140
156
auto as_result (Aw && aw) -> as_result_t<Aw>
141
157
{
@@ -154,7 +170,7 @@ auto as_result(Aw && aw)
154
170
Aw aw;
155
171
auto operator co_await ()
156
172
{
157
- return as_result (std::forward<Aw>(aw). operator co_await ( ));
173
+ return as_result_t (std::forward<Aw>(aw));
158
174
}
159
175
};
160
176
return lazy_tuple{std::forward<Aw>(aw)};
@@ -172,7 +188,7 @@ auto as_result(Aw && aw)
172
188
Aw aw;
173
189
auto operator co_await ()
174
190
{
175
- return as_result ( operator co_await ( std::forward<Aw>(aw) ));
191
+ return as_result_t ( std::forward<Aw>(aw));
176
192
}
177
193
};
178
194
return lazy_tuple{std::forward<Aw>(aw)};
@@ -185,6 +201,15 @@ struct as_tuple_t
185
201
{
186
202
as_tuple_t (Aw && aw) : aw_(std::forward<Aw>(aw)) {}
187
203
204
+ template <typename Aw_>
205
+ requires requires (Aw_ && aw) {{std::forward<Aw_>(aw).operator co_await ()} -> awaitable_type;}
206
+ as_tuple_t (Aw_ && aw) : aw_(std::forward<Aw_>(aw).operator co_await ()) {}
207
+
208
+ template <typename Aw_>
209
+ requires requires (Aw_ && aw) {{operator co_await (std::forward<Aw_>(aw))} -> awaitable_type;}
210
+ as_tuple_t (Aw_ && aw) : aw_(operator co_await (std::forward<Aw_>(aw))) {}
211
+
212
+
188
213
bool await_ready () { return aw_.await_ready ();}
189
214
template <typename T>
190
215
auto await_suspend (std::coroutine_handle<T> h) { return aw_.await_suspend (h);}
@@ -257,9 +282,17 @@ struct as_tuple_t
257
282
};
258
283
259
284
260
- template <awaitable Aw>
285
+ template <awaitable_type Aw>
261
286
as_tuple_t (Aw &&) -> as_tuple_t<Aw>;
262
287
288
+ template <typename Aw_>
289
+ requires requires (Aw_ && aw) {{std::forward<Aw_>(aw).operator co_await ()} -> awaitable_type;}
290
+ as_tuple_t (Aw_ && aw) -> as_tuple_t <decltype(std::forward<Aw_>(aw).operator co_await ())>;
291
+
292
+ template <typename Aw_>
293
+ requires requires (Aw_ && aw) {{operator co_await (std::forward<Aw_>(aw))} -> awaitable_type;}
294
+ as_tuple_t (Aw_ && aw) -> as_tuple_t <decltype(operator co_await (std::forward<Aw_>(aw)))>;
295
+
263
296
264
297
template <awaitable_type Aw>
265
298
auto as_tuple (Aw && aw) -> as_tuple_t<Aw>
@@ -279,7 +312,7 @@ auto as_tuple(Aw && aw)
279
312
Aw aw;
280
313
auto operator co_await ()
281
314
{
282
- return as_tuple (std::forward<Aw>(aw). operator co_await ( ));
315
+ return as_tuple_t (std::forward<Aw>(aw));
283
316
}
284
317
};
285
318
return lazy_tuple{std::forward<Aw>(aw)};
@@ -297,7 +330,7 @@ auto as_tuple(Aw && aw)
297
330
Aw aw;
298
331
auto operator co_await ()
299
332
{
300
- return as_tuple ( operator co_await ( std::forward<Aw>(aw) ));
333
+ return as_tuple_t ( std::forward<Aw>(aw));
301
334
}
302
335
};
303
336
return lazy_tuple{std::forward<Aw>(aw)};
0 commit comments