Skip to content

Commit 3785ecf

Browse files
committed
execution: get_completion_scheduler (#1384)
1 parent 148bb8c commit 3785ecf

File tree

6 files changed

+136
-11
lines changed

6 files changed

+136
-11
lines changed

reference/execution/execution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace std::execution {
4444
| [`execution::get_delegation_scheduler`](execution/get_delegation_scheduler.md.nolink) | 委譲Scheduler取得のクエリオブジェクト (customization point object) | C++26 |
4545
| [`execution::forward_progress_guarantee`](execution/forward_progress_guarantee.md.nolink) | 前進保証 (enum) | C++26 |
4646
| [`execution::get_forward_progress_guarantee`](execution/get_forward_progress_guarantee.md.nolink) | 前進保証取得のクエリオブジェクト (customization point object) | C++26 |
47-
| [`execution::get_completion_scheduler`](execution/get_completion_scheduler.md.nolink) | 完了Scheduler取得のクエリオブジェクト (customization point object) | C++26 |
47+
| [`execution::get_completion_scheduler`](execution/get_completion_scheduler.md) | 完了Scheduler取得のクエリオブジェクト (customization point object) | C++26 |
4848
| [`execution::get_env`](execution/get_env.md) | 環境取得のクエリオブジェクト (customization point object) | C++26 |
4949
| [`execution::env_of_t`](execution/env_of_t.md) | 指定型から環境型を取得 (alias template) | C++26 |
5050
| [`execution::prop`](execution/prop.md) | Key/Valueペアによる[クエリ可能オブジェクト](queryable.md) (class template) | C++26 |
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
# get_completion_scheduler
2+
* execution[meta header]
3+
* cpo[meta id-type]
4+
* std::execution[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std::execution {
9+
template<class CPO>
10+
struct get_completion_scheduler_t { unspecified };
11+
12+
template<class CPO>
13+
constexpr get_completion_scheduler_t<CPO> get_completion_scheduler{};
14+
}
15+
```
16+
* unspecified[italic]
17+
18+
## 概要
19+
`get_completion_scheduler<completion-tag>`は、[Sender](sender.md)の[属性](get_env.md)から指定完了タグに関連付けられた完了Schedulerを取得する[クエリオブジェクト](../queryable.md)である。
20+
完了タグ`completion-tag`には、[`set_value_t`](set_value.md), [`set_error_t`](set_error.md), [`set_stopped_t`](set_stopped.md)のいずれかを指定する。
21+
22+
コア定数式[`forwarding_query`](forwarding_query.md.nolink)`(get_completion_scheduler<completion-tag>)`は`true`値を返す。
23+
24+
25+
### 完了Scheduler
26+
完了Scheduler(completion scheduler)は、非同期操作の完了操作を実行するための実行リソース(例:CPUスレッド)と関連付けられた[Scheduler](scheduler.md)である。
27+
28+
非同期操作の完了操作は、下記いずれかの完了関数呼び出しが該当する。
29+
30+
- 値完了関数 [`execution::set_value`](set_value.md)
31+
- エラー完了関数 [`execution::set_error`](set_error.md)
32+
- 停止完了関数 [`execution::set_stopped`](set_stopped.md)
33+
34+
35+
## 効果
36+
呼び出し式`get_completion_scheduler<completion-tag>(q)`は下記と等価であり、式が適格ならば[`scheduler`](scheduler.md)を満たす型の値となる。
37+
38+
- 引数`q`がconst修飾された`cq`を用いて、式`cq.query(get_completion_scheduler<completion-tag>)`が適格であればその値。
39+
- そうでなければ、呼び出し式は不適格となる。
40+
41+
42+
## 例外
43+
投げない
44+
45+
46+
## カスタマイゼーションポイント
47+
const修飾[クエリ可能オブジェクト](../queryable.md)`cq`に対して式`cq.query(get_completion_scheduler<completion-tag>)`が呼び出される。
48+
このとき、`noexcept(cq.query(get_completion_scheduler<completion-tag>)) == true`であること。
49+
50+
51+
## 例
52+
```cpp
53+
#include <execution>
54+
namespace ex = std::execution;
55+
56+
int main()
57+
{
58+
ex::run_loop loop;
59+
ex::scheduler auto loop_sch = loop.get_scheduler();
60+
61+
// schedule(loop_sch)の完了Schedulerはloop_schに等しい
62+
ex::sender auto snd0 = ex::schedule(loop_sch);
63+
auto sch0 = ex::get_completion_scheduler<ex::set_value_t>(ex::get_env(snd0));
64+
assert(sch0 == loop_sch);
65+
66+
// 完了Schedulerは接続されたSenderへと引き継がれる
67+
ex::sender auto snd1 = snd0 | ex::then([]{ return 42; });
68+
auto sch1 = ex::get_completion_scheduler<ex::set_value_t>(ex::get_env(snd1));
69+
assert(sch1 == loop_sch);
70+
71+
#if 0
72+
// just Senderは完了Schedulerを持たない
73+
ex::sender auto snd2 = ex::just(42);
74+
auto sch2 = ex::get_completion_scheduler<ex::set_value_t>(ex::get_env(snd2));
75+
#endif
76+
}
77+
```
78+
* ex::get_completion_scheduler[color ff0000]
79+
* ex::run_loop[link run_loop.md.nolink]
80+
* ex::scheduler[link scheduler.md]
81+
* ex::sender[link sender.md]
82+
* ex::schedule[link schedule.md]
83+
* ex::set_value_t[link set_value.md]
84+
* ex::get_env[link get_env.md]
85+
* ex::then[link then.md.nolink]
86+
87+
### 出力
88+
```
89+
```
90+
91+
92+
## バージョン
93+
### 言語
94+
- C++26
95+
96+
### 処理系
97+
- [Clang](/implementation.md#clang): ??
98+
- [GCC](/implementation.md#gcc): ??
99+
- [ICC](/implementation.md#icc): ??
100+
- [Visual C++](/implementation.md#visual_cpp): ??
101+
102+
103+
## 関連項目
104+
- [`execution::scheduler`](scheduler.md)
105+
- [`execution::schedule`](schedule.md)
106+
- [`execution::set_value`](set_value.md)
107+
- [`execution::set_error`](set_error.md)
108+
- [`execution::set_stopped`](set_stopped.md)
109+
110+
111+
## 参照
112+
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)

reference/execution/execution/get_env.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace std::execution {
2323
式`get_env(o)`は下記と等価であり、[`queryable`](../queryable.md)を満たす型の値となる。
2424
2525
- 引数`o`がconst修飾された`co`を用いて、式`co.get_env()`が有効であればその値。
26-
- そうでなければ、空(empty)のクエリ可能オブジェクト[`env<>{}`](env.md)
26+
- そうでなければ、空のクエリ可能オブジェクト[`env<>{}`](env.md)
2727
2828
2929
## 例外

reference/execution/execution/schedule.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ namespace std::execution {
1616
`schedule`は、[Scheduler](scheduler.md)から[スケジュールSender](sender.md)を取得するSenderファクトリである。
1717
1818
スケジュールSenderより生成される[非同期操作](operation_state.md)を開始すると、Schedulerに関連付けられた実行リソース上で空の[値完了関数](set_value.md)を呼び出す。
19+
スケジュールSenderの[値完了Scheduler](get_completion_scheduler.md)は、引数に指定したScheduler`sch`に等しい。
1920
2021
2122
## 効果
2223
呼び出し式`schedule(sch)`は式`sch.schedule()`と等価であり、式の型は[`sender`](sender.md)を満たすこと。
2324
24-
式[`get_completion_scheduler`](get_completion_scheduler.md.nolink)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(sch.schedule())) == sch`が不適格もしくは`false`となる場合、呼び出し式`schedule(sch)`の動作は未定義となる。
25+
式[`get_completion_scheduler`](get_completion_scheduler.md)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(sch.schedule())) == sch`が不適格もしくは`false`となる場合、呼び出し式`schedule(sch)`の動作は未定義となる。
2526
2627
2728
## カスタマイゼーションポイント
@@ -93,6 +94,7 @@ val=42
9394

9495
## 関連項目
9596
- [`execution::scheduler`](scheduler.md)
97+
- [`execution::get_completion_scheduler`](get_completion_scheduler.md)
9698

9799

98100
## 参照

reference/execution/execution/scheduler.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace std::execution {
2626
* sender[link sender.md]
2727
* queryable[link ../queryable.md]
2828
* schedule[link schedule.md]
29-
* get_completion_scheduler[link get_completion_scheduler.md.nolink]
29+
* get_completion_scheduler[link get_completion_scheduler.md]
3030
* set_value_t[link set_value.md]
3131
* get_env[link get_env.md]
3232
* equality_comparable[link /reference/concepts/equality_comparable.md]
@@ -41,7 +41,7 @@ namespace std::execution {
4141
- [クエリ可能オブジェクト](../queryable.md)である
4242
- `Sch`型の値`sch`に対して下記を満たすこと
4343
- [`execution::schedule`](schedule.md)`(sch)`が[Sender](sender.md)を返す
44-
- 上記Senderの[値完了関数](set_value.md)の[完了Scheduler](get_completion_scheduler.md.nolink)が`Sch`に等しいこと
44+
- 上記Senderの[値完了関数](set_value.md)の[完了Scheduler](get_completion_scheduler.md)が`Sch`に等しいこと
4545
- コピー可能かつ同値比較可能
4646
4747
@@ -66,14 +66,14 @@ namespace std::execution {
6666
* value_types_of_t[link value_types_of_t.md.nolink]
6767
* type_identity_t[link /reference/type_traits/true_type.md]
6868

69-
`Sch``scheduler`の型、型`Env`[`sender_in`](sender_in.md)`<schedule_result_t<Sch>, Env>`を満たす実行環境の型としたとき、`sender-in-of<schedule_result_t<Sch>, Env>`のモデルとなること。
69+
`Sch``scheduler`の型、型`Env`[`sender_in`](sender_in.md)`<`[`schedule_result_t`](schedule_result_t.md)`<Sch>, Env>`を満たす実行環境の型としたとき、`sender-in-of<`[`schedule_result_t`](schedule_result_t.md)`<Sch>, Env>`のモデルとなること。
7070

7171
[`copyable`](/reference/concepts/copyable.md)`<remove_cvref_t<Sch>>`および[`equality_comparable`](/reference/concepts/equality_comparable.md)`<remove_cvref_t<Sch>>`により要求される操作は、例外で終了してはならない。
7272
これらの操作やScheduler型の[`schedule`](schedule.md)関数は、異なるスレッドから同時に操作を呼び出す可能性がある場合でも、データ競合を引き起こしてはならない。
7373

7474
あるScheduler型`Sch`の2つの値`sch1`と`sch2`に対して、`sch1`と`sch2`が同じ実行リソースを共有する場合に限って、`sch1 == sch2`は`true`となる。
7575

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)`(sch)))`が`sch`と等しいこと。
76+
あるScheduler`sch`に対して、式[`get_completion_scheduler`](get_completion_scheduler.md)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md)`(sch)))`が`sch`と等しいこと。
7777

7878
あるScheduler`sch`に対して式[`get_domain`](get_domain.md.nolink)`(sch)`が適格であるとき、式`get_domain(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md)`(sch)))`も適格であり、かつ同じ型を持つ。
7979

@@ -113,6 +113,7 @@ int main()
113113

114114
## 関連項目
115115
- [`execution::schedule`](schedule.md)
116+
- [`execution::get_completion_scheduler`](get_completion_scheduler.md)
116117

117118

118119
## 参照

reference/execution/queryable.md

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ concept queryable = destructible<T>;
1111
* destructible[link /reference/concepts/destructible.md]
1212

1313
## 概要
14-
`queryable`は、型`T`がクエリ可能オブジェクト(queryable object)の制約を満たすことを表す説明専用のコンセプトである
14+
`queryable`は、型`T`がクエリ可能オブジェクトの制約を満たすことを表す説明専用のコンセプトである
1515

1616

17-
### クエリ可能オブジェクト
18-
クエリ可能オブジェクトは、クエリオブジェクト(query object)をキーとして対応する値を保持する、読み取り専用のKey/Valueデータ構造とみなせる。
17+
### クエリ可能オブジェクト(queryable object)
18+
クエリ可能オブジェクトは、クエリオブジェクトをキーとして対応する値を保持する、読み取り専用のKey/Valueデータ構造とみなせる。
1919

20-
- [`execution::env<>{}`](execution/env.md) : 空(empty)のクエリ可能オブジェクト
20+
- [`execution::env<>{}`](execution/env.md) : 空のクエリ可能オブジェクト
2121
- [`execution::prop(q, v)`](execution/prop.md) : キー`q`と対応値`v`を保持する最小のクエリ可能オブジェクト
2222
- [`execution::env{...}`](execution/env.md) : 複数のKey/Valueを保持するクエリ可能オブジェクト
2323
- `queryable`コンセプトを満たすユーザ定義クラスのオブジェクト
@@ -29,6 +29,16 @@ concept queryable = destructible<T>;
2929
- [Scheduler](execution/scheduler.md)オブジェクト自身
3030

3131

32+
### クエリオブジェクト(query object)
33+
クエリオブジェクトは、クエリ可能オブジェクトに対する問い合わせ(query)を行うカスタマイゼーションポイントオブジェクトである。
34+
35+
説明用のクエリオブジェクト`q`、クエリ可能オブジェクト`env`、引数パック`args`としたとき
36+
37+
- 問い合わせ式`q(env, args...)`は、`void`型であってはならない。
38+
- 問い合わせ式`q(env, args...)`は、クエリオブジェクトや引数を変更せず、等しさを保持(equality-preserving)する。
39+
-`env.query(q, args...)`が適格であれば、問い合わせ式`q(env, args...)`と等価である。
40+
41+
3242
## モデル
3343
説明用の`env``Env`型のオブジェクトとする。
3444
呼び出し可能オブジェクト`q`と部分式パック`args`に対して、`requires { q(env, args...) }``true`であれば、`q(env, args...)``q`に課されるセマンティック要件を満たす場合に、`Env``queryable`のモデルである。

0 commit comments

Comments
 (0)