1
- //
1
+ //
2
2
// Distributed under the Boost Software License, Version 1.0. (See accompanying
3
3
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4
4
//
5
5
6
6
#pragma once
7
7
8
8
#include < concepts>
9
+ #include < any>
10
+ #include < cassert>
11
+ #include < cstdlib>
12
+ #include < memory>
13
+ #include < type_traits>
14
+ #include < atomic>
15
+ #ifdef DISABLE_EXCEPTION
16
+ #include < optional>
17
+ #else
9
18
#include < variant>
19
+ #endif
10
20
11
21
#if defined(__has_include)
12
22
@@ -30,14 +40,7 @@ namespace std
30
40
31
41
#endif
32
42
33
- #include < any>
34
- #include < cassert>
35
- #include < cstdlib>
36
- #include < functional>
37
- #include < memory>
38
- #include < type_traits>
39
- #include < atomic>
40
- #include < cassert>
43
+
41
44
42
45
#if defined(DEBUG) || defined(_DEBUG)
43
46
#if defined(ENABLE_DEBUG_CORO_LEAK)
@@ -225,44 +228,58 @@ namespace ucoro
225
228
226
229
void unhandled_exception () noexcept
227
230
{
231
+ #ifndef DISABLE_EXCEPTION
228
232
value_.template emplace <std::exception_ptr>(std::current_exception ());
233
+ #endif
229
234
}
230
235
231
236
T get_value () const
232
237
{
238
+ #ifndef DISABLE_EXCEPTION
233
239
if (std::holds_alternative<std::exception_ptr>(value_))
234
240
{
235
241
std::rethrow_exception (std::get<std::exception_ptr>(value_));
236
242
}
237
243
238
244
return std::get<T>(value_);
245
+ #else
246
+ return value_.value ();
247
+ #endif
239
248
}
240
-
249
+ # ifndef DISABLE_EXCEPTION
241
250
std::variant<std::exception_ptr, T> value_{nullptr };
251
+ #else
252
+ std::optional<T> value_;
253
+ #endif
242
254
};
243
255
244
256
// ////////////////////////////////////////////////////////////////////////
245
257
// 存储协程 promise 的返回值 void 的特化实现
246
258
template <>
247
259
struct awaitable_promise_value <void >
248
260
{
261
+ #ifndef DISABLE_EXCEPTION
249
262
std::exception_ptr exception_{nullptr };
250
-
263
+ # endif
251
264
constexpr void return_void () noexcept
252
265
{
253
266
}
254
267
255
268
void unhandled_exception () noexcept
256
269
{
270
+ #ifndef DISABLE_EXCEPTION
257
271
exception_ = std::current_exception ();
272
+ #endif
258
273
}
259
274
260
275
void get_value () const
261
276
{
277
+ #ifndef DISABLE_EXCEPTION
262
278
if (exception_)
263
279
{
264
280
std::rethrow_exception (exception_);
265
281
}
282
+ #endif
266
283
}
267
284
};
268
285
0 commit comments