Skip to content

Commit f1ce7b6

Browse files
committed
concat_view : メンバ関数を追加 #713
1 parent 1ab7976 commit f1ce7b6

File tree

6 files changed

+334
-16
lines changed

6 files changed

+334
-16
lines changed

reference/ranges/concat_view.md

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -108,28 +108,28 @@ namespace std::ranges {
108108

109109
| 名前 | 説明 | 対応バージョン |
110110
|--------------------------------------------------|----------------------------------|----------------|
111-
| [`(constructor)`](concat_view/op_constructor.md.nolink) | コンストラクタ | C++26 |
112-
| [`begin`](concat_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++26 |
113-
| [`end`](concat_view/end.md.nolink) | 番兵を取得する | C++26 |
114-
| [`size`](concat_view/size.md.nolink) | 要素数を取得する | C++26 |
111+
| [`(constructor)`](concat_view/op_constructor.md) | コンストラクタ | C++26 |
112+
| [`begin`](concat_view/begin.md) | 先頭を指すイテレータを取得する | C++26 |
113+
| [`end`](concat_view/end.md) | 番兵を取得する | C++26 |
114+
| [`size`](concat_view/size.md) | 要素数を取得する | C++26 |
115115

116116
## 継承しているメンバ関数
117117

118118
| 名前 | 説明 | 対応バージョン |
119119
|----------------------------------------------|-----------------------------------|----------------|
120-
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++20 |
121-
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
122-
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
123-
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
124-
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
125-
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
126-
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
120+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++26 |
121+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++26 |
122+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++26 |
123+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++26 |
124+
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++26 |
125+
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++26 |
126+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++26 |
127127

128128
## 推論補助
129129

130130
| 名前 | 説明 | 対応バージョン |
131131
|-------------------------------------------------------|------------------------------|----------------|
132-
| [`(deduction_guide)`](concat_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
132+
| [`(deduction_guide)`](concat_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++26 |
133133

134134
##
135135
```cpp example
@@ -155,10 +155,9 @@ int main() {
155155
- C++26
156156

157157
### 処理系
158-
- [Clang](/implementation.md#clang): ??
159-
- [GCC](/implementation.md#gcc): ??
160-
- [ICC](/implementation.md#icc): ??
161-
- [Visual C++](/implementation.md#visual_cpp): ??
158+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
159+
- [GCC](/implementation.md#gcc): 15 [mark verified]
160+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
162161

163162
## 参照
164163
- [26.7.18 Concat view](https://timsong-cpp.github.io/cppwp/range.concat) (2024-08-10)

reference/ranges/concat_view/begin.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* concat_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr auto begin()
10+
requires (!simple-view<Views> || ...); // (1) C++26
11+
12+
constexpr auto begin() const
13+
requires (range<const Views> && ...); // (2) C++26
14+
```
15+
16+
## 概要
17+
18+
`view`の先頭要素を指すイテレータを取得する。
19+
20+
## 戻り値
21+
- (1), (2) : `concat_view`の先頭を指すイテレータを返す。連結されたRangeが空でない場合、最初の非空Rangeの先頭要素を指す。すべてのRangeが空の場合、[`end()`](end.md)と等価なイテレータを返す。
22+
23+
## 例
24+
25+
```cpp example
26+
#include <print>
27+
#include <ranges>
28+
#include <array>
29+
#include <vector>
30+
31+
int main() {
32+
std::vector<int> v1{1, 2, 3};
33+
std::vector<int> v2{4, 5};
34+
std::array<int, 3> a{6, 7, 8};
35+
36+
std::ranges::concat_view r{v1, v2, a};
37+
38+
auto it = r.begin();
39+
40+
int x = *it;
41+
std::println("{}", x);
42+
}
43+
```
44+
* begin[color ff0000]
45+
46+
### 出力
47+
48+
```
49+
1
50+
```
51+
52+
## バージョン
53+
### 言語
54+
- C++26
55+
56+
### 処理系
57+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
58+
- [GCC](/implementation.md#gcc): 15 [mark verified]
59+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]

reference/ranges/concat_view/end.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* concat_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr auto end()
10+
requires (!simple-view<Views> || ...); // (1) C++26
11+
12+
constexpr auto end() const
13+
requires (range<const Views> && ...); // (2) C++26
14+
```
15+
16+
## 概要
17+
番兵を取得する。
18+
19+
## 戻り値
20+
- (1), (2) : `concat_view`の番兵を返す
21+
22+
## 例
23+
24+
```cpp example
25+
#include <print>
26+
#include <ranges>
27+
#include <array>
28+
#include <vector>
29+
30+
int main() {
31+
std::vector<int> v1{1, 2, 3};
32+
std::vector<int> v2{4, 5};
33+
std::array<int, 3> a{6, 7, 8};
34+
35+
std::ranges::concat_view r{v1, v2, a};
36+
37+
auto it = r.begin();
38+
auto end_it = r.end();
39+
while (it != end_it) {
40+
std::print("{} ", *it);
41+
++it;
42+
}
43+
std::println();
44+
}
45+
```
46+
* end[color ff0000]
47+
* begin[link begin.md]
48+
49+
### 出力
50+
51+
```
52+
1 2 3 4 5 6 7 8
53+
```
54+
55+
## バージョン
56+
### 言語
57+
- C++26
58+
59+
### 処理系
60+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
61+
- [GCC](/implementation.md#gcc): 15 [mark verified]
62+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* concat_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
concat_view()
10+
requires (default_initializable<Views> && ...) = default; // (1) C++26
11+
12+
constexpr explicit concat_view(Views... views); // (2) C++26
13+
```
14+
15+
## 概要
16+
17+
[`concat_view`](../concat_view.md)オブジェクトを構築する。
18+
19+
- (1) : デフォルト構築
20+
- (2) : 連結する複数のviewを指定して構築
21+
22+
## 効果
23+
24+
- (1) : 各`views_`メンバをデフォルト構築する
25+
- (2) : `views_`を`std::move(views)...`で初期化する
26+
27+
## 例
28+
```cpp example
29+
#include <print>
30+
#include <ranges>
31+
#include <array>
32+
#include <vector>
33+
34+
int main() {
35+
std::vector<int> v1{1, 2, 3};
36+
std::vector<int> v2{4, 5};
37+
std::array<int, 3> a{6, 7, 8};
38+
39+
std::ranges::concat_view view{v1, v2, a};
40+
41+
for (int i : view) {
42+
std::print("{} ", i);
43+
}
44+
std::println();
45+
}
46+
```
47+
* concat_view[color ff0000]
48+
49+
### 出力
50+
```
51+
1 2 3 4 5 6 7 8
52+
```
53+
54+
## バージョン
55+
### 言語
56+
- C++26
57+
58+
### 処理系
59+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
60+
- [GCC](/implementation.md#gcc): 15 [mark verified]
61+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# 推論補助
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* function[meta id-type]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template<class... Rs>
10+
concat_view(Rs&&...) -> concat_view<views::all_t<Rs>...>;
11+
}
12+
```
13+
14+
## 概要
15+
16+
[`concat_view`](../concat_view.md)クラステンプレートの型推論補助。
17+
18+
この推論補助によって、渡されたRangeが暗黙的に[all view](../all.md)でラップされる。
19+
20+
## 例
21+
```cpp example
22+
#include <concepts>
23+
#include <ranges>
24+
#include <array>
25+
#include <vector>
26+
27+
int main() {
28+
std::vector<int> v1{1, 2, 3};
29+
std::vector<int> v2{4, 5};
30+
std::array<int, 3> a{6, 7, 8};
31+
32+
std::ranges::concat_view r1{v1, v2, a};
33+
static_assert(std::same_as<
34+
decltype(r1),
35+
std::ranges::concat_view<
36+
std::ranges::ref_view<std::vector<int>>,
37+
std::ranges::ref_view<std::vector<int>>,
38+
std::ranges::ref_view<std::array<int, 3>>
39+
>
40+
>);
41+
42+
std::ranges::concat_view r2{
43+
std::vector<int>{1, 2, 3},
44+
std::vector<int>{4, 5},
45+
std::array<int, 3>{6, 7, 8}
46+
};
47+
static_assert(std::same_as<
48+
decltype(r2),
49+
std::ranges::concat_view<
50+
std::ranges::owning_view<std::vector<int>>,
51+
std::ranges::owning_view<std::vector<int>>,
52+
std::ranges::owning_view<std::array<int, 3>>
53+
>
54+
>);
55+
}
56+
```
57+
58+
### 出力
59+
```
60+
```
61+
62+
## バージョン
63+
### 言語
64+
- C++26
65+
66+
### 処理系
67+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
68+
- [GCC](/implementation.md#gcc): 15 [mark verified]
69+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]

reference/ranges/concat_view/size.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# size
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* concat_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr auto size()
10+
requires (sized_range<Views> && ...); // (1) C++26
11+
12+
constexpr auto size() const
13+
requires (sized_range<const Views> && ...); // (2) C++26
14+
```
15+
16+
## 概要
17+
連結されたすべてのRangeの要素数の合計を取得する。
18+
19+
## 制約
20+
- (1) : `Views...`のすべてが[`sized_range`](../sized_range.md)であること
21+
- (2) : `const Views...`のすべてが[`sized_range`](../sized_range.md)であること
22+
23+
## 戻り値
24+
- (1), (2) : 連結されたすべてのRangeの要素数の合計を返す
25+
26+
## 計算量
27+
- O(1)
28+
29+
## 例
30+
31+
```cpp example
32+
#include <print>
33+
#include <ranges>
34+
#include <array>
35+
#include <vector>
36+
#include <iterator>
37+
38+
int main() {
39+
std::vector<int> v1{1, 2, 3};
40+
std::vector<int> v2{4, 5};
41+
std::array<int, 3> a{6, 7, 8};
42+
43+
std::ranges::concat_view r{v1, v2, a};
44+
45+
std::println("size: {}", r.size());
46+
47+
// 実際の要素数を確認
48+
auto count = std::ranges::distance(r);
49+
std::println("distance: {}", count);
50+
}
51+
```
52+
* size[color ff0000]
53+
54+
### 出力
55+
56+
```
57+
size: 8
58+
distance: 8
59+
```
60+
61+
## バージョン
62+
### 言語
63+
- C++26
64+
65+
### 処理系
66+
- [Clang](/implementation.md#clang): 20 [mark noimpl]
67+
- [GCC](/implementation.md#gcc): 15 [mark verified]
68+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]

0 commit comments

Comments
 (0)