Skip to content

Commit 2c71443

Browse files
committed
chunk_by_view : メンバ関数を追加 #713
1 parent 3aebb6e commit 2c71443

File tree

7 files changed

+373
-10
lines changed

7 files changed

+373
-10
lines changed

reference/ranges/chunk_by_view.md

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ namespace std::ranges {
4949
5050
| 名前 | 説明 | 対応バージョン |
5151
|-----------------------------------------------------|----------------------------------|----------------|
52-
| [`(constructor)`](chunk_by_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
53-
| [`base`](chunk_by_view/base.md.nolink) | `V`の参照を取得する | C++23 |
54-
| [`pred`](chunk_by_view/pred.md.nolink) | 述語を取得する | C++23 |
55-
| [`begin`](chunk_by_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
56-
| [`end`](chunk_by_view/end.md.nolink) | 番兵を取得する | C++23 |
52+
| [`(constructor)`](chunk_by_view/op_constructor.md) | コンストラクタ | C++23 |
53+
| [`base`](chunk_by_view/base.md) | `V`の参照を取得する | C++23 |
54+
| [`pred`](chunk_by_view/pred.md) | 述語を取得する | C++23 |
55+
| [`begin`](chunk_by_view/begin.md) | 先頭を指すイテレータを取得する | C++23 |
56+
| [`end`](chunk_by_view/end.md) | 番兵を取得する | C++23 |
5757
5858
## 継承しているメンバ関数
5959
@@ -71,7 +71,7 @@ namespace std::ranges {
7171
7272
| 名前 | 説明 | 対応バージョン |
7373
|-------------------------------------------------------|------------------------------|----------------|
74-
| [`(deduction_guide)`](chunk_by_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
74+
| [`(deduction_guide)`](chunk_by_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++23 |
7575
7676
## 例
7777
```cpp example
@@ -87,7 +87,6 @@ int main() {
8787
}
8888
```
8989
* std::views::chunk_by[color ff0000]
90-
* std::ranges::less_equal[link /reference/functional/ranges_less_equal.md]
9190
* 転倒[link https://ja.wikipedia.org/wiki/%E8%BB%A2%E5%80%92_(%E6%95%B0%E5%AD%A6)]
9291

9392
### 出力
@@ -100,10 +99,9 @@ int main() {
10099
- C++23
101100

102101
### 処理系
103-
- [Clang](/implementation.md#clang): ??
102+
- [Clang](/implementation.md#clang): 17 [mark verified]
104103
- [GCC](/implementation.md#gcc): 14.0 [mark verified]
105-
- [ICC](/implementation.md#icc): ??
106-
- [Visual C++](/implementation.md#visual_cpp): ??
104+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]
107105

108106
## 参照
109107
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* chunk_by_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr V base() const & requires copy_constructible<V>; // (1) C++23
10+
constexpr V base() &&; // (2) C++23
11+
```
12+
13+
## 概要
14+
15+
メンバ変数として保持している、元となるRangeを取得する。
16+
17+
## 効果
18+
19+
- (1) : `return base_;`
20+
- (2) : `return std::move(base_);`
21+
22+
##
23+
```cpp example
24+
#include <ranges>
25+
#include <vector>
26+
#include <functional>
27+
#include <iostream>
28+
29+
int main() {
30+
std::vector<int> v = {1, 2, 2, 3, 0, 4, 5, 2};
31+
32+
std::ranges::chunk_by_view cv{v, std::ranges::less_equal{}};
33+
34+
// (1) const左辺値参照版
35+
const auto& base1 = cv.base();
36+
std::cout << "base size: " << base1.size() << std::endl;
37+
38+
// (2) 右辺値参照版
39+
auto base2 = std::move(cv).base();
40+
std::cout << "moved base size: " << base2.size() << std::endl;
41+
}
42+
```
43+
* base[color ff0000]
44+
45+
### 出力
46+
```
47+
base size: 8
48+
moved base size: 8
49+
```
50+
51+
## バージョン
52+
### 言語
53+
- C++23
54+
55+
### 処理系
56+
- [Clang](/implementation.md#clang): 17 [mark verified]
57+
- [GCC](/implementation.md#gcc): 14.0 [mark verified]
58+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]
59+
60+
## 参照
61+
- [N4950 26.7.30 Chunk by view](https://timsong-cpp.github.io/cppwp/n4950/range.chunk.by)
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+
* chunk_by_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr iterator begin(); // (1) C++23
10+
11+
constexpr const_iterator begin() const
12+
requires forward_range<const V>; // (2) C++23
13+
```
14+
* iterator[italic]
15+
* const_iterator[italic]
16+
17+
## 概要
18+
19+
先頭要素を指すイテレータを取得する。
20+
21+
## 効果
22+
23+
- (1) : `return iterator(*this, ranges::begin(base_));`
24+
- (2) : `return const_iterator(*this, ranges::begin(base_));`
25+
26+
ここで、`iterator``const_iterator`は説明専用のイテレータクラスである。
27+
28+
##
29+
```cpp example
30+
#include <ranges>
31+
#include <vector>
32+
#include <functional>
33+
#include <print>
34+
35+
int main() {
36+
std::vector<int> v = {1, 2, 2, 3, 0, 4, 5, 2};
37+
38+
std::ranges::chunk_by_view cv{v, std::ranges::less_equal{}};
39+
40+
auto it = cv.begin();
41+
42+
// 最初のチャンクを出力
43+
std::println("{}", *it);
44+
}
45+
```
46+
* begin[color ff0000]
47+
48+
### 出力
49+
```
50+
[1, 2, 2, 3]
51+
```
52+
53+
## バージョン
54+
### 言語
55+
- C++23
56+
57+
### 処理系
58+
- [Clang](/implementation.md#clang): 17 [mark verified]
59+
- [GCC](/implementation.md#gcc): 14.0 [mark verified]
60+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]
61+
62+
## 参照
63+
- [N4950 26.7.30 Chunk by view](https://timsong-cpp.github.io/cppwp/n4950/range.chunk.by)
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+
* chunk_by_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr default_sentinel_t end() const; // (1) C++23
10+
```
11+
12+
## 概要
13+
14+
番兵を取得する。
15+
16+
## 効果
17+
18+
- (1) : `return default_sentinel;`
19+
20+
## 備考
21+
22+
`chunk_by_view`は常に`default_sentinel_t`を番兵として使用する。これは、チャンクの境界が動的に決まるため、事前にサイズを計算することができないためである。
23+
24+
##
25+
```cpp example
26+
#include <ranges>
27+
#include <vector>
28+
#include <functional>
29+
#include <print>
30+
31+
int main() {
32+
std::vector<int> v = {1, 2, 2, 3, 0, 4, 5, 2};
33+
34+
std::ranges::chunk_by_view cv{v, std::ranges::less_equal{}};
35+
36+
// イテレータ範囲で全チャンクを出力
37+
for (auto it = cv.begin(); it != cv.end(); ++it) {
38+
std::println("{}", *it);
39+
}
40+
}
41+
```
42+
* end[color ff0000]
43+
* begin[link begin.md]
44+
45+
### 出力
46+
```
47+
[1, 2, 2, 3]
48+
[0, 4, 5]
49+
[2]
50+
```
51+
52+
## バージョン
53+
### 言語
54+
- C++23
55+
56+
### 処理系
57+
- [Clang](/implementation.md#clang): 17 [mark verified]
58+
- [GCC](/implementation.md#gcc): 14.0 [mark verified]
59+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]
60+
61+
## 参照
62+
- [N4950 26.7.30 Chunk by view](https://timsong-cpp.github.io/cppwp/n4950/range.chunk.by)
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* chunk_by_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
chunk_by_view()
10+
requires default_initializable<V> &&
11+
default_initializable<Pred> = default; // (1) C++23
12+
13+
constexpr explicit
14+
chunk_by_view(V base, Pred pred); // (2) C++23
15+
```
16+
17+
## 概要
18+
19+
`chunk_by_view`オブジェクトを構築する。
20+
21+
- (1) : デフォルトコンストラクタ。元となるRangeと述語を値初期化する。
22+
- (2) : 元となるRangeと述語を受け取るコンストラクタ。
23+
24+
## 効果
25+
26+
- (1) : `base_`と`pred_`を値初期化する。
27+
- (2) : `base_(std::move(base))`、`pred_(std::move(pred))`で初期化する。
28+
29+
ここで、`base_`は元となるRangeを保持するメンバ変数、`pred_`は述語を保持するメンバ変数である。
30+
31+
## 例
32+
```cpp example
33+
#include <ranges>
34+
#include <vector>
35+
#include <functional>
36+
#include <print>
37+
38+
int main() {
39+
std::vector<int> v = {1, 2, 2, 3, 0, 4, 5, 2};
40+
41+
// デフォルトコンストラクタ
42+
std::ranges::chunk_by_view<std::views::all_t<std::vector<int>>, std::ranges::less_equal> cv1{};
43+
44+
// 元となるRangeと述語を指定
45+
std::ranges::chunk_by_view cv2{v, std::ranges::less_equal{}};
46+
47+
std::println("{}", cv2);
48+
}
49+
```
50+
* std::ranges::chunk_by_view[color ff0000]
51+
52+
### 出力
53+
```
54+
[[1, 2, 2, 3], [0, 4, 5], [2]]
55+
```
56+
57+
## バージョン
58+
### 言語
59+
- C++23
60+
61+
### 処理系
62+
- [Clang](/implementation.md#clang): 17 [mark verified]
63+
- [GCC](/implementation.md#gcc): 14.0 [mark verified]
64+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]
65+
66+
## 参照
67+
- [N4950 26.7.30 Chunk by view](https://timsong-cpp.github.io/cppwp/n4950/range.chunk.by)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# 推論補助
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* chunk_by_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
namespace std::ranges {
10+
template<class R, class Pred>
11+
chunk_by_view(R&&, Pred) -> chunk_by_view<views::all_t<R>, Pred>;
12+
}
13+
```
14+
15+
## 概要
16+
`chunk_by_view`クラステンプレートの型推論補助。
17+
18+
## 例
19+
```cpp example
20+
#include <ranges>
21+
#include <vector>
22+
#include <functional>
23+
#include <type_traits>
24+
25+
int main() {
26+
std::vector<int> v = {1, 2, 2, 3, 0, 4, 5, 2};
27+
28+
// chunk_by_viewの型を明示的に指定する必要がない
29+
std::ranges::chunk_by_view cv{v, std::ranges::less_equal{}};
30+
31+
// 推論された型を確認
32+
static_assert(std::same_as<
33+
decltype(cv),
34+
std::ranges::chunk_by_view<
35+
std::ranges::ref_view<std::vector<int>>,
36+
std::ranges::less_equal
37+
>
38+
>);
39+
}
40+
```
41+
* std::ranges::chunk_by_view[color ff0000]
42+
43+
### 出力
44+
```
45+
```
46+
47+
## バージョン
48+
### 言語
49+
- C++23
50+
51+
### 処理系
52+
- [Clang](/implementation.md#clang): 17 [mark verified]
53+
- [GCC](/implementation.md#gcc): 14.0 [mark verified]
54+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 3 [mark verified]

0 commit comments

Comments
 (0)