46#if defined(LIBCOPP_MACRO_ENABLE_STD_VARIANT) && LIBCOPP_MACRO_ENABLE_STD_VARIANT
47 if (std::holds_alternative<multi_caller_container>(callers_)) {
48 std::get<multi_caller_container>(callers_).add(handle);
52 if (!std::get<handle_delegate>(callers_)) {
53 std::get<handle_delegate>(callers_) = handle;
57 if (std::get<handle_delegate>(callers_) == handle) {
63 callers.
add(std::get<handle_delegate>(callers_));
68 if (!unique_caller_ && (!multiple_callers_ || multiple_callers_->size() == 0)) {
69 unique_caller_ = handle;
73 if (unique_caller_ == handle) {
77 if (!multiple_callers_) {
80 multiple_callers_->
add(handle);
85 bool has_caller =
false;
87#if defined(LIBCOPP_MACRO_ENABLE_STD_VARIANT) && LIBCOPP_MACRO_ENABLE_STD_VARIANT
88 if (std::holds_alternative<multi_caller_container>(callers_)) {
89 has_caller = std::get<multi_caller_container>(callers_).remove(handle);
93 if (std::get<handle_delegate>(callers_) == handle) {
94 std::get<handle_delegate>(callers_) =
nullptr;
98 if (unique_caller_ == handle) {
99 unique_caller_ =
nullptr;
104 if (multiple_callers_) {
105 has_caller = multiple_callers_->remove(handle);
114 size_t resume_count = 0;
115#if defined(LIBCOPP_MACRO_ENABLE_STD_VARIANT) && LIBCOPP_MACRO_ENABLE_STD_VARIANT
116 if (std::holds_alternative<handle_delegate>(callers_)) {
117 auto caller = std::get<handle_delegate>(callers_);
118 std::get<handle_delegate>(callers_) =
nullptr;
119 if (caller.handle_data && caller.resume_handle) {
120 caller.resume_handle(caller.handle_data,
this);
123 }
else if (std::holds_alternative<multi_caller_container>(callers_)) {
125 callers.
swap(std::get<multi_caller_container>(callers_));
126 for (
auto &caller : callers.
callers) {
127 if (caller.handle_data && caller.resume_handle) {
128 caller.resume_handle(caller.handle_data,
this);
136 std::unique_ptr<multi_caller_container> multiple_callers;
140 if (unique_caller.handle_data && unique_caller.resume_handle) {
141 unique_caller.
resume_handle(unique_caller.handle_data,
this);
145 if (multiple_callers) {
146 for (
auto &caller : multiple_callers->callers) {
147 if (caller.handle_data && caller.resume_handle) {
148 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
LIBCOPP_COPP_API void add_caller(handle_delegate handle) noexcept
std::unique_ptr< multi_caller_container > 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_
void swap(multi_caller_container &other) noexcept
bool add(const handle_delegate &delegate)