Skip to content

Commit 0f03a4a

Browse files
committed
lazy_split_view : メンバ関数を追加 #713
1 parent 30dd29c commit 0f03a4a

File tree

7 files changed

+355
-5
lines changed

7 files changed

+355
-5
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@
247247
* sized_range[link /reference/ranges/sized_range.md]
248248
* std::ranges::owning_view[link /reference/ranges/owning_view.md]
249249
* std::ranges::ref_view[link /reference/ranges/ref_view.md]
250+
* std::ranges::single_view[link /reference/ranges/single_view.md]
250251
* subrange[link /reference/ranges/subrange.md]
251252
* view_interface[link /reference/ranges/view_interface.md]
252253
* view[link /reference/ranges/view.md]

reference/ranges/lazy_split_view.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@ concept tiny-range = sized_range<R> &&
7878

7979
| 名前 | 説明 | 対応バージョン |
8080
|--------------------------------------------------|----------------------------------|----------------|
81-
| [`(constructor)`](lazy_split_view/op_constructor.md.nolink) | コンストラクタ | C++20 |
82-
| [`base`](lazy_split_view/base.md.nolink) | `V`の参照を取得する | C++20 |
83-
| [`begin`](lazy_split_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++20 |
84-
| [`end`](lazy_split_view/end.md.nolink) | 番兵を取得する | C++20 |
81+
| [`(constructor)`](lazy_split_view/op_constructor.md) | コンストラクタ | C++20 |
82+
| [`base`](lazy_split_view/base.md) | `V`の参照を取得する | C++20 |
83+
| [`begin`](lazy_split_view/begin.md) | 先頭を指すイテレータを取得する | C++20 |
84+
| [`end`](lazy_split_view/end.md) | 番兵を取得する | C++20 |
8585

8686
## 継承しているメンバ関数
8787

@@ -98,7 +98,7 @@ concept tiny-range = sized_range<R> &&
9898

9999
| 名前 | 説明 | 対応バージョン |
100100
|-------------------------------------------------------|------------------------------|----------------|
101-
| [`(deduction_guide)`](lazy_split_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++20 |
101+
| [`(deduction_guide)`](lazy_split_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++20 |
102102

103103
##
104104

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* lazy_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 <vector>
31+
#include <iostream>
32+
33+
int main() {
34+
using std::ranges::view;
35+
36+
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
37+
std::vector<int> pattern = {4, 5};
38+
39+
std::ranges::lazy_split_view r{v, pattern};
40+
41+
// (1) コピーして取得
42+
view auto b1 = r.base();
43+
44+
// (2) ムーブして取得
45+
view auto b2 = std::move(r).base();
46+
47+
// 得られるのは元のRangeではなく、あくまでview
48+
static_assert(not std::same_as<decltype(b1), std::vector<int>>);
49+
static_assert( std::same_as<decltype(b1), std::ranges::ref_view<std::vector<int>>>);
50+
static_assert( std::same_as<decltype(b2), std::ranges::ref_view<std::vector<int>>>);
51+
}
52+
```
53+
* base[color ff0000]
54+
55+
### 出力
56+
57+
```
58+
```
59+
60+
## バージョン
61+
### 言語
62+
- C++20
63+
64+
### 処理系
65+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
66+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
67+
- [ICC](/implementation.md#icc): ??
68+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
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+
* lazy_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) : `lazy_split_view`の先頭を指すイテレータを返す。このイテレータは部分Rangeを指し、外側のRangeが空でない場合、最初の部分Rangeを指す。外側のRangeが空の場合、[`end()`](end.md)と等価なイテレータを返す。
23+
24+
## 例
25+
26+
```cpp example
27+
#include <ranges>
28+
#include <vector>
29+
#include <iostream>
30+
31+
int main() {
32+
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
33+
std::vector<int> pattern = {4, 5};
34+
35+
std::ranges::lazy_split_view r{v, pattern};
36+
37+
auto it = r.begin();
38+
39+
// 最初の部分Rangeを取得
40+
auto first_subrange = *it;
41+
for (int n : first_subrange) {
42+
std::cout << n;
43+
}
44+
std::cout << '\n';
45+
}
46+
```
47+
* begin[color ff0000]
48+
49+
### 出力
50+
51+
```
52+
123
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]
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* lazy_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) : `lazy_split_view`の番兵を返す
22+
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, 7, 8, 9};
32+
std::vector<int> pattern = {4, 5};
33+
34+
std::ranges::lazy_split_view r{v, pattern};
35+
36+
auto it = r.begin();
37+
auto end_it = r.end();
38+
while (it != end_it) {
39+
auto subrange = *it;
40+
for (int n : subrange) {
41+
std::cout << n;
42+
}
43+
std::cout << '\n';
44+
++it;
45+
}
46+
}
47+
```
48+
* end[color ff0000]
49+
* begin[link begin.md]
50+
51+
### 出力
52+
53+
```
54+
123
55+
6789
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: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* lazy_split_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
lazy_split_view()
10+
requires default_initializable<V> && default_initializable<Pattern> = default; // (1) C++20
11+
12+
constexpr explicit lazy_split_view(V base, Pattern pattern); // (2) C++20
13+
14+
template<input_range R>
15+
requires constructible_from<V, views::all_t<R>> && constructible_from<Pattern, single_view<range_value_t<R>>>
16+
constexpr explicit lazy_split_view(R&& r, range_value_t<R> e); // (3) C++20
17+
```
18+
19+
## 概要
20+
21+
[`lazy_split_view`](../lazy_split_view.md)オブジェクトを構築する。
22+
23+
- (1) : デフォルト構築
24+
- (2) : 元となるviewとパターンを指定して構築
25+
- (3) : 元となるRangeと区切り要素を指定して構築
26+
27+
## 効果
28+
29+
- (1) : `base_`と`pattern_`をデフォルト構築する
30+
- (2) : `base_`を`std::move(base)`で、`pattern_`を`std::move(pattern)`で初期化する
31+
- (3) : `base_`を`views::all(std::forward<R>(r))`で、`pattern_`を`views::single(std::move(e))`で初期化する
32+
33+
## 例
34+
```cpp example
35+
#include <iostream>
36+
#include <ranges>
37+
#include <vector>
38+
#include <string>
39+
40+
int main() {
41+
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
42+
std::vector<int> pattern = {4, 5};
43+
44+
// (2) パターンを指定して構築
45+
std::ranges::lazy_split_view view1{v, pattern};
46+
47+
// (3) 区切り要素を指定して構築
48+
std::ranges::lazy_split_view view2{v, 5};
49+
50+
for (auto inner_range : view1) {
51+
for (int n : inner_range) {
52+
std::cout << n;
53+
}
54+
std::cout << '\n';
55+
}
56+
}
57+
```
58+
* lazy_split_view[color ff0000]
59+
60+
### 出力
61+
```
62+
123
63+
6789
64+
```
65+
66+
## バージョン
67+
### 言語
68+
- C++20
69+
70+
### 処理系
71+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
72+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
73+
- [ICC](/implementation.md#icc): ??
74+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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+
lazy_split_view(R&&, P&&)
11+
-> lazy_split_view<
12+
views::all_t<R>,
13+
views::all_t<P>
14+
>; // (1) C++20
15+
16+
template<input_range R>
17+
lazy_split_view(R&&, range_value_t<R>)
18+
-> lazy_split_view<
19+
views::all_t<R>,
20+
single_view<range_value_t<R>>
21+
>; // (2) C++20
22+
}
23+
```
24+
* single_view[link /reference/ranges/single_view.md]
25+
26+
## 概要
27+
28+
[`lazy_split_view`](../lazy_split_view.md)クラステンプレートの型推論補助。
29+
30+
- (1) : 元のRangeとパターンが暗黙的に[all view](../all.md)でラップされる
31+
- (2) : 元のRangeが[all view](../all.md)、区切り要素が[`single_view`](../single_view.md)でラップされる
32+
33+
34+
## 例
35+
```cpp example
36+
#include <ranges>
37+
#include <vector>
38+
#include <concepts>
39+
40+
int main() {
41+
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
42+
std::vector<int> pattern = {4, 5};
43+
44+
// Rangeとパターン
45+
std::ranges::lazy_split_view r1{v, pattern};
46+
static_assert(std::same_as<
47+
decltype(r1),
48+
std::ranges::lazy_split_view<
49+
std::ranges::ref_view<std::vector<int>>,
50+
std::ranges::ref_view<std::vector<int>>
51+
>
52+
>);
53+
54+
// Rangeと区切り要素
55+
std::ranges::lazy_split_view r2{v, 5};
56+
static_assert(std::same_as<
57+
decltype(r2),
58+
std::ranges::lazy_split_view<
59+
std::ranges::ref_view<std::vector<int>>,
60+
std::ranges::single_view<int>
61+
>
62+
>);
63+
}
64+
```
65+
66+
### 出力
67+
```
68+
```
69+
70+
## バージョン
71+
### 言語
72+
- C++20
73+
74+
### 処理系
75+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
76+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
77+
- [ICC](/implementation.md#icc): ??
78+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

0 commit comments

Comments
 (0)