|
5137 | 5137 | };
|
5138 | 5138 |
|
5139 | 5139 | template<class Promise>
|
5140 |
| - struct coroutine_handle : coroutine_handle<> |
| 5140 | + struct coroutine_handle |
5141 | 5141 | {
|
5142 | 5142 | // \ref{coroutine.handle.con}, construct/reset
|
5143 |
| - using coroutine_handle<>::coroutine_handle; |
| 5143 | + constexpr coroutine_handle() noexcept; |
| 5144 | + constexpr coroutine_handle(nullptr_t) noexcept; |
5144 | 5145 | static coroutine_handle from_promise(Promise&);
|
5145 | 5146 | coroutine_handle& operator=(nullptr_t) noexcept;
|
5146 | 5147 |
|
5147 | 5148 | // \ref{coroutine.handle.export.import}, export/import
|
| 5149 | + constexpr void* address() const noexcept; |
5148 | 5150 | static constexpr coroutine_handle from_address(void* addr);
|
5149 | 5151 |
|
| 5152 | + // \ref{coroutine.handle.conv}, conversion |
| 5153 | + constexpr operator coroutine_handle<>() const noexcept; |
| 5154 | + |
| 5155 | + // \ref{coroutine.handle.observers}, observers |
| 5156 | + constexpr explicit operator bool() const noexcept; |
| 5157 | + bool done() const; |
| 5158 | + |
| 5159 | + // \ref{coroutine.handle.resumption}, resumption |
| 5160 | + void operator()() const; |
| 5161 | + void resume() const; |
| 5162 | + void destroy() const; |
| 5163 | + |
5150 | 5164 | // \ref{coroutine.handle.promise}, promise access
|
5151 | 5165 | Promise& promise() const;
|
| 5166 | + |
| 5167 | + private: |
| 5168 | + void* ptr; // \expos |
5152 | 5169 | };
|
5153 | 5170 | }
|
5154 | 5171 | \end{codeblock}
|
|
5157 | 5174 | An object of type
|
5158 | 5175 | \tcode{coroutine_handle<T>} is called a \term{coroutine handle}
|
5159 | 5176 | and can be used to refer to a suspended or executing coroutine.
|
5160 |
| -A default-constructed \tcode{coroutine_handle} object does not refer to any |
| 5177 | +A \tcode{coroutine_handle} object whose |
| 5178 | +member \tcode{address()} returns a null pointer value |
| 5179 | +does not refer to any |
5161 | 5180 | coroutine.
|
| 5181 | +Two \tcode{coroutine_handle} objects refer to the same coroutine |
| 5182 | +if and only if their member \tcode{address()} returns the same non-null value. |
5162 | 5183 |
|
5163 | 5184 | \pnum
|
5164 | 5185 | If a program declares an explicit or partial specialization of
|
|
5212 | 5233 | \tcode{*this}.
|
5213 | 5234 | \end{itemdescr}
|
5214 | 5235 |
|
| 5236 | +\rSec3[coroutine.handle.conv]{Conversion} |
| 5237 | + |
| 5238 | +\indexlibrarymember{operator coroutine_handle<>}{coroutine_handle}% |
| 5239 | +\begin{itemdecl} |
| 5240 | +constexpr operator coroutine_handle<>() const noexcept; |
| 5241 | +\end{itemdecl} |
| 5242 | + |
| 5243 | +\begin{itemdescr} |
| 5244 | +\pnum |
| 5245 | +\effects |
| 5246 | +Equivalent to: \tcode{return coroutine_handle<>::from_address(address());} |
| 5247 | +\end{itemdescr} |
| 5248 | + |
5215 | 5249 | \rSec3[coroutine.handle.export.import]{Export/import}
|
5216 | 5250 |
|
5217 | 5251 | \indexlibrarymember{address}{coroutine_handle}%
|
|
5228 | 5262 | \indexlibrarymember{from_address}{coroutine_handle}%
|
5229 | 5263 | \begin{itemdecl}
|
5230 | 5264 | static constexpr coroutine_handle<> coroutine_handle<>::from_address(void* addr);
|
| 5265 | +\end{itemdecl} |
| 5266 | + |
| 5267 | +\begin{itemdescr} |
| 5268 | +\pnum |
| 5269 | +\expects |
| 5270 | +\tcode{addr} was obtained via a prior call to \tcode{address} |
| 5271 | +on an object whose type is a specialization of \tcode{coroutine_handle}. |
| 5272 | + |
| 5273 | +\pnum |
| 5274 | +\ensures |
| 5275 | +\tcode{from_address(address()) == *this}. |
| 5276 | +\end{itemdescr} |
| 5277 | + |
| 5278 | +\indexlibrarymember{from_address}{coroutine_handle}% |
| 5279 | +\begin{itemdecl} |
5231 | 5280 | static constexpr coroutine_handle<Promise> coroutine_handle<Promise>::from_address(void* addr);
|
5232 | 5281 | \end{itemdecl}
|
5233 | 5282 |
|
5234 | 5283 | \begin{itemdescr}
|
5235 | 5284 | \pnum
|
5236 | 5285 | \expects
|
5237 |
| -\tcode{addr} was obtained via a prior call to \tcode{address}. |
| 5286 | +\tcode{addr} was obtained via a prior call to \tcode{address} |
| 5287 | +on an object of type \cv \tcode{coroutine_handle<Promise>}. |
5238 | 5288 |
|
5239 | 5289 | \pnum
|
5240 | 5290 | \ensures
|
|
5397 | 5447 | \begin{codeblock}
|
5398 | 5448 | namespace std {
|
5399 | 5449 | template<>
|
5400 |
| - struct coroutine_handle<noop_coroutine_promise> : coroutine_handle<> |
| 5450 | + struct coroutine_handle<noop_coroutine_promise> |
5401 | 5451 | {
|
| 5452 | + // \ref{coroutine.handle.noop.conv}, conversion |
| 5453 | + constexpr operator coroutine_handle<>() const noexcept; |
| 5454 | + |
5402 | 5455 | // \ref{coroutine.handle.noop.observers}, observers
|
5403 | 5456 | constexpr explicit operator bool() const noexcept;
|
5404 | 5457 | constexpr bool done() const noexcept;
|
|
5415 | 5468 | constexpr void* address() const noexcept;
|
5416 | 5469 | private:
|
5417 | 5470 | coroutine_handle(@\unspec@);
|
| 5471 | + void* ptr; // \expos |
5418 | 5472 | };
|
5419 | 5473 | }
|
5420 | 5474 | \end{codeblock}
|
5421 | 5475 |
|
| 5476 | +\rSec4[coroutine.handle.noop.conv]{Conversion} |
| 5477 | + |
| 5478 | +\indexlibrarymember{operator coroutine_handle<>}{coroutine_handle<noop_coroutine_promise>}% |
| 5479 | +\begin{itemdecl} |
| 5480 | +constexpr operator coroutine_handle<>() const noexcept; |
| 5481 | +\end{itemdecl} |
| 5482 | + |
| 5483 | +\begin{itemdescr} |
| 5484 | +\pnum |
| 5485 | +\effects |
| 5486 | +Equivalent to: \tcode{return coroutine_handle<>::from_address(address());} |
| 5487 | +\end{itemdescr} |
| 5488 | + |
5422 | 5489 | \rSec4[coroutine.handle.noop.observers]{Observers}
|
5423 | 5490 |
|
5424 | 5491 | \indexlibrarymember{operator bool}{coroutine_handle<noop_coroutine_promise>}%
|
|
0 commit comments