Skip to content

Commit 0c02cf4

Browse files
committed
common_view : メンバ関数を追加 #713
1 parent 3380084 commit 0c02cf4

File tree

8 files changed

+469
-6
lines changed

8 files changed

+469
-6
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@
145145
* std::basic_istream[link /reference/istream/basic_istream.md]
146146
* <iterator>[link /reference/iterator.md]
147147
* bidirectional_iterator[link /reference/iterator/bidirectional_iterator.md]
148+
* common_iterator[link /reference/iterator/common_iterator.md]
148149
* contiguous_iterator[link /reference/iterator/contiguous_iterator.md]
149150
* default_sentinel_t[link /reference/iterator/default_sentinel_t.md]
150151
* default_sentinel[link /reference/iterator/default_sentinel_t.md]

reference/ranges/common_view.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ namespace std::ranges {
5252
5353
| 名前 | 説明 | 対応バージョン |
5454
|--------------------------------------------------|-----------------------------------|----------------|
55-
| [`(constructor)`](common_view/op_constructor.md.nolink) | コンストラクタ | C++20 |
56-
| [`base`](common_view/base.md.nolink) | `R`の参照を取得する | C++20 |
57-
| [`begin`](common_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++20 |
58-
| [`end`](common_view/end.md.nolink) | 番兵を取得する | C++20 |
59-
| [`size`](common_view/size.md.nolink) | 要素数を取得する | C++20 |
55+
| [`(constructor)`](common_view/op_constructor.md) | コンストラクタ | C++20 |
56+
| [`base`](common_view/base.md) | `R`の参照を取得する | C++20 |
57+
| [`begin`](common_view/begin.md) | 先頭を指すイテレータを取得する | C++20 |
58+
| [`end`](common_view/end.md) | 番兵を取得する | C++20 |
59+
| [`size`](common_view/size.md) | 要素数を取得する | C++20 |
6060
6161
`r`を参照先のRangeとする。`size`は、[`ranges::size`](size.md)`(r)`が有効な式であるときに定義される。
6262
@@ -77,7 +77,7 @@ namespace std::ranges {
7777
7878
| 名前 | 説明 | 対応バージョン |
7979
|-------------------------------------------------------|------------------------------|----------------|
80-
| [`(deduction_guide)`](common_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++20 |
80+
| [`(deduction_guide)`](common_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++20 |
8181
8282
## 例
8383
```cpp example

reference/ranges/common_view/base.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* common_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+
* copy_constructible[link /reference/concepts/copy_constructible.md]
15+
16+
## 概要
17+
18+
メンバ変数として保持している、元のviewを取得する。
19+
20+
## 効果
21+
22+
- (1) : `return base_;`
23+
- (2) : `return std::move(base_);`
24+
25+
##
26+
```cpp example
27+
#include <ranges>
28+
#include <vector>
29+
#include <concepts>
30+
#include <iostream>
31+
32+
int main() {
33+
std::vector<int> vec = {1, 2, 3, 4, 5};
34+
35+
auto taken = vec | std::views::take(3);
36+
std::ranges::common_view cv(taken);
37+
38+
// (1) コピーして取得
39+
auto base1 = cv.base();
40+
static_assert(std::same_as<decltype(base1), std::ranges::take_view<std::ranges::ref_view<std::vector<int>>>>);
41+
42+
// (2) ムーブして取得
43+
auto base2 = std::move(cv).base();
44+
static_assert(std::same_as<decltype(base2), std::ranges::take_view<std::ranges::ref_view<std::vector<int>>>>);
45+
46+
// 取得したviewを使用
47+
for (int n : base1) {
48+
std::cout << n << " ";
49+
}
50+
std::cout << std::endl;
51+
}
52+
```
53+
* base[color ff0000]
54+
* std::ranges::common_view[link ../common_view.md]
55+
* std::views::take[link ../take_view.md]
56+
* std::ranges::take_view[link ../take_view.md]
57+
* std::ranges::ref_view[link ../ref_view.md]
58+
59+
### 出力
60+
```
61+
1 2 3
62+
```
63+
64+
## バージョン
65+
### 言語
66+
- C++20
67+
68+
### 処理系
69+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
70+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
71+
- [ICC](/implementation.md#icc): ?
72+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
73+
74+
## 参照
75+
- [N4861 24.7.5.1 Overview](https://timsong-cpp.github.io/cppwp/n4861/range.common.view)

reference/ranges/common_view/begin.md

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* common_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr auto begin(); // (1)
10+
constexpr auto begin() const requires range<const V>; // (2)
11+
```
12+
* range[link ../range.md]
13+
14+
## 概要
15+
16+
先頭を指すイテレータを取得する。
17+
18+
## 効果
19+
20+
- (1) :
21+
```cpp
22+
if constexpr (random_access_range<V> && sized_range<V>)
23+
return ranges::begin(base_);
24+
else
25+
return common_iterator<iterator_t<V>, sentinel_t<V>>(ranges::begin(base_));
26+
```
27+
* random_access_range[link ../random_access_range.md]
28+
* sized_range[link ../sized_range.md]
29+
* common_iterator[link /reference/iterator/common_iterator.md]
30+
* iterator_t[link ../iterator_t.md]
31+
* sentinel_t[link ../sentinel_t.md]
32+
* ranges::begin[link ../begin.md]
33+
34+
- (2) :
35+
```cpp
36+
if constexpr (random_access_range<const V> && sized_range<const V>)
37+
return ranges::begin(base_);
38+
else
39+
return common_iterator<iterator_t<const V>, sentinel_t<const V>>(ranges::begin(base_));
40+
```
41+
* random_access_range[link ../random_access_range.md]
42+
* sized_range[link ../sized_range.md]
43+
* common_iterator[link /reference/iterator/common_iterator.md]
44+
* iterator_t[link ../iterator_t.md]
45+
* sentinel_t[link ../sentinel_t.md]
46+
* ranges::begin[link ../begin.md]
47+
48+
##
49+
```cpp example
50+
#include <ranges>
51+
#include <vector>
52+
#include <iostream>
53+
54+
int main() {
55+
std::vector<int> vec = {1, 2, 3, 4, 5};
56+
57+
// common_rangeではないviewを作成
58+
auto taken = vec | std::views::take(3);
59+
static_assert(!std::ranges::common_range<decltype(taken)>);
60+
61+
// common_viewでラップ
62+
std::ranges::common_view cv(taken);
63+
static_assert(std::ranges::common_range<decltype(cv)>);
64+
65+
// begin()とend()が同じ型を返す
66+
auto it = cv.begin();
67+
auto end = cv.end();
68+
static_assert(std::same_as<decltype(it), decltype(end)>);
69+
70+
// イテレータを使用
71+
for (; it != end; ++it) {
72+
std::cout << *it << " ";
73+
}
74+
std::cout << std::endl;
75+
}
76+
```
77+
* begin[color ff0000]
78+
* end[link end.md]
79+
* std::ranges::common_range[link ../common_range.md]
80+
* std::ranges::common_view[link ../common_view.md]
81+
* std::views::take[link ../take_view.md]
82+
83+
### 出力
84+
```
85+
1 2 3
86+
```
87+
88+
## バージョン
89+
### 言語
90+
- C++20
91+
92+
### 処理系
93+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
94+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
95+
- [ICC](/implementation.md#icc): ?
96+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
97+
98+
## 参照
99+
- [N4861 24.7.5.1 Overview](https://timsong-cpp.github.io/cppwp/n4861/range.common.view)

reference/ranges/common_view/end.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* common_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr auto end(); // (1) C++20
10+
constexpr auto end() const
11+
requires range<const V>; // (2) C++20
12+
```
13+
* range[link ../range.md]
14+
15+
## 概要
16+
17+
番兵を取得する。
18+
19+
## 効果
20+
21+
- (1) :
22+
```cpp
23+
if constexpr (random_access_range<V> && sized_range<V>)
24+
return ranges::begin(base_) + ranges::size(base_);
25+
else
26+
return common_iterator<iterator_t<V>, sentinel_t<V>>(ranges::end(base_));
27+
```
28+
29+
- (2) :
30+
```cpp
31+
if constexpr (random_access_range<const V> && sized_range<const V>)
32+
return ranges::begin(base_) + ranges::size(base_);
33+
else
34+
return common_iterator<iterator_t<const V>, sentinel_t<const V>>(ranges::end(base_));
35+
```
36+
37+
38+
## 例
39+
```cpp example
40+
#include <ranges>
41+
#include <vector>
42+
#include <algorithm>
43+
#include <iostream>
44+
45+
int main() {
46+
std::vector<int> vec = {1, 2, 3, 4, 5};
47+
48+
// common_rangeではないviewを作成
49+
auto taken = vec | std::views::take(3);
50+
51+
// common_viewでラップ
52+
std::ranges::common_view cv(taken);
53+
54+
// begin()とend()が同じ型を返す
55+
auto begin = cv.begin();
56+
auto end = cv.end();
57+
static_assert(std::same_as<decltype(begin), decltype(end)>);
58+
59+
// レガシーアルゴリズムに渡せる
60+
std::for_each(begin, end, [](int n) {
61+
std::cout << n << " ";
62+
});
63+
std::cout << std::endl;
64+
}
65+
```
66+
* end[color ff0000]
67+
* begin[link begin.md]
68+
* std::ranges::common_view[link ../common_view.md]
69+
* std::views::take[link ../take_view.md]
70+
71+
### 出力
72+
```
73+
1 2 3
74+
```
75+
76+
## バージョン
77+
### 言語
78+
- C++20
79+
80+
### 処理系
81+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
82+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
83+
- [ICC](/implementation.md#icc): ?
84+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
85+
86+
## 参照
87+
- [N4861 24.7.5.1 Overview](https://timsong-cpp.github.io/cppwp/n4861/range.common.view)
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+
* common_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
common_view()
10+
requires default_initializable<V> = default; // (1) C++20
11+
12+
constexpr explicit
13+
common_view(V r); // (2) C++20
14+
```
15+
* default_initializable[link /reference/concepts/default_initializable.md]
16+
17+
## 概要
18+
19+
- (1) : デフォルトコンストラクタ
20+
- (2) : 元となるRangeを受け取るコンストラクタ
21+
22+
## 効果
23+
24+
- (1) : `base_`をデフォルト構築する
25+
- (2) : `base_`を`std::move(r)`で初期化する
26+
27+
## 例
28+
```cpp example
29+
#include <ranges>
30+
#include <vector>
31+
#include <iostream>
32+
33+
int main() {
34+
std::vector<int> vec = {1, 2, 3, 4, 5};
35+
36+
// (1) デフォルトコンストラクタ
37+
std::ranges::common_view<std::ranges::empty_view<int>> cv1;
38+
39+
// (2) 元となるRangeを受け取るコンストラクタ
40+
auto taken = vec | std::views::take(3);
41+
std::ranges::common_view cv2(taken);
42+
43+
for (int n : cv2) {
44+
std::cout << n << " ";
45+
}
46+
std::cout << std::endl;
47+
}
48+
```
49+
* std::ranges::common_view[color ff0000]
50+
* std::ranges::empty_view[link ../empty_view.md]
51+
* std::views::take[link ../take_view.md]
52+
53+
### 出力
54+
```
55+
1 2 3
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]
67+
68+
## 参照
69+
- [N4861 24.7.5.1 Overview](https://timsong-cpp.github.io/cppwp/n4861/range.common.view)

0 commit comments

Comments
 (0)