Skip to content

Commit 3aebb6e

Browse files
committed
certesian_product_view : メンバ関数を追加 #713
1 parent 4716074 commit 3aebb6e

File tree

6 files changed

+349
-7
lines changed

6 files changed

+349
-7
lines changed

reference/ranges/cartesian_product_view.md

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ namespace std::ranges {
9696

9797
| 名前 | 説明 | 対応バージョン |
9898
|--------------------------------------------------|----------------------------------|----------------|
99-
| [`(constructor)`](cartesian_product_view/op_constructor.md.nolink) | コンストラクタ | C++23 |
100-
| [`begin`](cartesian_product_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 |
101-
| [`end`](cartesian_product_view/end.md.nolink) | 番兵を取得する | C++23 |
102-
| [`size`](cartesian_product_view/size.md.nolink) | 要素数を取得する | C++23 |
99+
| [`(constructor)`](cartesian_product_view/op_constructor.md) | コンストラクタ | C++23 |
100+
| [`begin`](cartesian_product_view/begin.md) | 先頭を指すイテレータを取得する | C++23 |
101+
| [`end`](cartesian_product_view/end.md) | 番兵を取得する | C++23 |
102+
| [`size`](cartesian_product_view/size.md) | 要素数を取得する | C++23 |
103103

104104
## 継承しているメンバ関数
105105

@@ -117,7 +117,7 @@ namespace std::ranges {
117117

118118
| 名前 | 説明 | 対応バージョン |
119119
|-------------------------------------------------------|------------------------------|----------------|
120-
| [`(deduction_guide)`](cartesian_product_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
120+
| [`(deduction_guide)`](cartesian_product_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++23 |
121121

122122
##
123123
```cpp example
@@ -151,8 +151,7 @@ int main() {
151151
### 処理系
152152
- [Clang](/implementation.md#clang): 16.0 [mark verified]
153153
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
154-
- [ICC](/implementation.md#icc): ??
155-
- [Visual C++](/implementation.md#visual_cpp): ??
154+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
156155

157156
## 参照
158157
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* cartesian_product_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr iterator<false> begin()
10+
requires (!simple-view<First> || ... || !simple-view<Vs>); // (1) C++23
11+
12+
constexpr iterator<true> begin() const; // (2) C++23
13+
```
14+
* iterator[italic]
15+
16+
## 概要
17+
18+
先頭要素を指すイテレータを取得する。
19+
20+
## 効果
21+
22+
- (1), (2) : 以下と等価
23+
```cpp
24+
return iterator<Const>(*this, tuple-transform(ranges::begin, bases_));
25+
```
26+
27+
ここで、`iterator`は説明専用のイテレータクラスであり、`tuple-transform`は説明専用の関数で、tupleの各要素に関数を適用する。`Const`は各オーバーロードに応じて`false`または`true`となる。
28+
29+
## 例
30+
```cpp example
31+
#include <ranges>
32+
#include <vector>
33+
#include <list>
34+
#include <print>
35+
36+
int main() {
37+
std::vector<int> v = {1, 2};
38+
std::list<char> l = {'a', 'b'};
39+
40+
std::ranges::cartesian_product_view cv{v, l};
41+
42+
auto it = cv.begin();
43+
44+
// 最初の要素を出力
45+
std::println("first element: {}", *it);
46+
}
47+
```
48+
* begin[color ff0000]
49+
50+
### 出力
51+
```
52+
first element: (1, 'a')
53+
```
54+
55+
## バージョン
56+
### 言語
57+
- C++23
58+
59+
### 処理系
60+
- [Clang](/implementation.md#clang): 16.0 [mark verified]
61+
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
62+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
63+
64+
## 参照
65+
- [N4950 26.7.33 Cartesian product view](https://timsong-cpp.github.io/cppwp/n4950/range.cartesian)
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* cartesian_product_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr iterator<false> end()
10+
requires ((!simple-view<First> || ... || !simple-view<Vs>) &&
11+
cartesian-product-is-common<First, Vs...>); // (1) C++23
12+
13+
constexpr default_sentinel_t end() const noexcept; // (2) C++23
14+
15+
constexpr iterator<true> end() const
16+
requires cartesian-product-is-common<const First, const Vs...>; // (3) C++23
17+
```
18+
* iterator[italic]
19+
* cartesian-product-is-common[italic]
20+
21+
## 概要
22+
23+
番兵またはイテレータを取得する。
24+
25+
## 効果
26+
27+
- (1) : 以下と等価
28+
```cpp
29+
auto end_tuple = tuple-transform([](auto& r) { return cartesian-common-arg-end(r); }, bases_);
30+
return iterator<false>(*this, std::move(end_tuple));
31+
```
32+
33+
- (2) : `return default_sentinel;`
34+
35+
- (3) : 以下と等価
36+
```cpp
37+
auto end_tuple = tuple-transform([](auto& r) { return cartesian-common-arg-end(r); }, bases_);
38+
return iterator<true>(*this, std::move(end_tuple));
39+
```
40+
41+
ここで、`iterator`は説明専用のイテレータクラス、`tuple-transform`は説明専用の関数で、tupleの各要素に関数を適用する。`cartesian-common-arg-end`は説明専用の関数である。
42+
43+
## 例
44+
```cpp example
45+
#include <ranges>
46+
#include <vector>
47+
#include <list>
48+
#include <print>
49+
50+
int main() {
51+
std::vector<int> v = {1, 2};
52+
std::list<char> l = {'a', 'b'};
53+
54+
std::ranges::cartesian_product_view cv{v, l};
55+
56+
// イテレータ範囲で全要素を出力
57+
for (auto it = cv.begin(); it != cv.end(); ++it) {
58+
std::println("{}", *it);
59+
}
60+
}
61+
```
62+
* end[color ff0000]
63+
* begin[link begin.md]
64+
65+
### 出力
66+
```
67+
(1, 'a')
68+
(1, 'b')
69+
(2, 'a')
70+
(2, 'b')
71+
```
72+
73+
## バージョン
74+
### 言語
75+
- C++23
76+
77+
### 処理系
78+
- [Clang](/implementation.md#clang): 16.0 [mark verified]
79+
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
80+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
81+
82+
## 参照
83+
- [N4950 26.7.33 Cartesian product view](https://timsong-cpp.github.io/cppwp/n4950/range.cartesian)
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+
* cartesian_product_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
cartesian_product_view() = default; // (1) C++23
10+
11+
constexpr explicit
12+
cartesian_product_view(First first_base, Vs... bases); // (2) C++23
13+
```
14+
15+
## 概要
16+
17+
`cartesian_product_view`オブジェクトを構築する。
18+
19+
- (1) : デフォルトコンストラクタ。各Rangeを値初期化する。
20+
- (2) : 複数のRangeを受け取るコンストラクタ。
21+
22+
## 効果
23+
24+
- (1) : 各メンバを値初期化する。
25+
- (2) : `bases_`を`std::tuple<First, Vs...>(std::move(first_base), std::move(bases)...)`で初期化する。
26+
27+
ここで、`bases_`は複数のRangeを保持するメンバ変数である。
28+
29+
## 例
30+
```cpp example
31+
#include <ranges>
32+
#include <vector>
33+
#include <list>
34+
#include <print>
35+
36+
int main() {
37+
std::vector<int> v = {1, 2};
38+
std::list<char> l = {'a', 'b'};
39+
40+
// デフォルトコンストラクタ
41+
std::ranges::cartesian_product_view<std::views::all_t<std::vector<int>>, std::views::all_t<std::list<char>>> cv1{};
42+
43+
// Rangeを指定
44+
std::ranges::cartesian_product_view cv2{v, l};
45+
46+
std::println("{}", cv2);
47+
}
48+
```
49+
* std::ranges::cartesian_product_view[color ff0000]
50+
51+
### 出力
52+
```
53+
[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
54+
```
55+
56+
## バージョン
57+
### 言語
58+
- C++23
59+
60+
### 処理系
61+
- [Clang](/implementation.md#clang): 16.0 [mark verified]
62+
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
63+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
64+
65+
## 参照
66+
- [N4950 26.7.33 Cartesian product view](https://timsong-cpp.github.io/cppwp/n4950/range.cartesian)
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# 推論補助
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* cartesian_product_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
namespace std::ranges {
10+
template<class... Rs>
11+
cartesian_product_view(Rs&&...) -> cartesian_product_view<views::all_t<Rs>...>;
12+
}
13+
```
14+
15+
## 概要
16+
`cartesian_product_view`クラステンプレートの型推論補助。
17+
18+
## 例
19+
```cpp example
20+
#include <ranges>
21+
#include <vector>
22+
#include <list>
23+
#include <type_traits>
24+
25+
int main() {
26+
std::vector<int> v = {1, 2};
27+
std::list<char> l = {'a', 'b'};
28+
29+
// cartesian_product_viewの型を明示的に指定する必要がない
30+
std::ranges::cartesian_product_view cv{v, l};
31+
32+
// 推論された型を確認
33+
static_assert(std::same_as<
34+
decltype(cv),
35+
std::ranges::cartesian_product_view<
36+
std::ranges::ref_view<std::vector<int>>,
37+
std::ranges::ref_view<std::list<char>>
38+
>
39+
>);
40+
}
41+
```
42+
* std::ranges::cartesian_product_view[color ff0000]
43+
44+
### 出力
45+
```
46+
```
47+
48+
## バージョン
49+
### 言語
50+
- C++23
51+
52+
### 処理系
53+
- [Clang](/implementation.md#clang): 16.0 [mark verified]
54+
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
55+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# size
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* cartesian_product_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr 以下参照 size()
10+
requires cartesian-product-is-sized<First, Vs...>; // (1) C++23
11+
12+
constexpr 以下参照 size() const
13+
requires cartesian-product-is-sized<const First, const Vs...>; // (2) C++23
14+
```
15+
* cartesian-product-is-sized[italic]
16+
17+
## 概要
18+
19+
要素数を取得する。
20+
21+
## 効果
22+
23+
以下と等価:
24+
25+
```cpp
26+
return apply([](auto... sizes) {
27+
using CT = make-unsigned-like-t<common_type_t<decltype(sizes)...>>;
28+
return (static_cast<CT>(sizes) * ...);
29+
}, tuple-transform(ranges::size, bases_));
30+
```
31+
* make-unsigned-like-t[italic]
32+
* tuple-transform[italic]
33+
34+
ここで、`tuple-transform`は説明専用の関数で、tupleの各要素に関数を適用する。
35+
36+
## 備考
37+
- 直積の要素数は、すべてのRangeの要素数の積となる。
38+
39+
40+
##
41+
```cpp example
42+
#include <ranges>
43+
#include <vector>
44+
#include <list>
45+
#include <iostream>
46+
47+
int main() {
48+
std::vector<int> v = {1, 2, 3}; // 3要素
49+
std::list<char> l = {'a', 'b'}; // 2要素
50+
51+
std::ranges::cartesian_product_view cv{v, l};
52+
53+
// 直積の要素数は 3 * 2 = 6
54+
std::cout << "cartesian product size: " << cv.size() << std::endl;
55+
}
56+
```
57+
* size[color ff0000]
58+
59+
### 出力
60+
```
61+
cartesian product size: 6
62+
```
63+
64+
## バージョン
65+
### 言語
66+
- C++23
67+
68+
### 処理系
69+
- [Clang](/implementation.md#clang): 16.0 [mark verified]
70+
- [GCC](/implementation.md#gcc): 13.2 [mark verified]
71+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 7 [mark verified]
72+
73+
## 参照
74+
- [N4950 26.7.33 Cartesian product view](https://timsong-cpp.github.io/cppwp/n4950/range.cartesian)

0 commit comments

Comments
 (0)