5#include <libcopp/utils/config/libcopp_build_features.h>
19#if defined(LIBCOPP_MACRO_ENABLE_WIN_FIBER) && LIBCOPP_MACRO_ENABLE_WIN_FIBER
21# ifndef WIN32_LEAN_AND_MEAN
22# define WIN32_LEAN_AND_MEAN
27LIBCOPP_COPP_NAMESPACE_BEGIN
33 using ptr_type = LIBCOPP_COPP_NAMESPACE_ID::memory::intrusive_ptr<coroutine_context_fiber>;
40 using ptr_t = ptr_type;
42 using status_t = status_type;
43 using flag_t = flag_type;
52# if defined(LIBCOPP_MACRO_ENABLE_STD_EXCEPTION_PTR) && LIBCOPP_MACRO_ENABLE_STD_EXCEPTION_PTR
53 using coroutine_context_base::unhandle_exception_;
56 struct jump_src_data_t {
57 coroutine_context_fiber *from_co;
59 coroutine_context_fiber *to_co;
64 friend struct LIBCOPP_COPP_API_HEAD_ONLY libcopp_fiber_internal_api_set;
65 friend struct LIBCOPP_COPP_API_HEAD_ONLY fiber_context_tls_data_t;
74 LIBCOPP_COPP_API coroutine_context_fiber() LIBCOPP_MACRO_NOEXCEPT;
77 LIBCOPP_COPP_API ~coroutine_context_fiber();
80 coroutine_context_fiber(const coroutine_context_fiber &) = delete;
81 coroutine_context_fiber &operator=(const coroutine_context_fiber &) = delete;
82 coroutine_context_fiber(const coroutine_context_fiber &&) = delete;
83 coroutine_context_fiber &operator=(const coroutine_context_fiber &&) = delete;
94 static LIBCOPP_COPP_API
int create(coroutine_context_fiber *p, callback_type &&runner,
96 size_t private_buffer_size,
97 size_t stack_reserve_size_of_fiber = 0) LIBCOPP_MACRO_NOEXCEPT;
99 template <typename TRunner>
100 static LIBCOPP_COPP_API_HEAD_ONLY
int create(coroutine_context_fiber *p, TRunner *runner,
102 size_t private_buffer_size,
103 size_t stack_reserve_size_of_fiber = 0) LIBCOPP_MACRO_NOEXCEPT {
105 p, [runner](
void *private_data) {
return (*runner)(private_data); }, callee_stack, coroutine_size,
106 private_buffer_size, stack_reserve_size_of_fiber);
115 LIBCOPP_COPP_API
int start(
void *priv_data =
nullptr);
117# if defined(LIBCOPP_MACRO_ENABLE_STD_EXCEPTION_PTR) && LIBCOPP_MACRO_ENABLE_STD_EXCEPTION_PTR
124 LIBCOPP_COPP_API
int start(std::exception_ptr &unhandled,
void *priv_data =
nullptr) LIBCOPP_MACRO_NOEXCEPT;
133 LIBCOPP_COPP_API
int resume(
void *priv_data =
nullptr);
135# if defined(LIBCOPP_MACRO_ENABLE_STD_EXCEPTION_PTR) && LIBCOPP_MACRO_ENABLE_STD_EXCEPTION_PTR
142 LIBCOPP_COPP_API
int resume(std::exception_ptr &unhandled,
void *priv_data =
nullptr) LIBCOPP_MACRO_NOEXCEPT;
150 LIBCOPP_COPP_API
int yield(
void **priv_data =
nullptr) LIBCOPP_MACRO_NOEXCEPT;
160 template <class TAWAITABLE, class TERROR_TRANSFORM,
163 await_value(TAWAITABLE &&awaitable, TERROR_TRANSFORM &&error_transform) noexcept(
166 return awaitable.inject_await(
this, std::forward<TERROR_TRANSFORM>(error_transform));
177 template <
class TAWAITABLE,
178 class = nostd::enable_if_t<stackful_inject_awaitable<nostd::remove_cvref_t<TAWAITABLE>>::value>>
180 std::is_nothrow_copy_constructible<container_value_type<TAWAITABLE>>::value &&
186namespace this_fiber {
192LIBCOPP_COPP_API coroutine_context_fiber *
get_coroutine() LIBCOPP_MACRO_NOEXCEPT;
200template <typename Tc>
201LIBCOPP_COPP_API_HEAD_ONLY Tc *get() {
210LIBCOPP_COPP_API
int yield(
void **priv_data =
nullptr) LIBCOPP_MACRO_NOEXCEPT;
212LIBCOPP_COPP_NAMESPACE_END
base type of all coroutine context
LIBCOPP_COPP_NAMESPACE_ID::util::lock::atomic_int_type< LIBCOPP_COPP_NAMESPACE_ID::util::lock::unsafe_int_type< int > > status_
size_t private_buffer_size_
std::function< int(void *)> callback_type
@ COPP_EC_ARGS_ERROR
COPP_EC_ARGS_ERROR.
LIBCOPP_COPP_API int yield(void **priv_data=nullptr) LIBCOPP_MACRO_NOEXCEPT
yield current coroutine
LIBCOPP_COPP_API coroutine_context * get_coroutine() LIBCOPP_MACRO_NOEXCEPT
get current coroutine
typename nostd::remove_cvref_t< TCONTAINER >::value_type container_value_type
status of safe coroutine context base