Skip to content

Commit 23b7fdf

Browse files
committed
drop_view : メンバ関数を追加 #713
1 parent 85980d0 commit 23b7fdf

File tree

7 files changed

+382
-6
lines changed

7 files changed

+382
-6
lines changed

reference/ranges/drop_view.md

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

reference/ranges/drop_view/base.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# base
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* drop_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+
15+
## 概要
16+
17+
メンバ変数として保持している、元の`view`を取得する。
18+
19+
## 効果
20+
21+
入力`view``V`)のオブジェクトを`base_`というメンバに保持するとして
22+
23+
- (1) : `return base_;` と等価
24+
- (2) : `return std::move(base_);` と等価
25+
26+
##
27+
28+
```cpp example
29+
#include <ranges>
30+
#include <vector>
31+
#include <iostream>
32+
33+
int main() {
34+
using std::ranges::view;
35+
36+
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
37+
38+
std::ranges::drop_view r{vec, 5};
39+
40+
// (1) コピーして取得
41+
view auto b1 = r.base();
42+
43+
// (2) ムーブして取得
44+
view auto b2 = std::move(r).base();
45+
46+
// 得られるのは元のRangeではなく、あくまでview
47+
static_assert(not std::same_as<decltype(b1), std::vector<int>>);
48+
static_assert( std::same_as<decltype(b1), std::ranges::ref_view<std::vector<int>>>);
49+
static_assert( std::same_as<decltype(b2), std::ranges::ref_view<std::vector<int>>>);
50+
}
51+
```
52+
* base[color ff0000]
53+
54+
### 出力
55+
56+
```
57+
```
58+
59+
## バージョン
60+
### 言語
61+
- C++20
62+
63+
### 処理系
64+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
65+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
66+
- [ICC](/implementation.md#icc): ?
67+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

reference/ranges/drop_view/begin.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* drop_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr auto begin()
10+
requires (!simple-view<V>); // (1) C++20
11+
12+
constexpr auto begin() const
13+
requires range<const V>; // (2) C++20
14+
```
15+
16+
## 概要
17+
18+
`view`の先頭要素を指すイテレータを取得する。
19+
20+
## 戻り値
21+
入力が[`random_access_range`](../random_access_range.md)かつ[`sized_range`](../sized_range.md)の場合:
22+
- (1), (2) : 以下と等価:
23+
```cpp
24+
return ranges::begin(base_) + min<D>(ranges::size(base_), count_);
25+
```
26+
ここで、`D`は[`range_difference_t`](../range_difference_t.md)`<V>`。
27+
28+
それ以外の場合:
29+
- (1), (2) : 以下と等価:
30+
```cpp
31+
return ranges::next(ranges::begin(base_), count_, ranges::end(base_));
32+
```
33+
34+
ただし、`base_`は元の`view`を表すメンバ変数、`count_`は除去する要素数を表すメンバ変数。
35+
36+
## 例
37+
38+
```cpp example
39+
#include <ranges>
40+
#include <vector>
41+
#include <iostream>
42+
43+
int main() {
44+
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
45+
46+
std::ranges::drop_view r{vec, 5};
47+
48+
auto it = r.begin();
49+
50+
int x = *it;
51+
std::cout << x << '\n';
52+
}
53+
```
54+
* begin[color ff0000]
55+
56+
### 出力
57+
58+
```
59+
6
60+
```
61+
62+
## バージョン
63+
### 言語
64+
- C++20
65+
66+
### 処理系
67+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
68+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
69+
- [ICC](/implementation.md#icc): ?
70+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

reference/ranges/drop_view/end.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* drop_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr auto end()
10+
requires (!simple-view<V>); // (1) C++20
11+
12+
constexpr auto end() const
13+
requires range<const V>; // (2) C++20
14+
```
15+
16+
## 概要
17+
番兵を取得する。
18+
19+
## 戻り値
20+
- (1), (2) : 以下と等価:
21+
```cpp
22+
return ranges::end(base_);
23+
```
24+
25+
ただし、`base_`は元の`view`を表すメンバ変数。
26+
27+
## 例
28+
29+
```cpp example
30+
#include <ranges>
31+
#include <vector>
32+
#include <iostream>
33+
34+
int main() {
35+
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
36+
37+
std::ranges::drop_view r{vec, 5};
38+
39+
auto it = r.begin();
40+
auto end_it = r.end();
41+
while (it != end_it) {
42+
int x = *it;
43+
std::cout << x << " ";
44+
++it;
45+
}
46+
std::cout << std::endl;
47+
}
48+
```
49+
* end[color ff0000]
50+
* begin[link begin.md]
51+
52+
### 出力
53+
54+
```
55+
6 7 8 9 10
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]
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* drop_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
drop_view()
10+
requires default_initializable<V> = default; // (1) C++20
11+
12+
constexpr explicit
13+
drop_view(V base, range_difference_t<V> count); // (2) C++20
14+
```
15+
16+
## 概要
17+
18+
[`drop_view`](../drop_view.md)オブジェクトを構築する。
19+
20+
- (1) : デフォルト構築
21+
- (2) : 元となるviewと除去する要素数を指定して構築
22+
23+
## 効果
24+
25+
- (1) : `base_`と`count_`をデフォルト構築する
26+
- (2) : `base_`を`std::move(base)`で、`count_`を`count`で初期化する
27+
28+
## 例
29+
```cpp example
30+
#include <iostream>
31+
#include <ranges>
32+
#include <vector>
33+
34+
int main() {
35+
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
36+
37+
std::ranges::drop_view view{vec, 5};
38+
for (const auto& x : view) {
39+
std::cout << x << " ";
40+
}
41+
std::cout << std::endl;
42+
}
43+
```
44+
* drop_view[color ff0000]
45+
46+
### 出力
47+
```
48+
6 7 8 9 10
49+
```
50+
51+
## バージョン
52+
### 言語
53+
- C++20
54+
55+
### 処理系
56+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
57+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
58+
- [ICC](/implementation.md#icc): ?
59+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
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+
* function[meta id-type]
5+
* cpp20[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template<class R>
10+
drop_view(R&&, range_difference_t<R>) -> drop_view<views::all_t<R>>;
11+
}
12+
```
13+
14+
## 概要
15+
16+
[`drop_view`](../drop_view.md)クラステンプレートの型推論補助。
17+
18+
この推論補助によって、元のRangeが暗黙的に[all view](../all.md)でラップされる。
19+
20+
## 例
21+
```cpp example
22+
#include <ranges>
23+
#include <vector>
24+
#include <concepts>
25+
26+
int main() {
27+
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
28+
29+
std::ranges::drop_view r1{vec, 5};
30+
static_assert(std::same_as<
31+
decltype(r1),
32+
std::ranges::drop_view<std::ranges::ref_view<std::vector<int>>>
33+
>);
34+
35+
std::ranges::drop_view r2{std::vector<int>{1, 2, 3, 4, 5}, 3};
36+
static_assert(std::same_as<
37+
decltype(r2),
38+
std::ranges::drop_view<std::ranges::owning_view<std::vector<int>>>
39+
>);
40+
}
41+
```
42+
43+
### 出力
44+
```
45+
```
46+
47+
## バージョン
48+
### 言語
49+
- C++20
50+
51+
### 処理系
52+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
53+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
54+
- [ICC](/implementation.md#icc): ?
55+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

0 commit comments

Comments
 (0)