Skip to content

Commit 1a6cd9c

Browse files
committed
execution/as_awaitable: 概要増補 (#1384)
1 parent 2705e5a commit 1a6cd9c

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

reference/execution/execution/as_awaitable.md

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,19 @@ namespace std::execution {
1313
* unspecified[italic]
1414
1515
## 概要
16-
`as_awaitable`は、オブジェクトを特定コルーチン内でAwaitableに変換するカスタマイゼーションポイントオブジェクトである。
16+
`as_awaitable`は、オブジェクトを特定の[コルーチン](/lang/cpp20/coroutines.md)内でAwaitableに変換するカスタマイゼーションポイントオブジェクトである。
17+
18+
Promise型`p`をもつコルーチンにおいて、Await式`co_await as_awaitable(expr, p)`は下記のように動作する。
19+
20+
- 式`expr.as_awaitable(p)`が有効ならば、同式が返すAwaitableオブジェクトに対してAwait式を実行する。
21+
- `expr`が[単一の値を送信するSender](single-sender.md)であり、Promise型が停止完了ハンドラを定義するならば、下記動作を行う。
22+
- Senderを[接続(connect)](connect.md)し、結果[Operation State](operation_state.md)をAwaitableオブジェクトに格納する。
23+
- コルーチンを中断し、Operation Stateを[開始(start)](start.md)する。
24+
- [クエリオブジェクト](../queryable.md)による[Receiver](receiver.md)環境への問い合わせは、Promise型に関連付けられた環境(`get_env`)へと転送される。
25+
- Senderが[値完了](set_value.md)した場合、送信値をAwait式の結果としてコルーチンを再開する。
26+
- Senderが[エラー完了](set_error.md)した場合、エラー値を例外としてコルーチンから再スローする。
27+
- Senderが[停止完了](set_stopped.md)した場合、停止完了ハンドラ(`unhandled_stopped`)が返す別のコルーチンを再開させる。
28+
- そうでなければ、式`expr`に対してAwait式を実行する。
1729
1830
1931
## 効果
@@ -43,6 +55,7 @@ namespace std::execution {
4355
}
4456
```
4557
* single-sender[link single-sender.md]
58+
* env_of_t[link env_of_t.md]
4659
* sender_to[link sender_to.md]
4760
* convertible_to[link /reference/concepts/convertible_to.md]
4861
* coroutine_handle<>[link /reference/coroutine/coroutine_handle.md]
@@ -102,7 +115,7 @@ struct awaitable-receiver {
102115

103116
説明用の式`rcvr``awaitable-reciever`型の右辺値、`crcvr``rcvr`をconst参照する左辺値、`vs`を式パック、`err``Err`型の式とする。このとき
104117

105-
- [`constructible_from`](/reference/concepts/constructible_from.md)`<result-type, decltype((vs))...>`を満たすとき、式`set_value(rcvr, vs...)`は下記と等価。そうでなければ、式`set_value(rcvr, vs...)`は不適格となる。
118+
- [`constructible_from`](/reference/concepts/constructible_from.md)`<result-type, decltype((vs))...>`を満たすとき、式[`set_value`](set_value.md)`(rcvr, vs...)`は下記と等価。そうでなければ、式`set_value(rcvr, vs...)`は不適格となる。
106119

107120
```cpp
108121
try {
@@ -116,7 +129,7 @@ struct awaitable-receiver {
116129
* current_exception()[link /reference/exception/current_exception.md]
117130
* resume()[link /reference/coroutine/coroutine_handle/resume.md]
118131

119-
-`set_error(rcvr, err)`は下記と等価。
132+
-[`set_error`](set_error.md)`(rcvr, err)`は下記と等価。
120133

121134
```cpp
122135
rcvr.result-ptr->template emplace<2>(AS-EXCEPT-PTR(err));
@@ -125,7 +138,7 @@ struct awaitable-receiver {
125138
* template emplace[link /reference/variant/variant/emplace.md]
126139
* resume()[link /reference/coroutine/coroutine_handle/resume.md]
127140

128-
- 式`set_stopped(rcvr)`は下記と等価。
141+
- 式[`set_stopped`](set_stopped.md)`(rcvr)`は下記と等価。
129142

130143
```cpp
131144
static_cast<coroutine_handle<>>(rcvr.continuation.promise().unhandled_stopped()).resume();
@@ -134,7 +147,7 @@ struct awaitable-receiver {
134147
* promise()[link /reference/coroutine/coroutine_handle/promise.md]
135148
* resume()[link /reference/coroutine/coroutine_handle/resume.md]
136149

137-
- [`forwarding-query`](../forwarding-query.md)を満たす型の式`tag`とパック式`as`に対して、[`get_env`](get_env.md)`(crcvr).query(tag, as...)`は下記と等価。
150+
- [`forwarding-query`](../forwarding-query.md)を満たす型の式`tag`とパック式`as`に対して、[`get_env`](get_env.md)`(crcvr).query(tag, as...)`は下記と等価。
138151

139152
```cpp
140153
tag(get_env(as_const(crcvr.continuation.promise())), as...)

0 commit comments

Comments
 (0)