Skip to content

Commit 2f6270f

Browse files
committed
to_input_view : メンバ関数を追加 #1423
1 parent 5bd194c commit 2f6270f

File tree

7 files changed

+342
-6
lines changed

7 files changed

+342
-6
lines changed

reference/ranges/to_input_view.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ namespace std::ranges {
4848
4949
| 名前 | 説明 | 対応バージョン |
5050
|--------------------------------------------------|----------------------------------|----------------|
51-
| [`(constructor)`](to_input_view/op_constructor.md.nolink) | コンストラクタ | C++26 |
52-
| [`base`](to_input_view/base.md.nolink) | `V`の参照を取得する | C++26 |
53-
| [`begin`](to_input_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++26 |
54-
| [`end`](to_input_view/end.md.nolink) | 番兵を取得する | C++26 |
55-
| [`size`](to_input_view/size.md.nolink) | 要素数を取得する | C++26 |
51+
| [`(constructor)`](to_input_view/op_constructor.md) | コンストラクタ | C++26 |
52+
| [`base`](to_input_view/base.md) | `V`の参照を取得する | C++26 |
53+
| [`begin`](to_input_view/begin.md) | 先頭を指すイテレータを取得する | C++26 |
54+
| [`end`](to_input_view/end.md) | 番兵を取得する | C++26 |
55+
| [`size`](to_input_view/size.md) | 要素数を取得する | C++26 |
5656
5757
## 継承しているメンバ関数
5858
@@ -70,7 +70,7 @@ namespace std::ranges {
7070
7171
| 名前 | 説明 | 対応バージョン |
7272
|-------------------------------------------------------|------------------------------|----------------|
73-
| [`(deduction_guide)`](to_input_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++26 |
73+
| [`(deduction_guide)`](to_input_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++26 |
7474
7575
## 例
7676
### 基本的な使い方
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# base
2+
* to_input_view[meta header]
3+
* std::ranges[meta namespace]
4+
* to_input_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr V base() const&
10+
requires copy_constructible<V>; // (1) C++26
11+
12+
constexpr V base() &&; // (2) C++26
13+
```
14+
15+
## 概要
16+
メンバ変数として保持している、元のRangeを取得する。
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 <iostream>
27+
28+
int main() {
29+
std::vector<int> vec = {1, 2, 3, 4, 5};
30+
31+
std::ranges::to_input_view view{vec};
32+
33+
// (1) コピーして取得
34+
std::vector<int> v1 = view.base();
35+
36+
// (2) ムーブして取得
37+
std::ranges::to_input_view view2{vec};
38+
std::vector<int> v2 = std::move(view2).base();
39+
40+
std::cout << v1.size() << std::endl;
41+
std::cout << v2.size() << std::endl;
42+
}
43+
```
44+
45+
### 出力
46+
```
47+
5
48+
5
49+
```
50+
51+
## バージョン
52+
### 言語
53+
- C++26
54+
55+
### 処理系
56+
- [Clang](/implementation.md#clang): 21 [mark verified]
57+
- [GCC](/implementation.md#gcc): 15.1 [mark verified]
58+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# begin
2+
* to_input_view[meta header]
3+
* std::ranges[meta namespace]
4+
* to_input_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr auto begin()
10+
requires (!simple-view<V>); // (1) C++26
11+
12+
constexpr auto begin() const
13+
requires range<const V>; // (2) C++26
14+
```
15+
16+
## 概要
17+
先頭を指すイテレータを取得する。
18+
19+
## 効果
20+
- (1): `return iterator<false>(ranges::begin(base_));`
21+
- (2): `return iterator<true>(ranges::begin(base_));`
22+
23+
ここで、`iterator`は`to_input_view`の内部で定義される説明専用のイテレータクラスである。
24+
25+
## 備考
26+
- このイテレータは`input_iterator`コンセプトを満たし、`forward_iterator`コンセプトを満たさない。
27+
28+
29+
## 例
30+
```cpp example
31+
#include <ranges>
32+
#include <vector>
33+
#include <iostream>
34+
35+
int main() {
36+
std::vector<int> v = {1, 2, 3, 4, 5};
37+
38+
std::ranges::to_input_view view{v};
39+
40+
auto it = view.begin();
41+
std::cout << *it << std::endl;
42+
}
43+
```
44+
45+
### 出力
46+
```
47+
1
48+
```
49+
50+
## バージョン
51+
### 言語
52+
- C++26
53+
54+
### 処理系
55+
- [Clang](/implementation.md#clang): 21 [mark verified]
56+
- [GCC](/implementation.md#gcc): 15.1 [mark verified]
57+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# end
2+
* to_input_view[meta header]
3+
* std::ranges[meta namespace]
4+
* to_input_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr auto end()
10+
requires (!simple-view<V>); // (1) C++26
11+
12+
constexpr auto end() const
13+
requires range<const V>; // (2) C++26
14+
```
15+
16+
## 概要
17+
番兵を取得する。
18+
19+
## 効果
20+
以下と等価:
21+
22+
```cpp
23+
return ranges::end(base_);
24+
```
25+
26+
## 備考
27+
- `to_input_view`[`common_range`](/reference/ranges/common_range.md)コンセプトを満たさないため、イテレータ型と番兵型は異なる型となる
28+
29+
30+
##
31+
```cpp example
32+
#include <ranges>
33+
#include <vector>
34+
#include <iostream>
35+
36+
int main() {
37+
std::vector<int> v = {1, 2, 3, 4, 5};
38+
39+
std::ranges::to_input_view view{v};
40+
41+
auto it = view.begin();
42+
auto sentinel = view.end();
43+
static_assert(!std::same_as<decltype(it), decltype(sentinel)>);
44+
45+
int count = 0;
46+
for (; it != sentinel; ++it) {
47+
++count;
48+
}
49+
50+
std::cout << "size: " << count << std::endl;
51+
}
52+
```
53+
54+
### 出力
55+
```
56+
size: 5
57+
```
58+
59+
## バージョン
60+
### 言語
61+
- C++26
62+
63+
### 処理系
64+
- [Clang](/implementation.md#clang): 21 [mark verified]
65+
- [GCC](/implementation.md#gcc): 15.1 [mark verified]
66+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# コンストラクタ
2+
* to_input_view[meta header]
3+
* std::ranges[meta namespace]
4+
* to_input_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
to_input_view()
10+
requires default_initializable<V> = default; // (1) C++26
11+
12+
constexpr explicit
13+
to_input_view(V base); // (2) C++26
14+
```
15+
16+
## 概要
17+
`to_input_view`オブジェクトを構築する。
18+
19+
- (1): デフォルトコンストラクタ
20+
- (2): ベースとなるRangeを受け取るコンストラクタ
21+
22+
## 効果
23+
- (1): ベースとなるRangeをデフォルト構築する
24+
- (2): ベースとなるRangeを`std::move(base)`で初期化する
25+
26+
## 例
27+
```cpp example
28+
#include <ranges>
29+
#include <vector>
30+
31+
int main() {
32+
std::vector<int> v = {1, 2, 3};
33+
34+
// (1) デフォルトコンストラクタ
35+
std::ranges::to_input_view<std::views::all_t<std::vector<int>&>> view1{};
36+
37+
// (2) ベースRangeを受け取るコンストラクタ
38+
std::ranges::to_input_view view2{v};
39+
}
40+
```
41+
42+
### 出力
43+
```
44+
```
45+
46+
## バージョン
47+
### 言語
48+
- C++26
49+
50+
### 処理系
51+
- [Clang](/implementation.md#clang): 21 [mark verified]
52+
- [GCC](/implementation.md#gcc): 15.1 [mark verified]
53+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# 推論補助
2+
* to_input_view[meta header]
3+
* std::ranges[meta namespace]
4+
* to_input_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
namespace std::ranges {
10+
template<class V>
11+
to_input_view(V) -> to_input_view<views::all_t<R>>;
12+
}
13+
```
14+
15+
## 概要
16+
`to_input_view`クラステンプレートの型推論補助。
17+
18+
## 例
19+
```cpp example
20+
#include <ranges>
21+
#include <vector>
22+
#include <concepts>
23+
24+
int main() {
25+
std::vector<int> v = {1, 2, 3};
26+
27+
// 推論補助によりテンプレート引数を明示的に指定する必要がない
28+
std::ranges::to_input_view view{v};
29+
30+
static_assert(std::same_as<
31+
decltype(view),
32+
std::ranges::to_input_view<std::ranges::ref_view<std::vector<int>>>
33+
>);
34+
}
35+
```
36+
37+
### 出力
38+
```
39+
```
40+
41+
## バージョン
42+
### 言語
43+
- C++26
44+
45+
### 処理系
46+
- [Clang](/implementation.md#clang): 21 [mark verified]
47+
- [GCC](/implementation.md#gcc): 15.1 [mark verified]
48+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# size
2+
* to_input_view[meta header]
3+
* std::ranges[meta namespace]
4+
* to_input_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr auto size()
10+
requires sized_range<V>; // (1) C++26
11+
12+
constexpr auto size() const
13+
requires sized_range<const V>; // (2) C++26
14+
```
15+
16+
## 概要
17+
要素数を取得する。
18+
19+
## 効果
20+
- (1), (2): 以下と等価:
21+
22+
```cpp
23+
return ranges::size(base_);
24+
```
25+
26+
27+
##
28+
```cpp example
29+
#include <ranges>
30+
#include <vector>
31+
#include <iostream>
32+
33+
int main() {
34+
std::vector<int> v = {1, 2, 3, 4, 5};
35+
36+
std::ranges::to_input_view view{v};
37+
38+
std::cout << view.size() << std::endl;
39+
}
40+
```
41+
42+
### 出力
43+
```
44+
5
45+
```
46+
47+
## バージョン
48+
### 言語
49+
- C++26
50+
51+
### 処理系
52+
- [Clang](/implementation.md#clang): 21 [mark verified]
53+
- [GCC](/implementation.md#gcc): 15.1 [mark verified]
54+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]

0 commit comments

Comments
 (0)