Skip to content

Commit

Permalink
filter_view のメンバの解説を追加
Browse files Browse the repository at this point in the history
  • Loading branch information
tetsurom committed Aug 28, 2024
1 parent 8c041b3 commit 9a02af6
Show file tree
Hide file tree
Showing 20 changed files with 1,134 additions and 24 deletions.
5 changes: 5 additions & 0 deletions GLOBAL_QUALIFY_LIST.txt
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@
* common_type_t[link /reference/concepts/common_type.md]
* common_with[link /reference/concepts/common_with.md]
* copy_constructible[link /reference/concepts/copy_constructible.md]
* default_initializable[link /reference/concepts/default_initializable.md]
* equality_comparable[link /reference/concepts/equality_comparable.md]
* invocable[link /reference/concepts/invocable.md]
* move_constructible[link /reference/concepts/move_constructible.md]
* regular_invocable[link /reference/concepts/invocable.md]
Expand Down Expand Up @@ -188,6 +190,7 @@
* std::random_device[link /reference/random/random_device.md]
* seed_gen()[link /reference/random/random_device/op_call.md]
* <ranges>[link /reference/ranges.md]
* all_t[link /reference/ranges/all.md]
* bidirectional_range[link /reference/ranges/bidirectional_range.md]
* borrowed_range[link /reference/ranges/borrowed_range.md]
* borrowed_subrange_t[link /reference/ranges/borrowed_subrange_t.md]
Expand All @@ -197,6 +200,7 @@
* constant_range[link /reference/ranges/constant_range.md]
* contiguous_range[link /reference/ranges/contiguous_range.md]
* forward_range[link /reference/ranges/forward_range.md]
* has-arrow[link /reference/ranges/has-arrow.md]
* input_range[link /reference/ranges/input_range.md]
* iterator_t[link /reference/ranges/iterator_t.md]
* maybe-const[link /reference/ranges/maybe-const.md]
Expand All @@ -208,6 +212,7 @@
* range_size_t[link /reference/ranges/range_size_t.md]
* range_value_t[link /reference/ranges/range_value_t.md]
* range[link /reference/ranges/range.md]
* ref_view[link /reference/ranges/ref_view.md]
* sentinel_t[link /reference/ranges/sentinel_t.md]
* sized_range[link /reference/ranges/sized_range.md]
* subrange[link /reference/ranges/subrange.md]
Expand Down
58 changes: 34 additions & 24 deletions reference/ranges/filter_view.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,16 @@ namespace std::ranges {
}
}
```
* input_range[link input_range.md]
* indirect_unary_predicate[link /reference/iterator/indirect_unary_predicate.md]
* iterator_t[link iterator_t.md]
* view[link view.md]
* is_object_v[link /reference/type_traits/is_object.md]
* view_interface[link view_interface.md]
## 概要
- (1): 指定された条件`Pred`を満たす要素だけが要素となる[`view`](view.md)
- (2): `filter_view`を生成するRangeアダプタオブジェクト
元のRangeから条件を満たす要素を探す処理は遅延評価される。
- 初めてメンバ関数[`begin`](filter_view/begin.md.nolink)が呼び出されたときに先頭の要素を決定し、残りはイテレータが進むときに求める。
- [`begin`](filter_view/begin.md.nolink)は償却定数時間で実行できなければならないため、[`begin`](filter_view/begin.md.nolink)の値はキャッシュされる。
- 初めてメンバ関数[`begin`](filter_view/begin.md)が呼び出されたときに先頭の要素を決定し、残りはイテレータが進むときに求める。
- 探索は [`ranges::find_if`](/reference/algorithm/ranges_find_if.md) と同様に行われる。
- [`begin`](filter_view/begin.md)は償却定数時間で実行できなければならないため、[`begin`](filter_view/begin.md)の値はキャッシュされる。
`filter_view`の要素を書き換えてもよいが、書き換えた後の要素が`Pred`を満たさない場合は未定義動作となる。
Expand All @@ -53,33 +48,48 @@ namespace std::ranges {
## 効果
- (2): 式`views::filter(E, P)`の効果は`filter_view(E, P)`と等しい
- (2): 式`views::filter(E, P)`の効果は[`filter_view`](filter_view/op_constructor.md)`(E, P)`と等しい
## メンバ変数
| 名前 | 説明 | 対応バージョン |
|-------------------------------------------------|------------------------------------|-----------------------|
| `V base_ = V()` | 元の[`view`](view.md) (説明専用) | C++20 |
| [`copyable-box`](copyable_box.md)`<Pred> pred_` | 述語 (説明専用) | C++20<br/>C++23で削除 |
| [`movable-box`](movable_box.md)`<Pred> pred_` | 述語 (説明専用) | C++23 |
## メンバ関数
| 名前 | 説明 | 対応バージョン |
|--------------------------------------------------|----------------------------------|----------------|
| [`(constructor)`](filter_view/op_constructor.md.nolink) | コンストラクタ | C++20 |
| [`base`](filter_view/base.md.nolink) | `V`の参照を取得する | C++20 |
| [`pred`](filter_view/pred.md.nolink) | 述語を取得する | C++20 |
| [`begin`](filter_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++20 |
| [`end`](filter_view/end.md.nolink) | 番兵を取得する | C++20 |
| [`(constructor)`](filter_view/op_constructor.md) | コンストラクタ | C++20 |
| [`base`](filter_view/base.md) | `V`の参照を取得する | C++20 |
| [`pred`](filter_view/pred.md) | 述語を取得する | C++20 |
| [`begin`](filter_view/begin.md) | 先頭を指すイテレータを取得する | C++20 |
| [`end`](filter_view/end.md) | 番兵を取得する | C++20 |
## 継承しているメンバ関数
| 名前 | 説明 | 対応バージョン |
|----------------------------------------------|----------------------------------|----------------|
| 名前 | 説明 | 対応バージョン |
|----------------------------------------------|-----------------------------------|----------------|
| [`operator bool`](view_interface/op_bool.md) | Rangeが空でないかどうかを判定する | C++20 |
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
## メンバ型
| 名前 | 説明 | 対応バージョン |
|-------------------------------------------|------------------------------|----------------|
| [`iterator`](filter_view/iterator.md) | イテレータ型(説明専用) | C++20 |
| [`sentinel`](filter_view/sentinel.md) | 番兵型(説明専用) | C++20 |
## 推論補助
| 名前 | 説明 | 対応バージョン |
|-------------------------------------------------------|------------------------------|----------------|
| [`(deduction_guide)`](filter_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++20 |
| 名前 | 説明 | 対応バージョン |
|----------------------------------------------------------|------------------------------|----------------|
| [`(deduction_guide)`](filter_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++20 |
## 例
```cpp example
Expand Down Expand Up @@ -119,6 +129,6 @@ int main() {
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

## 参照
- [N4861 24 Ranges library](https://timsong-cpp.github.io/cppwp/n4861/ranges)
- [N4861 24.7.4 Filter view](https://timsong-cpp.github.io/cppwp/n4861/range.filter)
- [C++20 ranges](https://techbookfest.org/product/5134506308665344)
- [P2367R0 Remove misuses of list-initialization from Clause 24](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2367r0.html) (本提案文書はC++20に遡って適用されている)
70 changes: 70 additions & 0 deletions reference/ranges/filter_view/base.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# base
* ranges[meta header]
* std::ranges[meta namespace]
* filter_view[meta class]
* function[meta id-type]
* cpp20[meta cpp]

```cpp
constexpr V base() const & requires copy_constructible<V>; // (1)
constexpr V base() &&; // (2)
```

## 概要

メンバ変数として保持している、元の`view`を取得する。

## 効果

入力`view``V`)のオブジェクトを`base_`というメンバに保持するとして

- (1) : `return base_;` と等しい
- (2) : `return std::move(base_);` と等しい

##

```cpp example
#include <ranges>
#include <vector>
#include <iostream>

int main() {
using std::ranges::view;

std::vector<int> vec = {1, 2, 3, 4, 5};

std::ranges::filter_view fv{vec, [](int i) { return i % 2 == 0; }};

// (1) コピーして取得
view auto b1 = fv.base();

// (2) ムーブして取得
view auto b2 = std::move(fv).base();

// 得られるのは元のRangeではなく、あくまでview
static_assert(not std::same_as<decltype(b1), std::vector<int>>);
static_assert( std::same_as<decltype(b1), std::ranges::ref_view<std::vector<int>>>);
static_assert( std::same_as<decltype(b2), std::ranges::ref_view<std::vector<int>>>);
}
```
* base[color ff0000]
* filter_view[link ../filter_view.md]

### 出力

```
```

## バージョン
### 言語
- C++20

### 処理系
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
- [ICC](/implementation.md#icc): ?
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

## 参照
- [N4861 24.7.4 Filter view](https://timsong-cpp.github.io/cppwp/n4861/range.filter)
- [N4950 26.7.8 Filter view](https://timsong-cpp.github.io/cppwp/n4950/range.filter)
65 changes: 65 additions & 0 deletions reference/ranges/filter_view/begin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# begin
* ranges[meta header]
* std::ranges[meta namespace]
* filter_view[meta class]
* function[meta id-type]
* cpp20[meta cpp]

```cpp
constexpr iterator begin();
```
* iterator[link iterator.md]

## 概要

`view`の先頭要素を指すイテレータを取得する。

## 事前条件

`pred_.`[`has_value`](/reference/optional/optional/has_value.md)`()``true`であること。

## 戻り値

`{*this, `[`ranges​::​find_if`](/reference/algorithm/ranges_find_if.md)`(base_, `[`ref`](/reference/functional/ref.md)`(*pred_))}`

[`range`](../range.md)のモデルとなるためにはこの関数が償却定数時間で実行できなければならないため、値はキャッシュされる。

##

```cpp example
#include <ranges>
#include <vector>
#include <iostream>

int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};

std::ranges::filter_view fv{vec, [](int i) { return i % 2 == 0; }};

auto it = fv.begin();

std::cout << *it << '\n';
}
```
* begin[color ff0000]
* filter_view[link ../filter_view.md]

### 出力

```
2
```

## バージョン
### 言語
- C++20

### 処理系
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
- [ICC](/implementation.md#icc): ?
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

## 参照
- [N4861 24.7.4 Filter view](https://timsong-cpp.github.io/cppwp/n4861/range.filter)
- [N4950 26.7.8 Filter view](https://timsong-cpp.github.io/cppwp/n4950/range.filter)
64 changes: 64 additions & 0 deletions reference/ranges/filter_view/end.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# end
* ranges[meta header]
* std::ranges[meta namespace]
* filter_view[meta class]
* function[meta id-type]
* cpp23[meta cpp]

```cpp
constexpr auto end() {
if constexpr (common_range<V>)
return iterator{*this, ranges::end(base_)};
else
return sentinel{*this};
}
```
* ranges::end[link ../end.md]
* iterator[link iterator.md]
* sentinel[link sentinel.md]

## 概要

番兵を取得する。

##

```cpp example
#include <ranges>
#include <vector>
#include <iostream>

int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};

std::ranges::filter_view fv{vec, [](int i) { return i % 2 == 0; }};

auto e = fv.end();

--e;

std::cout << *e << '\n';
}
```
* end[color ff0000]
* filter_view[link ../filter_view.md]

### 出力

```
4
```

## バージョン
### 言語
- C++20

### 処理系
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
- [ICC](/implementation.md#icc): ?
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

## 参照
- [N4861 24.7.4 Filter view](https://timsong-cpp.github.io/cppwp/n4861/range.filter)
- [N4950 26.7.8 Filter view](https://timsong-cpp.github.io/cppwp/n4950/range.filter)
Loading

0 comments on commit 9a02af6

Please sign in to comment.