Skip to content

Commit ac9fa1d

Browse files
committed
execution/scheduler: refinement (#1384)
1 parent cf9270b commit ac9fa1d

4 files changed

Lines changed: 59 additions & 11 deletions

File tree

reference/execution/execution/receiver.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ namespace std::execution {
2727
## 概要
2828
`receiver`は、型`Rcvr`がReceiver型の要件を満たすことを表すコンセプトである。
2929
30-
`receiver_t`をメンバ型`Rcvr::receiver_concept`として定義するクラス型はReceiverとみなせる。
30+
下記をみたすクラス型はReceiverとみなせる。
31+
32+
- `receiver_t`をメンバ型`Rcvr::receiver_concept`として定義する
33+
- [`get_env`](get_env.md)で[環境](../queryable.md)を取得できる
34+
- ムーブ可能
3135
3236
3337
## モデル

reference/execution/execution/scheduler.md

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ namespace std::execution {
2525
* derived_from[link /reference/concepts/derived_from.md]
2626
* sender[link sender.md]
2727
* queryable[link ../queryable.md]
28+
* schedule[link schedule.md.nolink]
2829
* get_completion_scheduler[link get_completion_scheduler.md.nolink]
2930
* set_value_t[link set_value.md]
3031
* get_env[link get_env.md]
@@ -36,11 +37,47 @@ namespace std::execution {
3637
3738
下記をみたすクラス型はSchedulerとみなせる。
3839
39-
- `scheduler_t`をメンバ型`Sch::scheduler_concept`として定義するクラス
40-
- [クエリ可能オブジェクト](../queryable.md)であること
41-
- `Sch`型の値`sch`に対して下記が有効な式であること
42-
- [`execution::schedule`](schedule.md.nolink)`(sch)`が[Sender](sender.md)を返すこと
43-
- [`execution::get_completion_scheduler`](get_completion_scheduler.md.nolink)`<`[`set_value_t`](set_value.md)`>(`[`execution::get_env`](get_env.md)`(`[`execution::schedule`](schedule.md.nolink)`(sch)))`の結果が`Sch`型に等しいこと
40+
- `scheduler_t`をメンバ型`Sch::scheduler_concept`として定義する
41+
- [クエリ可能オブジェクト](../queryable.md)である
42+
- `Sch`型の値`sch`に対して下記を満たすこと
43+
- [`execution::schedule`](schedule.md.nolink)`(sch)`が[Sender](sender.md)を返す
44+
- 上記Senderの[値完了関数](set_value.md)の[完了Scheduler](get_completion_scheduler.md.nolink)が`Sch`に等しいこと
45+
- コピー可能かつ同値比較可能
46+
47+
48+
## モデル
49+
説明専用のエイリアステンプレート`value-signature`, コンセプト`sender-in-of`を下記の通り定義する。
50+
51+
```cpp
52+
namespace std::execution {
53+
template<class... As>
54+
using value-signature = set_value_t(As...);
55+
56+
template<class Sndr, class Env, class... Values>
57+
concept sender-in-of =
58+
sender_in<Sndr, Env> &&
59+
MATCHING-SIG(
60+
set_value_t(Values...),
61+
value_types_of_t<Sndr, Env, value-signature, type_identity_t>);
62+
}
63+
```
64+
* set_value_t[link set_value.md]
65+
* sender_in[link sender_in.md]
66+
* value_types_of_t[link value_types_of_t.md.nolink]
67+
* type_identity_t[link /reference/type_traits/true_type.md]
68+
69+
`Sch``scheduler`の型、型`Env`[`sender_in`](sender_in.md)`<schedule_result_t<Sch>, Env>`を満たす実行環境の型としたとき、`sender-in-of<schedule_result_t<Sch>, Env>`のモデルとなること。
70+
71+
[`copyable`](/reference/concepts/copyable.md)`<remove_cvref_t<Sch>>`および[`equality_comparable`](/reference/concepts/equality_comparable.md)`<remove_cvref_t<Sch>>`により要求される操作は、例外で終了してはならない。
72+
これらの操作やScheduler型の[`schedule`](schedule.md.nolink)関数は、異なるスレッドから同時に操作を呼び出す可能性がある場合でも、データ競合を引き起こしてはならない。
73+
74+
あるScheduler型`Sch`の2つの値`sch1`と`sch2`に対して、`sch1`と`sch2`が同じ実行リソースを共有する場合に限って、`sch1 == sch2`は`true`となる。
75+
76+
あるScheduler`sch`に対して、式[`get_completion_scheduler`](get_completion_scheduler.md.nolink)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md.nolink)`(sch)))`が`sch`と等しいこと。
77+
78+
あるScheduler`sch`に対して式[`get_domain`](get_domain.md)`(sch)`が適格であるとき、式`get_domain(`[`get_env`](get_env.md)`(schedule(sch)))`も適格であり、かつ同じ型を持つ。
79+
80+
Scheduler型のデストラクタは、`schedule`が返すSenderオブジェクトに接続されたReceiverの完了を待機してブロックしてはならない。
4481

4582

4683
## 例

reference/execution/execution/sender.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ namespace std::execution {
1616
## 概要
1717
`sender`は、型`Sndr`がSender型の要件を満たすことを表すコンセプトである。
1818
19-
次のいずれかのクラス型はSenderとみなせる
19+
下記をみたすクラス型はSenderとみなせる
2020
21-
- `sender_t`をメンバ型`Sndr::sender_concept`として定義するクラス型
22-
- [コルーチンのAwaitable型](/lang/cpp20/coroutines.md)クラス型
21+
- 下記いずれかを満たす
22+
- `sender_t`をメンバ型`Sndr::sender_concept`として定義する
23+
- [コルーチンのAwaitable型](/lang/cpp20/coroutines.md)
24+
- [`get_env`](get_env.md)で[属性](../queryable.md)を取得できる
25+
- ムーブ可能
2326
2427
2528
## 要件

reference/execution/execution/start.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,25 @@ namespace std::execution {
1212
```
1313
1414
## 概要
15-
`start`は、[Operation State](operation_state.md)を開始するカスタマイゼーションポイントオブジェクトである。
15+
`start`は、[Operation State](operation_state.md)関連付けられた非同期操作(asynchronous operation)を開始するカスタマイゼーションポイントオブジェクトである。
1616
1717
1818
## 効果
1919
式`start(op)`は、`op`が右辺値の場合は不適格となる。
2020
そうでなければ、`op.start()`と等価。
2121
22-
`op.start()`が[Operation State](operation_state.md)に関連付けさられた非同期操作を開始しない場合、式`start(op)`の動作は未定義となる。
22+
`op.start()`が[Operation State](operation_state.md)に関連付けられた非同期操作を開始しない場合、式`start(op)`の動作は未定義となる。
2323
2424
2525
## カスタマイゼーションポイント
2626
[Operation State](operation_state.md)`op`に対して式`op.start()`が呼び出される。
2727
このとき`noexcept(op.start()) == true`であること。
2828
2929
30+
## 備考
31+
`start`は[Sender](sender.md)内部実装から呼び出される想定であり、実行制御ライブラリ利用者が直接利用する必要はない。
32+
33+
3034
## 例
3135
```cpp
3236
#include <print>

0 commit comments

Comments
 (0)