46#if defined(LIBCOPP_MACRO_ENABLE_STD_VARIANT) && LIBCOPP_MACRO_ENABLE_STD_VARIANT
47 if (std::holds_alternative<multi_caller_set>(callers_)) {
48 std::get<multi_caller_set>(callers_).insert(handle);
52 if (!std::get<handle_delegate>(callers_)) {
53 std::get<handle_delegate>(callers_) = handle;
59 callers.insert(std::get<handle_delegate>(callers_));
60 callers.insert(handle);
63 if (!unique_caller_) {
64 unique_caller_ = handle;
68 if (!multiple_callers_) {
71 multiple_callers_->insert(handle);
76 bool has_caller =
false;
78#if defined(LIBCOPP_MACRO_ENABLE_STD_VARIANT) && LIBCOPP_MACRO_ENABLE_STD_VARIANT
79 if (std::holds_alternative<multi_caller_set>(callers_)) {
80 has_caller = std::get<multi_caller_set>(callers_).erase(handle) > 0;
84 if (std::get<handle_delegate>(callers_) == handle) {
85 std::get<handle_delegate>(callers_) =
nullptr;
89 if (unique_caller_ == handle) {
90 unique_caller_ =
nullptr;
95 if (multiple_callers_) {
96 has_caller = multiple_callers_->erase(handle) > 0;
105 size_t resume_count = 0;
106#if defined(LIBCOPP_MACRO_ENABLE_STD_VARIANT) && LIBCOPP_MACRO_ENABLE_STD_VARIANT
107 if (std::holds_alternative<handle_delegate>(callers_)) {
108 auto caller = std::get<handle_delegate>(callers_);
109 std::get<handle_delegate>(callers_) =
nullptr;
110 if (caller.handle_data && caller.resume_handle) {
111 caller.resume_handle(caller.handle_data,
this);
114 }
else if (std::holds_alternative<multi_caller_set>(callers_)) {
116 callers.swap(std::get<multi_caller_set>(callers_));
117 for (
auto &caller : callers) {
118 if (caller.handle_data && caller.resume_handle) {
119 caller.resume_handle(caller.handle_data,
this);
127 std::unique_ptr<multi_caller_set> multiple_callers;
131 if (unique_caller.handle_data && unique_caller.resume_handle) {
132 unique_caller.
resume_handle(unique_caller.handle_data,
this);
136 if (multiple_callers) {
137 for (
auto &caller : *multiple_callers) {
138 if (caller.handle_data && caller.resume_handle) {
139 caller.resume_handle(caller.handle_data,
this);
base type of all coroutine context
LIBCOPP_COPP_API bool remove_caller(handle_delegate handle) noexcept
LIBCOPP_COPP_API stackful_channel_context_base() noexcept
LIBCOPP_COPP_API bool has_multiple_callers() const noexcept
std::unordered_set< handle_delegate, handle_delegate_hash > multi_caller_set
LIBCOPP_COPP_API void add_caller(handle_delegate handle) noexcept
std::unique_ptr< multi_caller_set > multiple_callers_
LIBCOPP_COPP_API ~stackful_channel_context_base()
LIBCOPP_COPP_API void wake()
LIBCOPP_COPP_API size_t resume_callers()
handle_delegate unique_caller_