@@ -104,26 +104,51 @@ struct generator_receiver : generator_receiver_base<Yield, Push>
104
104
{
105
105
if (!lhs.done && !lhs.exception )
106
106
{
107
- reference = this ;
107
+ * reference = this ;
108
108
lhs.exception = moved_from_exception ();
109
109
}
110
110
lhs.done = true ;
111
111
}
112
112
113
+ generator_receiver& operator =(generator_receiver && lhs) noexcept
114
+ {
115
+ if (!done && *reference == this )
116
+ *reference = nullptr ;
117
+
118
+ this ->pushed_value = std::move (lhs.pushed_value );
119
+ exception = std::move (std::move (lhs.exception ));
120
+ done = std::move (lhs.done );
121
+ result = std::move (std::move (lhs.result ));
122
+ result_buffer = std::move (std::move (lhs.result_buffer ));
123
+ awaited_from = std::move (std::move (lhs.awaited_from ));
124
+ yield_from = std::move (std::move (lhs.yield_from ));
125
+ lazy = std::move (lhs.lazy );
126
+ reference = lhs.reference ;
127
+ cancel_signal = std::move (lhs.cancel_signal );
128
+
129
+ if (!lhs.done && !lhs.exception && *reference == &lhs)
130
+ {
131
+ *reference = this ;
132
+ lhs.exception = moved_from_exception ();
133
+ }
134
+ lhs.done = true ;
135
+ return *this ;
136
+ }
137
+
113
138
~generator_receiver ()
114
139
{
115
- if (!done && reference == this )
116
- reference = nullptr ;
140
+ if (!done && * reference == this )
141
+ * reference = nullptr ;
117
142
}
118
143
119
144
generator_receiver (generator_receiver * &reference, asio::cancellation_signal & cancel_signal)
120
- : reference(reference), cancel_signal(cancel_signal)
145
+ : reference(& reference), cancel_signal(& cancel_signal)
121
146
{
122
147
reference = this ;
123
148
}
124
149
125
- generator_receiver * & reference;
126
- asio::cancellation_signal & cancel_signal;
150
+ generator_receiver ** reference;
151
+ asio::cancellation_signal * cancel_signal;
127
152
128
153
using yield_awaitable = generator_yield_awaitable<Yield, Push>;
129
154
@@ -185,7 +210,7 @@ struct generator_receiver : generator_receiver_base<Yield, Push>
185
210
186
211
if constexpr (requires (Promise p) {p.get_cancellation_slot ();})
187
212
if ((cl = h.promise ().get_cancellation_slot ()).is_connected ())
188
- cl.emplace <forward_cancellation>(self->cancel_signal );
213
+ cl.emplace <forward_cancellation>(* self->cancel_signal );
189
214
190
215
self->awaited_from .reset (h.address ());
191
216
0 commit comments