Skip to content

Commit

Permalink
error_code, error_condition, error_category : 三方比較演算子の追加と自動導出に対応 #900
Browse files Browse the repository at this point in the history
  • Loading branch information
faithandbrave committed Dec 13, 2022
1 parent e06b66c commit 26eca64
Show file tree
Hide file tree
Showing 13 changed files with 308 additions and 34 deletions.
14 changes: 12 additions & 2 deletions reference/system_error/error_category.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,27 @@ namespace std {
## メンバ関数
### 構築・破棄
| 名前 | 説明 | 対応バージョン |
|------|------|----------------|
| [`(constructor)`](error_category/op_constructor.md) | コンストラクタ | C++11 |
| [`(destructor)`](error_category/op_destructor.md) | デストラクタ | C++11 |
| `operator=(const error_category&) = delete` | 代入演算子(使用不可) | C++11 |
| [`default_error_condition`](error_category/default_error_condition.md) | エラー値と自身のカテゴリから`error_condition`を生成 | C++11 |
### 比較
| 名前 | 説明 | 対応バージョン |
|------|------|----------------|
| [`equivalent`](error_category/equivalent.md) | エラーコードとエラー状態の等値比較 | C++11 |
| [`operator==`](error_category/op_equal.md) | 等値比較 | C++11 |
| [`operator==`](error_category/op_equal.md) | 等値比較 (C++20から`operator<=>`により使用可能) | C++11 |
| [`operator!=`](error_category/op_not_equal.md) | 非等値比較 | C++11 |
| [`operator<`](error_category/op_less.md) | 小なり比較 | C++11 |
| [`operator<=>`](error_category/op_compare_3way.md) | 三方比較 | C++20 |
| [`operator<`](error_category/op_less.md) | 左辺が右辺より小さいか比較 (C++20から`operator<=>`により使用可能) | C++11 |
| `bool operator<=(const error_category&) const noexcept;` | 左辺が右辺以下か比較 (`operator<=>`により使用可能) | C++20 |
| `bool operator>(const error_category&) const noexcept;` | 左辺が右辺より大きいか比較 (`operator<=>`により使用可能) | C++20 |
| `bool operator>=(const error_category&) const noexcept;` | 左辺が右辺以上か比較 (`operator<=>`により使用可能) | C++20 |
### 純粋仮想関数
Expand Down
79 changes: 79 additions & 0 deletions reference/system_error/error_category/op_compare_3way.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# operator<=>
* system_error[meta header]
* std[meta namespace]
* error_category[meta class]
* function[meta id-type]
* cpp20[meta cpp]

```cpp
strong_ordering operator<=>(const error_category& rhs) const noexcept; // (1) C++11
```

## 概要
`error_category`オブジェクトの三方比較を行う。


## 戻り値
```cpp
return compare_three_way()(this, &rhs);
```
* compare_three_way[link /reference/compare/compare_three_way.md]


## 例外
投げない


## 備考
- この演算子により、以下の演算子が使用可能になる (C++20):
- `operator<`
- `operator<=`
- `operator>`
- `operator>=`


##
```cpp example
#include <iostream>
#include <system_error>

int main()
{
const std::error_category& a = std::generic_category();
const std::error_category& b = std::generic_category();
const std::error_category& c = std::system_category();

std::cout << std::boolalpha;

std::cout << ((a <=> b) == 0) << std::endl;
std::cout << (a < c) << std::endl;
std::cout << (a <= c) << std::endl;
std::cout << (a > c) << std::endl;
std::cout << (a >= c) << std::endl;
}
```
* std::generic_category()[link /reference/system_error/generic_category.md]
* std::system_category()[link /reference/system_error/system_category.md]

### 出力例
```
true
false
false
true
true
```

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

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


## 参照
- [P1614R2 The Mothership has Landed](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1614r2.html)
- C++20での三方比較演算子の追加と、関連する演算子の自動導出
7 changes: 6 additions & 1 deletion reference/system_error/error_category/op_equal.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
* cpp11[meta cpp]

```cpp
bool operator==(const error_category& rhs) const noexcept;
bool operator==(const error_category& rhs) const noexcept; // (1) C++11
```

## 概要
Expand All @@ -23,6 +23,11 @@ bool operator==(const error_category& rhs) const noexcept;
投げない


## 備考
- この演算子により、以下の演算子が使用可能になる (C++20):
- `operator!=`


##
```cpp example
#include <iostream>
Expand Down
5 changes: 4 additions & 1 deletion reference/system_error/error_category/op_less.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
* cpp11[meta cpp]

```cpp
bool operator<(const error_category& rhs) const noexcept;
// operator<=>により、以下の演算子が使用可能になる (C++20)
bool operator<(const error_category& rhs) const noexcept; // (1) C++11
```

## 概要
Expand Down Expand Up @@ -61,3 +62,5 @@ false


## 参照
- [P1614R2 The Mothership has Landed](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1614r2.html)
- C++20での三方比較演算子の追加と、関連する演算子の自動導出
5 changes: 4 additions & 1 deletion reference/system_error/error_category/op_not_equal.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
* cpp11[meta cpp]

```cpp
bool operator!=(const error_category& rhs) const noexcept;
// operator==により、以下の演算子が使用可能になる (C++20)
bool operator!=(const error_category& rhs) const noexcept; // (1) C++11
```

## 概要
Expand Down Expand Up @@ -61,3 +62,5 @@ true


## 参照
- [P1614R2 The Mothership has Landed](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1614r2.html)
- C++20での三方比較演算子の追加と、関連する演算子の自動導出
8 changes: 6 additions & 2 deletions reference/system_error/error_code.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,12 @@ namespace std {
| 名前 | 説明 | 対応バージョン |
|------|------|----------------|
| [`operator==`](op_equal.md) | 等値比較 | C++11 |
| [`operator!=`](op_not_equal.md) | 非等値比較 | C++11 |
| [`operator<`](error_code/op_less.md) | 左辺が右辺より小さいか判定する | C++11 |
| [`operator!=`](op_not_equal.md) | 非等値比較 (C++20から`operator<=>`により使用可能) | C++11 |
| [`operator<=>`](error_code/op_compare_3way.md) | 三方比較 | C++20 |
| [`operator<`](error_code/op_less.md) | 左辺が右辺より小さいか判定する (C++20から`operator<=>`により使用可能) | C++11 |
| `bool operator<=(const error_code&, const error_code&) noexcept;` | 左辺が右辺以下か判定する (`operator<=>`により使用可能) | C++20 |
| `bool operator>(const error_code&, const error_code&) noexcept;` | 左辺が右辺より大きいか判定する (`operator<=>`により使用可能) | C++20 |
| `bool operator>=(const error_code&, const error_code&) noexcept;` | 左辺が右辺以上か判定する (`operator<=>`により使用可能) | C++20 |
| [`operator<<`](error_code/op_ostream.md) | ストリームへ出力 | C++11 |
| [`make_error_code`](make_error_code.md) | `errc`から`error_code`オブジェクトを生成する | C++11 |
Expand Down
78 changes: 78 additions & 0 deletions reference/system_error/error_code/op_compare_3way.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# operator<=>
* system_error[meta header]
* std[meta namespace]
* function[meta id-type]
* cpp20[meta cpp]

```cpp
namespace std {
strong_ordering
operator<=>(const error_code& lhs,
const error_code& rhs) noexcept; // (1) C++20
}
```
## 概要
`error_code`オブジェクトの三方比較を行う。
## 効果
以下と等価:
```cpp
if (auto c = lhs.category() <=> rhs.category(); c != 0)
return c;
return lhs.value() <=> rhs.value();
```
* category()[link category.md]
* value()[link value.md]


## 例外
投げない


## 備考
- この演算子により、以下の演算子が使用可能になる (C++20):
- `operator<`
- `operator<=`
- `operator>`
- `operator>=`


##
```cpp example
#include <cassert>
#include <system_error>

int main()
{
std::error_code ec1 = std::make_error_code(std::errc::invalid_argument);
std::error_code ec2 = std::make_error_code(std::errc::invalid_argument);
std::error_code ec3 = std::make_error_code(std::errc::permission_denied);

assert((ec1 <=> ec2) == 0);
assert((ec1 <=> ec3) != 0);
}
```
* std::make_error_code[link /reference/system_error/make_error_code.md]
* std::errc::invalid_argument[link /reference/system_error/errc.md]
* std::errc::permission_denied[link /reference/system_error/errc.md]

### 出力
```
```

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

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


## 参照
- [P1614R2 The Mothership has Landed](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1614r2.html)
- C++20での三方比較演算子の追加と、関連する演算子の自動導出
5 changes: 4 additions & 1 deletion reference/system_error/error_code/op_less.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@

```cpp
namespace std {
bool operator<(const error_code& lhs, const error_code& rhs) noexcept;
// operator<=>により、以下の演算子が使用可能になる (C++20)
bool
operator<(const error_code& lhs,
const error_code& rhs) noexcept; // (1) C++11
}
```
Expand Down
9 changes: 7 additions & 2 deletions reference/system_error/error_condition.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,13 @@ Visual C++ 2010、GCC 4.6.1では[`generic_category()`](generic_category.md)と[
| 名前 | 説明 | 対応バージョン |
|------|------|----------------|
| [`operator==`](op_equal.md) | 等値比較 | C++11 |
| [`operator!=`](op_not_equal.md) | 非等値比較 | C++11 |
| [`operator<`](error_condition/op_less.md) | 左辺が右辺より小さいか判定する | C++11 |
| [`operator!=`](op_not_equal.md) | 非等値比較 (C++20から`operator<=>`により使用可能) | C++11 |
| [`operator<=>`](error_condition/op_compare_3way.md) | 三方比較 | C++20 |
| [`operator<`](error_condition/op_less.md) | 左辺が右辺より小さいか判定する (C++20から`operator<=>`により使用可能) | C++11 |
| `bool operator<=(const error_condition&, const error_condition&) noexcept;` | 左辺が右辺以下か判定する (`operator<=>`により使用可能) | C++20 |
| `bool operator>(const error_condition&, const error_condition&) noexcept;` | 左辺が右辺より大きいか判定する (`operator<=>`により使用可能) | C++20 |
| `bool operator>=(const error_condition&, const error_condition&) noexcept;` | 左辺が右辺以上か判定する (`operator<=>`により使用可能) | C++20 |
| [`make_error_condition`](make_error_condition.md) | `errc`から`error_condition`オブジェクトを生成する | C++11 |
Expand Down
78 changes: 78 additions & 0 deletions reference/system_error/error_condition/op_compare_3way.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# operator<=>
* system_error[meta header]
* std[meta namespace]
* function[meta id-type]
* cpp20[meta cpp]

```cpp
namespace std {
strong_ordering
operator<=>(const error_condition& lhs,
const error_condition& rhs) noexcept; // (1) C++20
}
```
## 概要
`error_condition`オブジェクトの三方比較を行う。
## 効果
以下と等価:
```cpp
if (auto c = lhs.category() <=> rhs.category(); c != 0)
return c;
return lhs.value() <=> rhs.value();
```
* category()[link category.md]
* value()[link value.md]


## 例外
投げない


## 備考
- この演算子により、以下の演算子が使用可能になる (C++20):
- `operator<`
- `operator<=`
- `operator>`
- `operator>=`


##
```cpp example
#include <cassert>
#include <system_error>

int main()
{
std::error_condition ec1 = std::make_error_condition(std::errc::invalid_argument);
std::error_condition ec2 = std::make_error_condition(std::errc::invalid_argument);
std::error_condition ec3 = std::make_error_condition(std::errc::permission_denied);

assert((ec1 <=> ec2) == 0);
assert((ec1 <=> ec3) != 0);
}
```
* std::make_error_condition[link /reference/system_error/make_error_condition.md]
* std::errc::invalid_argument[link /reference/system_error/errc.md]
* std::errc::permission_denied[link /reference/system_error/errc.md]

### 出力
```
```

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

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


## 参照
- [P1614R2 The Mothership has Landed](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1614r2.html)
- C++20での三方比較演算子の追加と、関連する演算子の自動導出
5 changes: 4 additions & 1 deletion reference/system_error/error_condition/op_less.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@

```cpp
namespace std {
bool operator<(const error_condition& lhs, const error_condition& rhs) noexcept;
// operator<=>により、以下の演算子が使用可能になる (C++20)
bool
operator<(const error_condition& lhs,
const error_condition& rhs) noexcept; // (1) C++11
}
```
Expand Down
Loading

0 comments on commit 26eca64

Please sign in to comment.