Skip to content

Commit fea94ab

Browse files
committed
as_rvalue_view : メンバ関数を追加 #713
1 parent 515f731 commit fea94ab

File tree

8 files changed

+397
-19
lines changed

8 files changed

+397
-19
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@
168168
* std::begin[link /reference/iterator/begin.md]
169169
* std::distance[link /reference/iterator/distance.md]
170170
* std::end[link /reference/iterator/end.md]
171+
* std::move_iterator[link /reference/iterator/move_iterator.md]
172+
* std::move_sentinel[link /reference/iterator/move_sentinel.md]
171173
* std::next[link /reference/iterator/next.md]
172174
* std::ostream_iterator[link /reference/iterator/ostream_iterator.md]
173175
* unreachable_sentinel_t[link /reference/iterator/unreachable_sentinel_t.md]

reference/ranges/as_rvalue_view.md

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,34 +55,34 @@ std::ranges::copy(words | views::as_rvalue, std::back_inserter(new_words));
5555

5656
## メンバ関数
5757

58-
| 名前 | 説明 | 対応バージョン |
59-
|--------------------------------------------------|-----------------------------------|----------------|
60-
| [`(constructor)`](as_rvalue_view/op_constructor.md.nolink) | コンストラクタ | C++20 |
61-
| [`base`](as_rvalue_view/base.md.nolink) | `R`の参照を取得する | C++20 |
62-
| [`begin`](as_rvalue_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++20 |
63-
| [`end`](as_rvalue_view/end.md.nolink) | 番兵を取得する | C++20 |
64-
| [`size`](as_rvalue_view/size.md.nolink) | 要素数を取得する | C++20 |
58+
| 名前 | 説明 | 対応バージョン |
59+
|-----------------------------------------------------|--------------------------------|----------------|
60+
| [`(constructor)`](as_rvalue_view/op_constructor.md) | コンストラクタ | C++23 |
61+
| [`base`](as_rvalue_view/base.md) | 元となるRangeを取得する | C++23 |
62+
| [`begin`](as_rvalue_view/begin.md) | 先頭を指すイテレータを取得する | C++23 |
63+
| [`end`](as_rvalue_view/end.md) | 番兵を取得する | C++23 |
64+
| [`size`](as_rvalue_view/size.md) | 要素数を取得する | C++23 |
6565

6666
`r`を参照先のRangeとする。`size`は、[`ranges::size`](size.md)`(r)`が有効な式であるときに定義される。
6767

6868
## 継承しているメンバ関数
6969

7070
| 名前 | 説明 | 対応バージョン |
7171
|----------------------------------------------|-----------------------------------|----------------|
72-
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++20 |
73-
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
74-
| [`data`](view_interface/data.md) | Rangeの先頭へのポインタを取得する | C++20 |
75-
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
76-
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
77-
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
72+
| [`empty`](view_interface/empty.md) | Rangeが空かどうかを判定する | C++23 |
73+
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++23 |
74+
| [`data`](view_interface/data.md) | Rangeの先頭へのポインタを取得する | C++23 |
75+
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++23 |
76+
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++23 |
77+
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++23 |
7878
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
7979
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
8080

8181
## 推論補助
8282

8383
| 名前 | 説明 | 対応バージョン |
8484
|-------------------------------------------------------|------------------------------|----------------|
85-
| [`(deduction_guide)`](as_rvalue_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++20 |
85+
| [`(deduction_guide)`](as_rvalue_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++23 |
8686

8787
##
8888
```cpp example
@@ -173,10 +173,9 @@ constexpr explicit as_rvalue_view(V base);
173173
- C++23
174174
175175
### 処理系
176-
- [Clang](/implementation.md#clang): ?
177-
- [GCC](/implementation.md#gcc): ?
178-
- [ICC](/implementation.md#icc): ?
179-
- [Visual C++](/implementation.md#visual_cpp): ?
176+
- [Clang](/implementation.md#clang): 17 [mark verified]
177+
- [GCC](/implementation.md#gcc): 13 [mark verified]
178+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]
180179
181180
## 参照
182-
- [N4950 26 Ranges library](https://timsong-cpp.github.io/cppwp/n4950/ranges)
181+
- [P2446R2 `views::as_rvalue`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2446r2.html)
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* as_rvalue_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr V base() const &
10+
requires copy_constructible<V>; // (1) C++23
11+
12+
constexpr V base() &&; // (2) C++23
13+
```
14+
15+
## 概要
16+
元となるRangeを取得する。
17+
18+
- (1) : 元となるRangeをコピーして返す
19+
- (2) : 元となるRangeをムーブして返す
20+
21+
22+
## 戻り値
23+
24+
メンバ変数`base_`として保持している、元となるRangeオブジェクトがあるとして、以下を返す:
25+
26+
- (1) :
27+
```cpp
28+
return base_;
29+
```
30+
31+
- (2) :
32+
```cpp
33+
return std::move(base_);
34+
```
35+
* std::move[link /reference/utility/move.md]
36+
37+
38+
## 備考
39+
- ここで、`V`は[`std::ranges::ref_view`](../ref_view.md)であり、元となるRangeは`view`に変換されている。
40+
41+
42+
## 例
43+
```cpp
44+
#include <cassert>
45+
#include <vector>
46+
#include <ranges>
47+
48+
int main() {
49+
std::vector<int> v = {1, 2, 3};
50+
auto r = std::views::as_rvalue(v);
51+
std::ranges::ref_view<std::vector<int>> base = r.base();
52+
53+
assert(&base.base() == &v);
54+
}
55+
```
56+
* r.base()[color ff0000]
57+
* std::ranges::ref_view[link /reference/ranges/ref_view.md]
58+
* base.base()[link /reference/ranges/ref_view/base.md]
59+
60+
### 出力
61+
```
62+
```
63+
64+
65+
## バージョン
66+
### 言語
67+
- C++23
68+
69+
### 処理系
70+
- [Clang](/implementation.md#clang): 17 [mark verified]
71+
- [GCC](/implementation.md#gcc): 13 [mark verified]
72+
- [ICC](/implementation.md#icc): ?
73+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]
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+
* as_rvalue_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr auto begin()
10+
requires (!simple-view <V>); // (1) C++23
11+
12+
constexpr auto begin() const
13+
requires range<const V>; // (2) C++23
14+
```
15+
16+
## 概要
17+
`view`の先頭要素を指すイテレータを取得する。
18+
19+
## 戻り値
20+
メンバ変数`base_`として保持しているRangeへのポインタがあるとして、以下を返す:
21+
22+
```cpp
23+
return std::move_iterator(ranges::begin(*base_));
24+
```
25+
* ranges::begin[link /reference/ranges/begin.md]
26+
27+
28+
##
29+
```cpp example
30+
#include <iostream>
31+
#include <vector>
32+
#include <ranges>
33+
34+
int main() {
35+
std::vector<std::string> v = {"one", "two", "three"};
36+
auto r = std::ranges::as_rvalue_view(v);
37+
auto it = r.begin();
38+
auto end = r.end();
39+
40+
while (it != end) {
41+
std::string x = *it; // ここでムーブされる
42+
std::cout << x << std::endl;
43+
++it;
44+
}
45+
}
46+
```
47+
* begin[color ff0000]
48+
* end()[link end.md]
49+
50+
### 出力
51+
```
52+
one
53+
two
54+
three
55+
```
56+
57+
## バージョン
58+
### 言語
59+
- C++23
60+
61+
### 処理系
62+
- [Clang](/implementation.md#clang): 17 [mark verified]
63+
- [GCC](/implementation.md#gcc): 13 [mark verified]
64+
- [ICC](/implementation.md#icc): ?
65+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* as_rvalue_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
constexpr auto end()
10+
requires (!simple-view <V>); // (1) C++23
11+
12+
constexpr auto end() const
13+
requires range<const V>; // (2) C++23
14+
```
15+
16+
## 概要
17+
18+
番兵を取得する。
19+
20+
21+
## 戻り値
22+
メンバ変数`r_`として保持しているRangeへのポインタがあるとして、以下を返す:
23+
24+
```cpp
25+
if constexpr (common_range<V>) {
26+
return std::move_iterator(ranges::end(base_));
27+
}
28+
else {
29+
return std::move_sentinel(ranges::end(base_));
30+
}
31+
```
32+
* ranges::end[link /reference/ranges/end.md]
33+
34+
35+
##
36+
```cpp example
37+
#include <iostream>
38+
#include <vector>
39+
#include <ranges>
40+
41+
int main() {
42+
std::vector<std::string> v = {"one", "two", "three"};
43+
auto r = std::ranges::as_rvalue_view(v);
44+
auto it = r.begin();
45+
auto end = r.end();
46+
47+
while (it != end) {
48+
std::string x = *it; // ここでムーブされる
49+
std::cout << x << std::endl;
50+
++it;
51+
}
52+
}
53+
```
54+
* begin[color ff0000]
55+
* end()[link end.md]
56+
57+
### 出力
58+
```
59+
one
60+
two
61+
three
62+
```
63+
64+
## バージョン
65+
### 言語
66+
- C++23
67+
68+
### 処理系
69+
- [Clang](/implementation.md#clang): 17 [mark verified]
70+
- [GCC](/implementation.md#gcc): 13 [mark verified]
71+
- [ICC](/implementation.md#icc): ?
72+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* as_rvalue_view[meta class]
5+
* function[meta id-type]
6+
* cpp23[meta cpp]
7+
8+
```cpp
9+
as_rvalue_view()
10+
requires default_initializable<V> = default; // (1) C++23
11+
12+
constexpr explicit
13+
as_rvalue_view(V base); // (2) C++23
14+
```
15+
16+
## 概要
17+
[`as_rvalue_view`](../as_rvalue_view.md)オブジェクトを構築する。
18+
19+
- (1) : `base`をムーブして`*this`に保持する
20+
21+
22+
## 効果
23+
- (1) : メンバ変数`base_`を[`std::move`](/reference/utility/move.md)`(base)`で初期化する
24+
25+
26+
## 備考
27+
- ここで、`V`は[`std::ranges::ref_view`](../ref_view.md)であり、元となるRangeは`view`に変換されて保持される。
28+
29+
30+
## 例
31+
```cpp example
32+
#include <iostream>
33+
#include <vector>
34+
#include <algorithm>
35+
#include <ranges>
36+
37+
int main() {
38+
std::vector<int> v = {1, 2, 3};
39+
std::ranges::for_each(
40+
std::views::as_rvalue(v),
41+
[](int x) { std::cout << x << ' '; }
42+
);
43+
}
44+
```
45+
* std::ranges::for_each[link /reference/algorithm/ranges_for_each.md]
46+
47+
### 出力
48+
```
49+
1 2 3
50+
```
51+
52+
## バージョン
53+
### 言語
54+
- C++23
55+
56+
### 処理系
57+
- [Clang](/implementation.md#clang): 17 [mark verified]
58+
- [GCC](/implementation.md#gcc): 13 [mark verified]
59+
- [ICC](/implementation.md#icc): ?
60+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# 推論補助
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* function[meta id-type]
5+
* cpp23[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template <class R>
10+
as_rvalue_view(R&&) -> as_rvalue_view<views::all_t<R>>;
11+
}
12+
```
13+
14+
## 概要
15+
16+
[`as_rvalue_view`](../as_rvalue_view.md)クラステンプレートの型推論補助。
17+
18+
19+
## 例
20+
```cpp example
21+
#include <iostream>
22+
#include <vector>
23+
#include <ranges>
24+
25+
int main() {
26+
std::vector<int> v = {1, 2, 3};
27+
auto r = std::ranges::as_rvalue_view(v);
28+
for (int x : r) {
29+
std::cout << x << std::endl;
30+
}
31+
}
32+
```
33+
34+
### 出力
35+
```
36+
1
37+
2
38+
3
39+
```
40+
41+
## バージョン
42+
### 言語
43+
- C++23
44+
45+
### 処理系
46+
- [Clang](/implementation.md#clang): 17 [mark verified]
47+
- [GCC](/implementation.md#gcc): 13 [mark verified]
48+
- [ICC](/implementation.md#icc): ?
49+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 4 [mark verified]

0 commit comments

Comments
 (0)