146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 1046035553Spatrick#ifndef _LIBCPP_SYSTEM_ERROR 1146035553Spatrick#define _LIBCPP_SYSTEM_ERROR 1246035553Spatrick 1346035553Spatrick/* 1446035553Spatrick system_error synopsis 1546035553Spatrick 1646035553Spatricknamespace std 1746035553Spatrick{ 1846035553Spatrick 1946035553Spatrickclass error_category 2046035553Spatrick{ 2146035553Spatrickpublic: 2246035553Spatrick virtual ~error_category() noexcept; 2346035553Spatrick 2446035553Spatrick constexpr error_category(); 2546035553Spatrick error_category(const error_category&) = delete; 2646035553Spatrick error_category& operator=(const error_category&) = delete; 2746035553Spatrick 2846035553Spatrick virtual const char* name() const noexcept = 0; 2946035553Spatrick virtual error_condition default_error_condition(int ev) const noexcept; 3046035553Spatrick virtual bool equivalent(int code, const error_condition& condition) const noexcept; 3146035553Spatrick virtual bool equivalent(const error_code& code, int condition) const noexcept; 3246035553Spatrick virtual string message(int ev) const = 0; 3346035553Spatrick 3446035553Spatrick bool operator==(const error_category& rhs) const noexcept; 35*4bdff4beSrobert bool operator!=(const error_category& rhs) const noexcept; // removed in C++20 36*4bdff4beSrobert bool operator<(const error_category& rhs) const noexcept; // removed in C++20 37*4bdff4beSrobert strong_ordering operator<=>(const error_category& rhs) const noexcept; // C++20 3846035553Spatrick}; 3946035553Spatrick 4046035553Spatrickconst error_category& generic_category() noexcept; 4146035553Spatrickconst error_category& system_category() noexcept; 4246035553Spatrick 4346035553Spatricktemplate <class T> struct is_error_code_enum 4446035553Spatrick : public false_type {}; 4546035553Spatrick 4646035553Spatricktemplate <class T> struct is_error_condition_enum 4746035553Spatrick : public false_type {}; 4846035553Spatrick 4946035553Spatricktemplate <class _Tp> 50*4bdff4beSrobertinline constexpr bool is_error_condition_enum_v = is_error_condition_enum<_Tp>::value; // C++17 5146035553Spatrick 5246035553Spatricktemplate <class _Tp> 53*4bdff4beSrobertinline constexpr bool is_error_code_enum_v = is_error_code_enum<_Tp>::value; // C++17 5446035553Spatrick 5546035553Spatrickclass error_code 5646035553Spatrick{ 5746035553Spatrickpublic: 5846035553Spatrick // constructors: 5946035553Spatrick error_code() noexcept; 6046035553Spatrick error_code(int val, const error_category& cat) noexcept; 6146035553Spatrick template <class ErrorCodeEnum> 6246035553Spatrick error_code(ErrorCodeEnum e) noexcept; 6346035553Spatrick 6446035553Spatrick // modifiers: 6546035553Spatrick void assign(int val, const error_category& cat) noexcept; 6646035553Spatrick template <class ErrorCodeEnum> 6746035553Spatrick error_code& operator=(ErrorCodeEnum e) noexcept; 6846035553Spatrick void clear() noexcept; 6946035553Spatrick 7046035553Spatrick // observers: 7146035553Spatrick int value() const noexcept; 7246035553Spatrick const error_category& category() const noexcept; 7346035553Spatrick error_condition default_error_condition() const noexcept; 7446035553Spatrick string message() const; 7546035553Spatrick explicit operator bool() const noexcept; 7646035553Spatrick}; 7746035553Spatrick 7846035553Spatrick// non-member functions: 7946035553Spatricktemplate <class charT, class traits> 8046035553Spatrick basic_ostream<charT,traits>& 8146035553Spatrick operator<<(basic_ostream<charT,traits>& os, const error_code& ec); 8246035553Spatrick 8346035553Spatrickclass error_condition 8446035553Spatrick{ 8546035553Spatrickpublic: 8646035553Spatrick // constructors: 8746035553Spatrick error_condition() noexcept; 8846035553Spatrick error_condition(int val, const error_category& cat) noexcept; 8946035553Spatrick template <class ErrorConditionEnum> 9046035553Spatrick error_condition(ErrorConditionEnum e) noexcept; 9146035553Spatrick 9246035553Spatrick // modifiers: 9346035553Spatrick void assign(int val, const error_category& cat) noexcept; 9446035553Spatrick template <class ErrorConditionEnum> 9546035553Spatrick error_condition& operator=(ErrorConditionEnum e) noexcept; 9646035553Spatrick void clear() noexcept; 9746035553Spatrick 9846035553Spatrick // observers: 9946035553Spatrick int value() const noexcept; 10046035553Spatrick const error_category& category() const noexcept; 10146035553Spatrick string message() const noexcept; 10246035553Spatrick explicit operator bool() const noexcept; 10346035553Spatrick}; 10446035553Spatrick 10546035553Spatrickclass system_error 10646035553Spatrick : public runtime_error 10746035553Spatrick{ 10846035553Spatrickpublic: 10946035553Spatrick system_error(error_code ec, const string& what_arg); 11046035553Spatrick system_error(error_code ec, const char* what_arg); 11146035553Spatrick system_error(error_code ec); 11246035553Spatrick system_error(int ev, const error_category& ecat, const string& what_arg); 11346035553Spatrick system_error(int ev, const error_category& ecat, const char* what_arg); 11446035553Spatrick system_error(int ev, const error_category& ecat); 11546035553Spatrick 11646035553Spatrick const error_code& code() const noexcept; 11746035553Spatrick const char* what() const noexcept; 11846035553Spatrick}; 11946035553Spatrick 12046035553Spatricktemplate <> struct is_error_condition_enum<errc> 12146035553Spatrick : true_type { } 12246035553Spatrick 12346035553Spatrickerror_code make_error_code(errc e) noexcept; 12446035553Spatrickerror_condition make_error_condition(errc e) noexcept; 12546035553Spatrick 12646035553Spatrick// Comparison operators: 12746035553Spatrickbool operator==(const error_code& lhs, const error_code& rhs) noexcept; 12846035553Spatrickbool operator==(const error_code& lhs, const error_condition& rhs) noexcept; 129*4bdff4beSrobertbool operator==(const error_condition& lhs, const error_code& rhs) noexcept; // removed in C++20 13046035553Spatrickbool operator==(const error_condition& lhs, const error_condition& rhs) noexcept; 131*4bdff4beSrobertbool operator!=(const error_code& lhs, const error_code& rhs) noexcept; // removed in C++20 132*4bdff4beSrobertbool operator!=(const error_code& lhs, const error_condition& rhs) noexcept; // removed in C++20 133*4bdff4beSrobertbool operator!=(const error_condition& lhs, const error_code& rhs) noexcept; // removed in C++20 134*4bdff4beSrobertbool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept; // removed in C++20 135*4bdff4beSrobertbool operator<(const error_condition& lhs, const error_condition& rhs) noexcept; // removed in C++20 136*4bdff4beSrobertbool operator<(const error_code& lhs, const error_code& rhs) noexcept; // removed in C++20 137*4bdff4beSrobertstrong_ordering operator<=>(const error_code& lhs, const error_code& rhs) noexcept; // C++20 138*4bdff4beSrobertstrong_ordering operator<=>(const error_condition& lhs, const error_condition& rhs) noexcept; // C++20 13946035553Spatrick 14046035553Spatricktemplate <> struct hash<std::error_code>; 14146035553Spatricktemplate <> struct hash<std::error_condition>; 14246035553Spatrick 14346035553Spatrick} // std 14446035553Spatrick 14546035553Spatrick*/ 14646035553Spatrick 147*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler 14876d0caaeSpatrick#include <__config> 14946035553Spatrick#include <__errc> 150*4bdff4beSrobert#include <__functional/hash.h> 15176d0caaeSpatrick#include <__functional/unary_function.h> 152*4bdff4beSrobert#include <__memory/addressof.h> 15376d0caaeSpatrick#include <stdexcept> 15446035553Spatrick#include <string> 15576d0caaeSpatrick#include <type_traits> 156*4bdff4beSrobert#include <version> 157*4bdff4beSrobert 158*4bdff4beSrobert// standard-mandated includes 159*4bdff4beSrobert 160*4bdff4beSrobert// [system.error.syn] 161*4bdff4beSrobert#include <compare> 16246035553Spatrick 16346035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 16446035553Spatrick# pragma GCC system_header 16546035553Spatrick#endif 16646035553Spatrick 16746035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 16846035553Spatrick 16946035553Spatrick// is_error_code_enum 17046035553Spatrick 17146035553Spatricktemplate <class _Tp> 17246035553Spatrickstruct _LIBCPP_TEMPLATE_VIS is_error_code_enum 17346035553Spatrick : public false_type {}; 17446035553Spatrick 17546035553Spatrick#if _LIBCPP_STD_VER > 14 17646035553Spatricktemplate <class _Tp> 177*4bdff4beSrobertinline constexpr bool is_error_code_enum_v = is_error_code_enum<_Tp>::value; 17846035553Spatrick#endif 17946035553Spatrick 18046035553Spatrick// is_error_condition_enum 18146035553Spatrick 18246035553Spatricktemplate <class _Tp> 18346035553Spatrickstruct _LIBCPP_TEMPLATE_VIS is_error_condition_enum 18446035553Spatrick : public false_type {}; 18546035553Spatrick 18646035553Spatrick#if _LIBCPP_STD_VER > 14 18746035553Spatricktemplate <class _Tp> 188*4bdff4beSrobertinline constexpr bool is_error_condition_enum_v = is_error_condition_enum<_Tp>::value; 18946035553Spatrick#endif 19046035553Spatrick 19146035553Spatricktemplate <> 19246035553Spatrickstruct _LIBCPP_TEMPLATE_VIS is_error_condition_enum<errc> 19346035553Spatrick : true_type { }; 19446035553Spatrick 195*4bdff4beSrobert#ifdef _LIBCPP_CXX03_LANG 19646035553Spatricktemplate <> 19746035553Spatrickstruct _LIBCPP_TEMPLATE_VIS is_error_condition_enum<errc::__lx> 19846035553Spatrick : true_type { }; 19946035553Spatrick#endif 20046035553Spatrick 20146035553Spatrickclass _LIBCPP_TYPE_VIS error_condition; 20246035553Spatrickclass _LIBCPP_TYPE_VIS error_code; 20346035553Spatrick 20446035553Spatrick// class error_category 20546035553Spatrick 20646035553Spatrickclass _LIBCPP_HIDDEN __do_message; 20746035553Spatrick 20846035553Spatrickclass _LIBCPP_TYPE_VIS error_category 20946035553Spatrick{ 21046035553Spatrickpublic: 21146035553Spatrick virtual ~error_category() _NOEXCEPT; 21246035553Spatrick 213*4bdff4beSrobert#if defined(_LIBCPP_ERROR_CATEGORY_DEFINE_LEGACY_INLINE_FUNCTIONS) 214*4bdff4beSrobert error_category() noexcept; 21546035553Spatrick#else 21646035553Spatrick _LIBCPP_INLINE_VISIBILITY 217*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX14 error_category() _NOEXCEPT = default; 21846035553Spatrick#endif 219*4bdff4beSrobert error_category(const error_category&) = delete; 220*4bdff4beSrobert error_category& operator=(const error_category&) = delete; 22146035553Spatrick 22246035553Spatrick virtual const char* name() const _NOEXCEPT = 0; 22346035553Spatrick virtual error_condition default_error_condition(int __ev) const _NOEXCEPT; 22446035553Spatrick virtual bool equivalent(int __code, const error_condition& __condition) const _NOEXCEPT; 22546035553Spatrick virtual bool equivalent(const error_code& __code, int __condition) const _NOEXCEPT; 22646035553Spatrick virtual string message(int __ev) const = 0; 22746035553Spatrick 22846035553Spatrick _LIBCPP_INLINE_VISIBILITY 22946035553Spatrick bool operator==(const error_category& __rhs) const _NOEXCEPT {return this == &__rhs;} 23046035553Spatrick 231*4bdff4beSrobert#if _LIBCPP_STD_VER > 17 232*4bdff4beSrobert 233*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 234*4bdff4beSrobert strong_ordering operator<=>(const error_category& __rhs) const noexcept {return compare_three_way()(this, std::addressof(__rhs));} 235*4bdff4beSrobert 236*4bdff4beSrobert#else // _LIBCPP_STD_VER > 17 237*4bdff4beSrobert 23846035553Spatrick _LIBCPP_INLINE_VISIBILITY 23946035553Spatrick bool operator!=(const error_category& __rhs) const _NOEXCEPT {return !(*this == __rhs);} 24046035553Spatrick 24146035553Spatrick _LIBCPP_INLINE_VISIBILITY 24246035553Spatrick bool operator< (const error_category& __rhs) const _NOEXCEPT {return this < &__rhs;} 24346035553Spatrick 244*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 17 245*4bdff4beSrobert 24646035553Spatrick friend class _LIBCPP_HIDDEN __do_message; 24746035553Spatrick}; 24846035553Spatrick 24946035553Spatrickclass _LIBCPP_HIDDEN __do_message 25046035553Spatrick : public error_category 25146035553Spatrick{ 25246035553Spatrickpublic: 253*4bdff4beSrobert string message(int __ev) const override; 25446035553Spatrick}; 25546035553Spatrick 25646035553Spatrick_LIBCPP_FUNC_VIS const error_category& generic_category() _NOEXCEPT; 25746035553Spatrick_LIBCPP_FUNC_VIS const error_category& system_category() _NOEXCEPT; 25846035553Spatrick 259*4bdff4beSrobertnamespace __adl_only { 260*4bdff4beSrobert // Those cause ADL to trigger but they are not viable candidates, 261*4bdff4beSrobert // so they are never actually selected. 262*4bdff4beSrobert void make_error_condition() = delete; 263*4bdff4beSrobert void make_error_code() = delete; 264*4bdff4beSrobert} // namespace __adl_only 265*4bdff4beSrobert 26646035553Spatrickclass _LIBCPP_TYPE_VIS error_condition 26746035553Spatrick{ 26846035553Spatrick int __val_; 26946035553Spatrick const error_category* __cat_; 27046035553Spatrickpublic: 27146035553Spatrick _LIBCPP_INLINE_VISIBILITY 27246035553Spatrick error_condition() _NOEXCEPT : __val_(0), __cat_(&generic_category()) {} 27346035553Spatrick 27446035553Spatrick _LIBCPP_INLINE_VISIBILITY 27546035553Spatrick error_condition(int __val, const error_category& __cat) _NOEXCEPT 27646035553Spatrick : __val_(__val), __cat_(&__cat) {} 27746035553Spatrick 27846035553Spatrick template <class _Ep> 27946035553Spatrick _LIBCPP_INLINE_VISIBILITY 28046035553Spatrick error_condition(_Ep __e, 28176d0caaeSpatrick typename enable_if<is_error_condition_enum<_Ep>::value>::type* = nullptr 28246035553Spatrick ) _NOEXCEPT 283*4bdff4beSrobert { 284*4bdff4beSrobert using __adl_only::make_error_condition; 285*4bdff4beSrobert *this = make_error_condition(__e); 286*4bdff4beSrobert } 28746035553Spatrick 28846035553Spatrick _LIBCPP_INLINE_VISIBILITY 28946035553Spatrick void assign(int __val, const error_category& __cat) _NOEXCEPT 29046035553Spatrick { 29146035553Spatrick __val_ = __val; 29246035553Spatrick __cat_ = &__cat; 29346035553Spatrick } 29446035553Spatrick 29546035553Spatrick template <class _Ep> 29646035553Spatrick _LIBCPP_INLINE_VISIBILITY 29746035553Spatrick typename enable_if 29846035553Spatrick < 29946035553Spatrick is_error_condition_enum<_Ep>::value, 30046035553Spatrick error_condition& 30146035553Spatrick >::type 30246035553Spatrick operator=(_Ep __e) _NOEXCEPT 303*4bdff4beSrobert { 304*4bdff4beSrobert using __adl_only::make_error_condition; 305*4bdff4beSrobert *this = make_error_condition(__e); 306*4bdff4beSrobert return *this; 307*4bdff4beSrobert } 30846035553Spatrick 30946035553Spatrick _LIBCPP_INLINE_VISIBILITY 31046035553Spatrick void clear() _NOEXCEPT 31146035553Spatrick { 31246035553Spatrick __val_ = 0; 31346035553Spatrick __cat_ = &generic_category(); 31446035553Spatrick } 31546035553Spatrick 31646035553Spatrick _LIBCPP_INLINE_VISIBILITY 31746035553Spatrick int value() const _NOEXCEPT {return __val_;} 31846035553Spatrick 31946035553Spatrick _LIBCPP_INLINE_VISIBILITY 32046035553Spatrick const error_category& category() const _NOEXCEPT {return *__cat_;} 32146035553Spatrick string message() const; 32246035553Spatrick 32346035553Spatrick _LIBCPP_INLINE_VISIBILITY 32476d0caaeSpatrick explicit operator bool() const _NOEXCEPT {return __val_ != 0;} 32546035553Spatrick}; 32646035553Spatrick 32746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 32846035553Spatrickerror_condition 32946035553Spatrickmake_error_condition(errc __e) _NOEXCEPT 33046035553Spatrick{ 33146035553Spatrick return error_condition(static_cast<int>(__e), generic_category()); 33246035553Spatrick} 33346035553Spatrick 33446035553Spatrick// error_code 33546035553Spatrick 33646035553Spatrickclass _LIBCPP_TYPE_VIS error_code 33746035553Spatrick{ 33846035553Spatrick int __val_; 33946035553Spatrick const error_category* __cat_; 34046035553Spatrickpublic: 34146035553Spatrick _LIBCPP_INLINE_VISIBILITY 34246035553Spatrick error_code() _NOEXCEPT : __val_(0), __cat_(&system_category()) {} 34346035553Spatrick 34446035553Spatrick _LIBCPP_INLINE_VISIBILITY 34546035553Spatrick error_code(int __val, const error_category& __cat) _NOEXCEPT 34646035553Spatrick : __val_(__val), __cat_(&__cat) {} 34746035553Spatrick 34846035553Spatrick template <class _Ep> 34946035553Spatrick _LIBCPP_INLINE_VISIBILITY 35046035553Spatrick error_code(_Ep __e, 35176d0caaeSpatrick typename enable_if<is_error_code_enum<_Ep>::value>::type* = nullptr 35246035553Spatrick ) _NOEXCEPT 353*4bdff4beSrobert { 354*4bdff4beSrobert using __adl_only::make_error_code; 355*4bdff4beSrobert *this = make_error_code(__e); 356*4bdff4beSrobert } 35746035553Spatrick 35846035553Spatrick _LIBCPP_INLINE_VISIBILITY 35946035553Spatrick void assign(int __val, const error_category& __cat) _NOEXCEPT 36046035553Spatrick { 36146035553Spatrick __val_ = __val; 36246035553Spatrick __cat_ = &__cat; 36346035553Spatrick } 36446035553Spatrick 36546035553Spatrick template <class _Ep> 36646035553Spatrick _LIBCPP_INLINE_VISIBILITY 36746035553Spatrick typename enable_if 36846035553Spatrick < 36946035553Spatrick is_error_code_enum<_Ep>::value, 37046035553Spatrick error_code& 37146035553Spatrick >::type 37246035553Spatrick operator=(_Ep __e) _NOEXCEPT 373*4bdff4beSrobert { 374*4bdff4beSrobert using __adl_only::make_error_code; 375*4bdff4beSrobert *this = make_error_code(__e); 376*4bdff4beSrobert return *this; 377*4bdff4beSrobert } 37846035553Spatrick 37946035553Spatrick _LIBCPP_INLINE_VISIBILITY 38046035553Spatrick void clear() _NOEXCEPT 38146035553Spatrick { 38246035553Spatrick __val_ = 0; 38346035553Spatrick __cat_ = &system_category(); 38446035553Spatrick } 38546035553Spatrick 38646035553Spatrick _LIBCPP_INLINE_VISIBILITY 38746035553Spatrick int value() const _NOEXCEPT {return __val_;} 38846035553Spatrick 38946035553Spatrick _LIBCPP_INLINE_VISIBILITY 39046035553Spatrick const error_category& category() const _NOEXCEPT {return *__cat_;} 39146035553Spatrick 39246035553Spatrick _LIBCPP_INLINE_VISIBILITY 39346035553Spatrick error_condition default_error_condition() const _NOEXCEPT 39446035553Spatrick {return __cat_->default_error_condition(__val_);} 39546035553Spatrick 39646035553Spatrick string message() const; 39746035553Spatrick 39846035553Spatrick _LIBCPP_INLINE_VISIBILITY 39976d0caaeSpatrick explicit operator bool() const _NOEXCEPT {return __val_ != 0;} 40046035553Spatrick}; 40146035553Spatrick 40246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 40346035553Spatrickerror_code 40446035553Spatrickmake_error_code(errc __e) _NOEXCEPT 40546035553Spatrick{ 40646035553Spatrick return error_code(static_cast<int>(__e), generic_category()); 40746035553Spatrick} 40846035553Spatrick 40946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 41046035553Spatrickbool 41146035553Spatrickoperator==(const error_code& __x, const error_code& __y) _NOEXCEPT 41246035553Spatrick{ 41346035553Spatrick return __x.category() == __y.category() && __x.value() == __y.value(); 41446035553Spatrick} 41546035553Spatrick 41646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 41746035553Spatrickbool 41846035553Spatrickoperator==(const error_code& __x, const error_condition& __y) _NOEXCEPT 41946035553Spatrick{ 42046035553Spatrick return __x.category().equivalent(__x.value(), __y) 42146035553Spatrick || __y.category().equivalent(__x, __y.value()); 42246035553Spatrick} 42346035553Spatrick 424*4bdff4beSrobert#if _LIBCPP_STD_VER <= 17 42546035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 42646035553Spatrickbool 42746035553Spatrickoperator==(const error_condition& __x, const error_code& __y) _NOEXCEPT 42846035553Spatrick{ 42946035553Spatrick return __y == __x; 43046035553Spatrick} 431*4bdff4beSrobert#endif 43246035553Spatrick 43346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 43446035553Spatrickbool 43546035553Spatrickoperator==(const error_condition& __x, const error_condition& __y) _NOEXCEPT 43646035553Spatrick{ 43746035553Spatrick return __x.category() == __y.category() && __x.value() == __y.value(); 43846035553Spatrick} 43946035553Spatrick 440*4bdff4beSrobert#if _LIBCPP_STD_VER <= 17 441*4bdff4beSrobert 44246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 44346035553Spatrickbool 44446035553Spatrickoperator!=(const error_code& __x, const error_code& __y) _NOEXCEPT 44546035553Spatrick{return !(__x == __y);} 44646035553Spatrick 44746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 44846035553Spatrickbool 44946035553Spatrickoperator!=(const error_code& __x, const error_condition& __y) _NOEXCEPT 45046035553Spatrick{return !(__x == __y);} 45146035553Spatrick 45246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 45346035553Spatrickbool 45446035553Spatrickoperator!=(const error_condition& __x, const error_code& __y) _NOEXCEPT 45546035553Spatrick{return !(__x == __y);} 45646035553Spatrick 45746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 45846035553Spatrickbool 45946035553Spatrickoperator!=(const error_condition& __x, const error_condition& __y) _NOEXCEPT 46046035553Spatrick{return !(__x == __y);} 46146035553Spatrick 462*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY 463*4bdff4beSrobertbool 464*4bdff4beSrobertoperator<(const error_condition& __x, const error_condition& __y) _NOEXCEPT 465*4bdff4beSrobert{ 466*4bdff4beSrobert return __x.category() < __y.category() 467*4bdff4beSrobert || (__x.category() == __y.category() && __x.value() < __y.value()); 468*4bdff4beSrobert} 469*4bdff4beSrobert 470*4bdff4beSrobertinline _LIBCPP_INLINE_VISIBILITY 471*4bdff4beSrobertbool 472*4bdff4beSrobertoperator<(const error_code& __x, const error_code& __y) _NOEXCEPT 473*4bdff4beSrobert{ 474*4bdff4beSrobert return __x.category() < __y.category() 475*4bdff4beSrobert || (__x.category() == __y.category() && __x.value() < __y.value()); 476*4bdff4beSrobert} 477*4bdff4beSrobert 478*4bdff4beSrobert#else // _LIBCPP_STD_VER <= 17 479*4bdff4beSrobert 480*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI strong_ordering 481*4bdff4beSrobertoperator<=>(const error_code& __x, const error_code& __y) noexcept 482*4bdff4beSrobert{ 483*4bdff4beSrobert if (auto __c = __x.category() <=> __y.category(); __c != 0) 484*4bdff4beSrobert return __c; 485*4bdff4beSrobert return __x.value() <=> __y.value(); 486*4bdff4beSrobert} 487*4bdff4beSrobert 488*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI strong_ordering 489*4bdff4beSrobertoperator<=>(const error_condition& __x, const error_condition& __y) noexcept 490*4bdff4beSrobert{ 491*4bdff4beSrobert if (auto __c = __x.category() <=> __y.category(); __c != 0) 492*4bdff4beSrobert return __c; 493*4bdff4beSrobert return __x.value() <=> __y.value(); 494*4bdff4beSrobert} 495*4bdff4beSrobert 496*4bdff4beSrobert#endif // _LIBCPP_STD_VER <= 17 497*4bdff4beSrobert 49846035553Spatricktemplate <> 49946035553Spatrickstruct _LIBCPP_TEMPLATE_VIS hash<error_code> 500*4bdff4beSrobert : public __unary_function<error_code, size_t> 50146035553Spatrick{ 50246035553Spatrick _LIBCPP_INLINE_VISIBILITY 50346035553Spatrick size_t operator()(const error_code& __ec) const _NOEXCEPT 50446035553Spatrick { 50546035553Spatrick return static_cast<size_t>(__ec.value()); 50646035553Spatrick } 50746035553Spatrick}; 50846035553Spatrick 50946035553Spatricktemplate <> 51046035553Spatrickstruct _LIBCPP_TEMPLATE_VIS hash<error_condition> 511*4bdff4beSrobert : public __unary_function<error_condition, size_t> 51246035553Spatrick{ 51346035553Spatrick _LIBCPP_INLINE_VISIBILITY 51446035553Spatrick size_t operator()(const error_condition& __ec) const _NOEXCEPT 51546035553Spatrick { 51646035553Spatrick return static_cast<size_t>(__ec.value()); 51746035553Spatrick } 51846035553Spatrick}; 51946035553Spatrick 52046035553Spatrick// system_error 52146035553Spatrick 52246035553Spatrickclass _LIBCPP_TYPE_VIS system_error 52346035553Spatrick : public runtime_error 52446035553Spatrick{ 52546035553Spatrick error_code __ec_; 52646035553Spatrickpublic: 52746035553Spatrick system_error(error_code __ec, const string& __what_arg); 52846035553Spatrick system_error(error_code __ec, const char* __what_arg); 52946035553Spatrick system_error(error_code __ec); 53046035553Spatrick system_error(int __ev, const error_category& __ecat, const string& __what_arg); 53146035553Spatrick system_error(int __ev, const error_category& __ecat, const char* __what_arg); 53246035553Spatrick system_error(int __ev, const error_category& __ecat); 533037e7968Spatrick system_error(const system_error&) _NOEXCEPT = default; 534*4bdff4beSrobert ~system_error() _NOEXCEPT override; 53546035553Spatrick 53646035553Spatrick _LIBCPP_INLINE_VISIBILITY 53746035553Spatrick const error_code& code() const _NOEXCEPT {return __ec_;} 53846035553Spatrick 53946035553Spatrickprivate: 54046035553Spatrick static string __init(const error_code&, string); 54146035553Spatrick}; 54246035553Spatrick 54346035553Spatrick_LIBCPP_NORETURN _LIBCPP_FUNC_VIS 544*4bdff4beSrobertvoid __throw_system_error(int __ev, const char* __what_arg); 54546035553Spatrick 54646035553Spatrick_LIBCPP_END_NAMESPACE_STD 54746035553Spatrick 54846035553Spatrick#endif // _LIBCPP_SYSTEM_ERROR 549