Skip to content

Commit f69a490

Browse files
committed
slide_view : メンバ関数を追加 #713
1 parent 305a617 commit f69a490

7 files changed

Lines changed: 419 additions & 21 deletions

File tree

reference/ranges/slide_view.md

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,31 +53,31 @@ namespace std::ranges {
5353
5454
## メンバ関数
5555
56-
| 名前 | 説明 | 対応バージョン |
57-
|-----------------------------------------------------|----------------------------------|----------------|
58-
| [`(constructor)`](slide_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
59-
| [`base`](slide_view/base.md.nolink) | `V`の参照を取得する | C++23 |
60-
| [`begin`](slide_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
61-
| [`end`](slide_view/end.md.nolink) | 番兵を取得する | C++23 |
62-
| [`size`](slide_view/size.md.nolink) | 要素数を取得する | C++23 |
56+
| 名前 | 説明 | 対応バージョン |
57+
|--------------------------------------------------|----------------------------------|----------------|
58+
| [`(constructor)`](slide_view/op_constructor.md) | コンストラクタ | C++23 |
59+
| [`base`](slide_view/base.md) | `V`の参照を取得する | C++23 |
60+
| [`begin`](slide_view/begin.md) | 先頭を指すイテレータを取得する | C++23 |
61+
| [`end`](slide_view/end.md) | 番兵を取得する | C++23 |
62+
| [`size`](slide_view/size.md) | 要素数を取得する | C++23 |
6363
6464
## 継承しているメンバ関数
6565
6666
| 名前 | 説明 | 対応バージョン |
6767
|----------------------------------------------|-----------------------------------|----------------|
68-
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++20 |
69-
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
70-
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
71-
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
68+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++23 |
69+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++23 |
70+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++23 |
71+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++23 |
7272
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
7373
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
74-
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
74+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++23 |
7575
7676
## 推論補助
7777
7878
| 名前 | 説明 | 対応バージョン |
7979
|-------------------------------------------------------|------------------------------|----------------|
80-
| [`(deduction_guide)`](slide_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
80+
| [`(deduction_guide)`](slide_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++23 |
8181
8282
## 例
8383
```cpp example
@@ -87,10 +87,10 @@ namespace std::ranges {
8787
8888
int main() {
8989
std::vector v = {1, 2, 3, 4, 5, 6};
90-
std::println("{}", v | std::views::slide<1>);
91-
std::println("{}", v | std::views::slide<3>);
92-
std::println("{}", v | std::views::slide<6>);
93-
std::println("{}", v | std::views::slide<7>);
90+
std::println("{}", v | std::views::slide(1));
91+
std::println("{}", v | std::views::slide(3));
92+
std::println("{}", v | std::views::slide(6));
93+
std::println("{}", v | std::views::slide(7));
9494
}
9595
```
9696
* std::views::slide[color ff0000]
@@ -108,10 +108,9 @@ int main() {
108108
- C++23
109109

110110
### 処理系
111-
- [Clang](/implementation.md#clang): ??
112-
- [GCC](/implementation.md#gcc): 14.0 [mark verified]
113-
- [ICC](/implementation.md#icc): ??
114-
- [Visual C++](/implementation.md#visual_cpp): ??
111+
- [Clang](/implementation.md#clang): 17 [mark verified]
112+
- [GCC](/implementation.md#gcc): 13.0 [mark verified]
113+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]
115114

116115
## 関連項目
117116
- [`adjacent_view`](adjacent_view.md): `slide_view` と同じように要素を取得するが、個数をコンパイル時に指定する。内側はRangeではなく[`tuple`](/reference/tuple/tuple.md)となる
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* slide_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr V base() const &
10+
requires copy_constructible<V>; // (1) C++23
11+
12+
constexpr V base() &&; // (2) C++23
13+
```
14+
15+
## 概要
16+
17+
メンバ変数として保持している、元となるRangeを取得する。
18+
19+
## 効果
20+
21+
- (1) : `return base_;`
22+
- (2) : `return std::move(base_);`
23+
24+
##
25+
```cpp example
26+
#include <ranges>
27+
#include <vector>
28+
#include <iostream>
29+
30+
int main() {
31+
std::vector<int> v = {1, 2, 3, 4, 5, 6};
32+
33+
std::ranges::slide_view sv{v, 3};
34+
35+
// (1) const左辺値参照版
36+
const auto& base1 = sv.base();
37+
std::cout << "base size: " << base1.size() << std::endl;
38+
39+
// (2) 右辺値参照版
40+
auto base2 = std::move(sv).base();
41+
std::cout << "moved base size: " << base2.size() << std::endl;
42+
}
43+
```
44+
* base[color ff0000]
45+
46+
### 出力
47+
```
48+
base size: 6
49+
moved base size: 6
50+
```
51+
52+
## バージョン
53+
### 言語
54+
- C++23
55+
56+
### 処理系
57+
- [Clang](/implementation.md#clang): 17 [mark verified]
58+
- [GCC](/implementation.md#gcc): 13.0 [mark verified]
59+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]
60+
61+
## 参照
62+
- [N4950 26.7.31 Slide view](https://timsong-cpp.github.io/cppwp/n4950/range.slide)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* slide_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr auto begin()
10+
requires (!(simple-view<V> && slide-caches-nothing<const V>)); // (1) C++23
11+
12+
constexpr auto begin() const
13+
requires slide-caches-nothing<const V>; // (2) C++23
14+
```
15+
* slide-caches-nothing[italic]
16+
17+
## 概要
18+
19+
先頭要素を指すイテレータを取得する。
20+
21+
## 効果
22+
23+
`forward_range<V>`の場合:
24+
25+
- (1), (2) : `return iterator<false>(ranges::begin(base_), ranges::end(base_), n_);`
26+
27+
それ以外の場合:
28+
29+
- (1) : `return iterator<false>(this);`
30+
- (2) : `return iterator<true>(this);`
31+
32+
ここで、`iterator`は説明専用のイテレータクラスであり、`slide-caches-nothing<V>`は`forward_range<V>`かつ`V`が`random_access_range`または`sized_range`であることを表す説明専用のコンセプトである。
33+
34+
## 例
35+
```cpp example
36+
#include <ranges>
37+
#include <vector>
38+
#include <print>
39+
40+
int main() {
41+
std::vector<int> v = {1, 2, 3, 4, 5, 6};
42+
43+
std::ranges::slide_view sv{v, 3};
44+
45+
auto it = sv.begin();
46+
47+
// 最初のスライドを出力
48+
std::println("{}", *it);
49+
}
50+
```
51+
* begin[color ff0000]
52+
53+
### 出力
54+
```
55+
[1, 2, 3]
56+
```
57+
58+
## バージョン
59+
### 言語
60+
- C++23
61+
62+
### 処理系
63+
- [Clang](/implementation.md#clang): 17 [mark verified]
64+
- [GCC](/implementation.md#gcc): 13.0 [mark verified]
65+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]
66+
67+
## 参照
68+
- [N4950 26.7.31 Slide view](https://timsong-cpp.github.io/cppwp/n4950/range.slide)

reference/ranges/slide_view/end.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* slide_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr auto end()
10+
requires (!(simple-view<V> && slide-caches-nothing<const V>)); // (1) C++23
11+
12+
constexpr auto end() const
13+
requires slide-caches-nothing<const V>; // (2) C++23
14+
```
15+
* slide-caches-nothing[italic]
16+
17+
## 概要
18+
19+
番兵またはイテレータを取得する。
20+
21+
## 効果
22+
23+
`forward_range<V>`の場合:
24+
25+
`common_range<V>`の場合:
26+
- (1), (2) : `return iterator<Const>(ranges::end(base_) - min(n_ - 1, ranges::distance(base_)), ranges::end(base_), n_);`
27+
28+
それ以外の場合:
29+
- (1), (2) : `return sentinel<Const>(ranges::end(base_));`
30+
31+
それ以外の場合(`forward_range<V>`でない場合):
32+
- (1), (2) : `return default_sentinel;`
33+
34+
ここで、`iterator`と`sentinel`は説明専用のクラスであり、`Const`は各オーバーロードに応じて`false`または`true`となる。`slide-caches-nothing<V>`は`forward_range<V>`かつ`V`が`random_access_range`または`sized_range`であることを表す説明専用のコンセプトである。
35+
36+
## 例
37+
```cpp example
38+
#include <ranges>
39+
#include <vector>
40+
#include <print>
41+
42+
int main() {
43+
std::vector<int> v = {1, 2, 3, 4, 5, 6};
44+
45+
std::ranges::slide_view sv{v, 3};
46+
47+
// イテレータ範囲で全スライドを出力
48+
for (auto it = sv.begin(); it != sv.end(); ++it) {
49+
std::println("{}", *it);
50+
}
51+
}
52+
```
53+
* end[color ff0000]
54+
* begin[link begin.md]
55+
56+
### 出力
57+
```
58+
[1, 2, 3]
59+
[2, 3, 4]
60+
[3, 4, 5]
61+
[4, 5, 6]
62+
```
63+
64+
## バージョン
65+
### 言語
66+
- C++23
67+
68+
### 処理系
69+
- [Clang](/implementation.md#clang): 17 [mark verified]
70+
- [GCC](/implementation.md#gcc): 13.0 [mark verified]
71+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]
72+
73+
## 参照
74+
- [N4950 26.7.31 Slide view](https://timsong-cpp.github.io/cppwp/n4950/range.slide)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* slide_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
slide_view()
10+
requires default_initializable<V> = default; // (1) C++23
11+
12+
constexpr explicit
13+
slide_view(V base, range_difference_t<V> n); // (2) C++23
14+
```
15+
16+
## 概要
17+
18+
`slide_view`オブジェクトを構築する。
19+
20+
- (1) : デフォルトコンストラクタ。元となるRangeを値初期化する。
21+
- (2) : 元となるRangeとスライドサイズを受け取るコンストラクタ。
22+
23+
## 効果
24+
25+
- (1) : `base_`と`n_`を値初期化する。
26+
- (2) : `base_(std::move(base))`、`n_(n)`で初期化する。
27+
28+
ここで、`base_`は元となるRangeを保持するメンバ変数、`n_`はスライドサイズを保持するメンバ変数である。
29+
30+
## 事前条件
31+
32+
- (2) : `n > 0`
33+
34+
## 例
35+
```cpp example
36+
#include <ranges>
37+
#include <vector>
38+
#include <print>
39+
40+
int main() {
41+
std::vector<int> v = {1, 2, 3, 4, 5, 6};
42+
43+
// デフォルトコンストラクタ
44+
std::ranges::slide_view<std::views::all_t<std::vector<int>>> sv1{};
45+
46+
// 元となるRangeとスライドサイズを指定
47+
std::ranges::slide_view sv2{v, 3};
48+
49+
std::println("{}", sv2);
50+
}
51+
```
52+
53+
### 出力
54+
```
55+
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
56+
```
57+
58+
## バージョン
59+
### 言語
60+
- C++23
61+
62+
### 処理系
63+
- [Clang](/implementation.md#clang): 17 [mark verified]
64+
- [GCC](/implementation.md#gcc): 13.0 [mark verified]
65+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]
66+
67+
## 参照
68+
- [N4950 26.7.31 Slide view](https://timsong-cpp.github.io/cppwp/n4950/range.slide)

0 commit comments

Comments
 (0)