Skip to content

Commit

Permalink
basic_const_iterator : [] - + 追加 #1084
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Aug 3, 2023
1 parent 2f7d33b commit b2a86cc
Show file tree
Hide file tree
Showing 5 changed files with 305 additions and 6 deletions.
11 changes: 5 additions & 6 deletions reference/iterator/basic_const_iterator.md
Expand Up @@ -27,18 +27,16 @@ namespace std {
| [`operator++`](basic_const_iterator/op_increment.md) | イテレータをインクリメントする | C++23 |
| [`operator--`](basic_const_iterator/op_decrement.md) | イテレータをデクリメントする | C++23 |
| [`operator+=`](basic_const_iterator/op_plus_assign.md) | イテレータ自身を進める | C++23 |
| [`operator-`](basic_const_iterator/op_unary_minus.md.nolink) | イテレータを逆に進める | C++23 |
| [`operator-=`](basic_const_iterator/op_minus_assign.md) | イテレータ自身を逆に進める | C++23 |
| [`operator[]`](basic_const_iterator/op_at.md.nolink) | 任意の位置にランダムアクセスする | C++23 |
| [`operator-`](basic_const_iterator/op_minus.md) | 2つの`basic_const_iterator`の差を求める | C++23 |
| [`operator[]`](basic_const_iterator/op_at.md) | 任意の位置にランダムアクセスする | C++23 |
| [`operator==`](basic_const_iterator/op_equal.md.nolink) | 等値比較 | C++23 |
| [`operator!=`](basic_const_iterator/op_equal.md.nolink) | 非等値比較 | C++23 |
| [`operator<`](basic_const_iterator/op_less.md.nolink) | 左辺が右辺より小さいかの判定を行う | C++23 |
| [`operator<=`](basic_const_iterator/op_less_equal.md.nolink) | 左辺が右辺以下かの判定を行う | C++23 |
| [`operator>`](basic_const_iterator/op_greater.md.nolink) | 左辺が右辺より大きいかの判定を行う | C++23 |
| [`operator>=`](basic_const_iterator/op_greater_equal.md.nolink) | 左辺が右辺以上かの判定を行う | C++23 |
| [`operator<=>`](basic_const_iterator/op_compare_3way.md.nolink) | 三方比較を行う | C++23 |
| [`operator-`](basic_const_iterator/op_minus.md.nolink) | 2つの`basic_const_iterator`の差を求める | C++23 |
| [`operator+`](basic_const_iterator/op_plus.md.nolink) | イテレータを進める | C++23 |
## メンバ型
Expand Down Expand Up @@ -71,8 +69,9 @@ namespace std {
| [`operator<=`](basic_const_iterator/op_less_equal.md.nolink) | 左辺が右辺以下かの判定を行う | C++23 |
| [`operator>`](basic_const_iterator/op_greater.md.nolink) | 左辺が右辺より大きいかの判定を行う | C++23 |
| [`operator>=`](basic_const_iterator/op_greater_equal.md.nolink) | 左辺が右辺以上かの判定を行う | C++23 |
| [`operator+`](basic_const_iterator/op_plus.md.nolink) | イテレータを進める | C++23 |
| [`operator-`](basic_const_iterator/op_minus.md.nolink) | 2つの`basic_const_iterator`の差を求める | C++23 |
| [`operator+`](basic_const_iterator/op_plus.md) | イテレータを進める | C++23 |
| [`operator-`](basic_const_iterator/op_unary_minus.md) | イテレータを逆に進める | C++23 |
| [`operator-`](basic_const_iterator/op_minus.md) | 2つの`basic_const_iterator`の差を求める | C++23 |
| [`iter_move`](basic_const_iterator/iter_move.md.nolink) | イテレータの要素の移動 | C++23 |
## 非メンバ関数
Expand Down
64 changes: 64 additions & 0 deletions reference/iterator/basic_const_iterator/op_at.md
@@ -0,0 +1,64 @@
# operator[]
* iterator[meta header]
* std[meta namespace]
* basic_const_iterator[meta class]
* function[meta id-type]
* cpp23[meta cpp]

```cpp
constexpr reference operator[](difference_type n) const
requires random_access_iterator<Iterator>;
```
* random_access_iterator[link /reference/iterator/random_access_iterator.md]

## 概要

任意の位置にランダムアクセスする。

戻り値型`reference`は、[`iter_const_reference_t`](/reference/iterator/iter_const_reference_t.md)`<Iterator>`のエイリアス。

## 効果

ラップしているイテレータを`current_`メンバ変数に保持するとして、以下と等価

```cpp
return static_cast<reference>(current_[n]);
```

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

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

std::basic_const_iterator cit = vec.begin();

std::cout << cit[2] << '\n';
std::cout << cit[4] << '\n';

// 要素を変更できない
// cit[0] = 0;
}
```

### 出力
```
3
5
```

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

### 処理系
- [Clang](/implementation.md#clang): ??
- [GCC](/implementation.md#gcc): 13.1
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6

## 参照

- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html)
93 changes: 93 additions & 0 deletions reference/iterator/basic_const_iterator/op_minus.md
@@ -0,0 +1,93 @@
# operator-
* iterator[meta header]
* std[meta namespace]
* basic_const_iterator[meta class]
* function[meta id-type]
* cpp23[meta cpp]

```cpp
template<sized_sentinel_for<Iterator> S>
constexpr difference_type operator-(const S& y) const; // (1)

template<not-a-const-iterator S>
requires sized_sentinel_for<S, Iterator>
friend constexpr difference_type operator-(const S& x, const basic_const_iterator& y); // (2) 非メンバ関数
```
* sized_sentinel_for[link /reference/iterator/sized_sentinel_for.md]

## 概要

`basic_const_iterator`の間、もしくは`Iterator`に対応する番兵との間の距離を計算する。

`basic_const_iterator<Iterator>`のオブジェクトを`i``Iterator`に対応する番兵型のオブジェクトを`s`とすると

- (1) : `i - s`のためのオーバーロード
- (2) : `s - i`のためのオーバーロード

## テンプレートパラメータ制約

`not-a-const-iterator<I>``I``basic_const_iterator`の特殊化ではない場合に`true`となる説明専用のコンセプトである。

## 効果

ラップしているイテレータを`current_`メンバ変数に保持するとして

- (1) : 以下と等価
```cpp
return current_ - y;
```

- (2) : 以下と等価
```cpp
return x - y.current_;
```

## 備考

(2)の関数は[*Hidden friends*](/article/lib/hidden_friends.md)として定義される。

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

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

std::basic_const_iterator cit = vec.begin();
auto se = vec.end();

// 元のイテレータの番兵との間で距離計算
std::cout << (cit - se) << '\n';
std::cout << (se - cit) << '\n';

std::basic_const_iterator cse = se;

// basic_const_iterator同士で距離計算
// (1) -> (2)と呼ばれることで内部イテレータ同士の距離計算を行う
std::cout << (cit - cse) << '\n';
std::cout << (cse - cit) << '\n';
}
```

### 出力
```
-5
5
-5
5
```

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

### 処理系
- [Clang](/implementation.md#clang): ??
- [GCC](/implementation.md#gcc): 13.1
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6

## 参照

- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html)
74 changes: 74 additions & 0 deletions reference/iterator/basic_const_iterator/op_plus.md
@@ -0,0 +1,74 @@
# operator+ (非メンバ関数)
* iterator[meta header]
* std[meta namespace]
* basic_const_iterator[meta class]
* function[meta id-type]
* cpp23[meta cpp]

```cpp
friend constexpr basic_const_iterator operator+(const basic_const_iterator& i, difference_type n)
requires random_access_iterator<Iterator>; // (1)

friend constexpr basic_const_iterator operator+(difference_type n, const basic_const_iterator& i) // (2)
```
* random_access_iterator[link /reference/iterator/random_access_iterator.md]

## 概要

イテレータを`n`回進める。

## 効果

ラップしているイテレータを`current_`メンバ変数に保持するとして、以下と等価

```cpp
return basic_const_iterator(i.current_ + n);
```

## 戻り値

現在位置から`n`戻したイテレータのコピーを返す。

## 備考

これらの関数は全て[*Hidden friends*](/article/lib/hidden_friends.md)として定義される。

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

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

std::basic_const_iterator cit = vec.end();

auto cit2 = cit + 3;
auto cit3 = 4 + cit;

std::cout << *cit << '\n';
std::cout << *cit2 << '\n';
std::cout << *cit3 << '\n';
}
```

### 出力
```
1
4
5
```

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

### 処理系
- [Clang](/implementation.md#clang): ??
- [GCC](/implementation.md#gcc): 13.1
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6

## 参照

- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html)
69 changes: 69 additions & 0 deletions reference/iterator/basic_const_iterator/op_unary_minus.md
@@ -0,0 +1,69 @@
# operator- (非メンバ関数)
* iterator[meta header]
* std[meta namespace]
* basic_const_iterator[meta class]
* function[meta id-type]
* cpp23[meta cpp]

```cpp
friend constexpr basic_const_iterator operator-(const basic_const_iterator& i, difference_type n)
requires random_access_iterator<Iterator>;
```
* random_access_iterator[link /reference/iterator/random_access_iterator.md]

## 概要

イテレータを`n`回逆に進める。

## 効果

ラップしているイテレータを`current_`メンバ変数に保持するとして、以下と等価

```cpp
return basic_const_iterator(i.current_ - n);
```

## 戻り値

現在位置から`n`戻したイテレータのコピーを返す。

## 備考

この関数は[*Hidden friends*](/article/lib/hidden_friends.md)として定義される。

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

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

std::basic_const_iterator cit = vec.end();

auto cit2 = cit - 3;

std::cout << *cit << '\n';
std::cout << *cit2 << '\n';
}
```

### 出力
```
0
3
```

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

### 処理系
- [Clang](/implementation.md#clang): ??
- [GCC](/implementation.md#gcc): 13.1
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6

## 参照

- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html)

0 comments on commit b2a86cc

Please sign in to comment.