xref: /openbsd-src/gnu/llvm/libcxx/include/system_error (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
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