Skip to content

Commit 1ab7976

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

File tree

7 files changed

+342
-5
lines changed

7 files changed

+342
-5
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@
243243
* ranges::end[link /reference/ranges/end.md]
244244
* ranges::size[link /reference/ranges/size.md]
245245
* ref_view[link /reference/ranges/ref_view.md]
246+
* single_view[link /reference/ranges/single_view.md]
246247
* sentinel_t[link /reference/ranges/sentinel_t.md]
247248
* sized_range[link /reference/ranges/sized_range.md]
248249
* std::ranges::owning_view[link /reference/ranges/owning_view.md]

reference/ranges/split_view.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ namespace std::ranges {
6262
6363
| 名前 | 説明 | 対応バージョン |
6464
|--------------------------------------------------|----------------------------------|----------------|
65-
| [`(constructor)`](split_view/op_constructor.md.nolink) | コンストラクタ | C++20 |
66-
| [`base`](split_view/base.md.nolink) | `V`の参照を取得する | C++20 |
67-
| [`begin`](split_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++20 |
68-
| [`end`](split_view/end.md.nolink) | 番兵を取得する | C++20 |
65+
| [`(constructor)`](split_view/op_constructor.md) | コンストラクタ | C++20 |
66+
| [`base`](split_view/base.md) | `V`の参照を取得する | C++20 |
67+
| [`begin`](split_view/begin.md) | 先頭を指すイテレータを取得する | C++20 |
68+
| [`end`](split_view/end.md) | 番兵を取得する | C++20 |
6969
7070
## 継承しているメンバ関数
7171
@@ -81,7 +81,7 @@ namespace std::ranges {
8181
8282
| 名前 | 説明 | 対応バージョン |
8383
|-------------------------------------------------------|------------------------------|----------------|
84-
| [`(deduction_guide)`](split_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++20 |
84+
| [`(deduction_guide)`](split_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++20 |
8585
8686
## 例
8787
```cpp example

reference/ranges/split_view/base.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* split_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr V base() const &
10+
requires copy_constructible<V>; // (1) C++20
11+
12+
constexpr V base() &&; // (2) C++20
13+
```
14+
15+
## 概要
16+
17+
メンバ変数として保持している、元の`view`を取得する。
18+
19+
## 効果
20+
21+
入力`view``V`)のオブジェクトを`base_`というメンバに保持するとして
22+
23+
- (1) : `return base_;` と等価
24+
- (2) : `return std::move(base_);` と等価
25+
26+
##
27+
28+
```cpp example
29+
#include <ranges>
30+
#include <string_view>
31+
#include <iostream>
32+
33+
int main() {
34+
using std::ranges::view;
35+
using namespace std::literals;
36+
37+
std::string_view text = "hello,world,split";
38+
std::string_view delimiter = ",";
39+
40+
std::ranges::split_view r{text, delimiter};
41+
42+
// (1) コピーして取得
43+
view auto b1 = r.base();
44+
45+
// (2) ムーブして取得
46+
view auto b2 = std::move(r).base();
47+
48+
// 得られるのは元のRangeではなく、あくまでview
49+
static_assert(not std::same_as<decltype(b1), std::string_view>);
50+
static_assert( std::same_as<decltype(b1), std::ranges::ref_view<std::string_view>>);
51+
static_assert( std::same_as<decltype(b2), std::ranges::ref_view<std::string_view>>);
52+
}
53+
```
54+
* base[color ff0000]
55+
56+
### 出力
57+
58+
```
59+
```
60+
61+
## バージョン
62+
### 言語
63+
- C++20
64+
65+
### 処理系
66+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
67+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
68+
- [ICC](/implementation.md#icc): ??
69+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

reference/ranges/split_view/begin.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* split_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr auto begin()
10+
requires (!simple-view<V>); // (1) C++20
11+
12+
constexpr auto begin() const
13+
requires range<const V> &&
14+
forward_range<const Pattern>; // (2) C++20
15+
```
16+
17+
## 概要
18+
19+
`view`の先頭要素を指すイテレータを取得する。
20+
21+
## 戻り値
22+
- (1), (2) : `split_view`の先頭を指すイテレータを返す。このイテレータは部分Rangeを指し、外側のRangeが空でない場合、最初の部分Rangeを指す。外側のRangeが空の場合、[`end()`](end.md)と等価なイテレータを返す。
23+
24+
## 例
25+
26+
```cpp example
27+
#include <ranges>
28+
#include <string_view>
29+
#include <iostream>
30+
31+
int main() {
32+
using namespace std::literals;
33+
34+
std::string_view text = "hello,world,split";
35+
std::string_view delimiter = ",";
36+
37+
std::ranges::split_view r{text, delimiter};
38+
39+
auto it = r.begin();
40+
41+
// 最初の部分Rangeを取得
42+
auto first_subrange = *it;
43+
std::string_view sv{first_subrange.begin(), first_subrange.end()};
44+
std::cout << sv << '\n';
45+
}
46+
```
47+
* begin[color ff0000]
48+
49+
### 出力
50+
51+
```
52+
hello
53+
```
54+
55+
## バージョン
56+
### 言語
57+
- C++20
58+
59+
### 処理系
60+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
61+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
62+
- [ICC](/implementation.md#icc): ??
63+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

reference/ranges/split_view/end.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* split_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr auto end()
10+
requires (!simple-view<V>); // (1) C++20
11+
12+
constexpr auto end() const
13+
requires range<const V> &&
14+
forward_range<const Pattern>; // (2) C++20
15+
```
16+
17+
## 概要
18+
番兵を取得する。
19+
20+
## 戻り値
21+
- (1), (2) : `split_view`の番兵を返す
22+
23+
## 例
24+
25+
```cpp example
26+
#include <ranges>
27+
#include <string_view>
28+
#include <iostream>
29+
30+
int main() {
31+
using namespace std::literals;
32+
33+
std::string_view text = "hello,world,split";
34+
std::string_view delimiter = ",";
35+
36+
std::ranges::split_view r{text, delimiter};
37+
38+
auto it = r.begin();
39+
auto end_it = r.end();
40+
while (it != end_it) {
41+
auto subrange = *it;
42+
std::string_view sv{subrange.begin(), subrange.end()};
43+
std::cout << sv << '\n';
44+
++it;
45+
}
46+
}
47+
```
48+
* end[color ff0000]
49+
* begin[link begin.md]
50+
51+
### 出力
52+
53+
```
54+
hello
55+
world
56+
split
57+
```
58+
59+
## バージョン
60+
### 言語
61+
- C++20
62+
63+
### 処理系
64+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
65+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
66+
- [ICC](/implementation.md#icc): ??
67+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* split_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
split_view()
10+
requires default_initializable<V> &&
11+
default_initializable<Pattern>
12+
= default; // (1) C++20
13+
14+
constexpr split_view(V base, Pattern pattern); // (2) C++20
15+
```
16+
17+
## 概要
18+
19+
[`split_view`](../split_view.md)オブジェクトを構築する。
20+
21+
- (1) : デフォルト構築
22+
- (2) : 元となるviewとパターンを指定して構築
23+
24+
## 効果
25+
26+
- (1) : `base_`と`pattern_`をデフォルト構築する
27+
- (2) : `base_`を`std::move(base)`で、`pattern_`を`std::move(pattern)`で初期化する
28+
29+
## 例
30+
```cpp example
31+
#include <iostream>
32+
#include <ranges>
33+
#include <string_view>
34+
35+
int main() {
36+
using namespace std::literals;
37+
38+
std::string_view text = "hello,world,split";
39+
std::string_view delimiter = ",";
40+
41+
std::ranges::split_view view{text, delimiter};
42+
43+
for (auto subrange : view) {
44+
std::string_view sv{subrange.begin(), subrange.end()};
45+
std::cout << sv << '\n';
46+
}
47+
}
48+
```
49+
* split_view[color ff0000]
50+
51+
### 出力
52+
```
53+
hello
54+
world
55+
split
56+
```
57+
58+
## バージョン
59+
### 言語
60+
- C++20
61+
62+
### 処理系
63+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
64+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
65+
- [ICC](/implementation.md#icc): ??
66+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# 推論補助
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* function[meta id-type]
5+
* cpp20[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template<class R, class P>
10+
split_view(R&&, P&&)
11+
-> split_view<views::all_t<R>, views::all_t<P>>; // (1) C++20
12+
13+
template<forward_range R>
14+
split_view(R&&, range_value_t<R>)
15+
-> split_view<views::all_t<R>, single_view<range_value_t<R>>>; // (2) C++20
16+
}
17+
```
18+
19+
## 概要
20+
21+
[`split_view`](../split_view.md)クラステンプレートの型推論補助。
22+
23+
- (1) : 元のRangeとパターンが暗黙的に[all view](../all.md)でラップされる
24+
- (2) : 元のRangeが[all view](../all.md)、区切り要素が[`single_view`](../single_view.md)でラップされる
25+
26+
## 例
27+
```cpp example
28+
#include <ranges>
29+
#include <string>
30+
#include <concepts>
31+
32+
int main() {
33+
std::string_view text = "hello,world,split";
34+
std::string_view delimiter = ",";
35+
36+
std::ranges::split_view r1{text, delimiter};
37+
static_assert(std::same_as<
38+
decltype(r1),
39+
std::ranges::split_view<
40+
std::string_view,
41+
std::string_view
42+
>
43+
>);
44+
45+
std::ranges::split_view r2{
46+
std::string{"hello,world,split"},
47+
std::string{","}
48+
};
49+
static_assert(std::same_as<
50+
decltype(r2),
51+
std::ranges::split_view<
52+
std::ranges::owning_view<std::string>,
53+
std::ranges::owning_view<std::string>
54+
>
55+
>);
56+
}
57+
```
58+
59+
### 出力
60+
```
61+
```
62+
63+
## バージョン
64+
### 言語
65+
- C++20
66+
67+
### 処理系
68+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
69+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
70+
- [ICC](/implementation.md#icc): ??
71+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

0 commit comments

Comments
 (0)