xref: /freebsd/contrib/llvm-project/libcxx/include/__cxx03/system_error (revision 700637cbb5e582861067a11aaca4d053546871d2)
1*700637cbSDimitry Andric// -*- C++ -*-
2*700637cbSDimitry Andric//===----------------------------------------------------------------------===//
3*700637cbSDimitry Andric//
4*700637cbSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*700637cbSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
6*700637cbSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*700637cbSDimitry Andric//
8*700637cbSDimitry Andric//===----------------------------------------------------------------------===//
9*700637cbSDimitry Andric
10*700637cbSDimitry Andric#ifndef _LIBCPP___CXX03_SYSTEM_ERROR
11*700637cbSDimitry Andric#define _LIBCPP___CXX03_SYSTEM_ERROR
12*700637cbSDimitry Andric
13*700637cbSDimitry Andric/*
14*700637cbSDimitry Andric    system_error synopsis
15*700637cbSDimitry Andric
16*700637cbSDimitry Andricnamespace std
17*700637cbSDimitry Andric{
18*700637cbSDimitry Andric
19*700637cbSDimitry Andricclass error_category
20*700637cbSDimitry Andric{
21*700637cbSDimitry Andricpublic:
22*700637cbSDimitry Andric    virtual ~error_category() noexcept;
23*700637cbSDimitry Andric
24*700637cbSDimitry Andric    constexpr error_category();
25*700637cbSDimitry Andric    error_category(const error_category&) = delete;
26*700637cbSDimitry Andric    error_category& operator=(const error_category&) = delete;
27*700637cbSDimitry Andric
28*700637cbSDimitry Andric    virtual const char* name() const noexcept = 0;
29*700637cbSDimitry Andric    virtual error_condition default_error_condition(int ev) const noexcept;
30*700637cbSDimitry Andric    virtual bool equivalent(int code, const error_condition& condition) const noexcept;
31*700637cbSDimitry Andric    virtual bool equivalent(const error_code& code, int condition) const noexcept;
32*700637cbSDimitry Andric    virtual string message(int ev) const = 0;
33*700637cbSDimitry Andric
34*700637cbSDimitry Andric    bool operator==(const error_category& rhs) const noexcept;
35*700637cbSDimitry Andric    bool operator!=(const error_category& rhs) const noexcept;              // removed in C++20
36*700637cbSDimitry Andric    bool operator<(const error_category& rhs) const noexcept;               // removed in C++20
37*700637cbSDimitry Andric    strong_ordering operator<=>(const error_category& rhs) const noexcept;  // C++20
38*700637cbSDimitry Andric};
39*700637cbSDimitry Andric
40*700637cbSDimitry Andricconst error_category& generic_category() noexcept;
41*700637cbSDimitry Andricconst error_category& system_category() noexcept;
42*700637cbSDimitry Andric
43*700637cbSDimitry Andrictemplate <class T> struct is_error_code_enum
44*700637cbSDimitry Andric    : public false_type {};
45*700637cbSDimitry Andric
46*700637cbSDimitry Andrictemplate <class T> struct is_error_condition_enum
47*700637cbSDimitry Andric    : public false_type {};
48*700637cbSDimitry Andric
49*700637cbSDimitry Andrictemplate <class _Tp>
50*700637cbSDimitry Andricinline constexpr bool is_error_condition_enum_v = is_error_condition_enum<_Tp>::value; // C++17
51*700637cbSDimitry Andric
52*700637cbSDimitry Andrictemplate <class _Tp>
53*700637cbSDimitry Andricinline constexpr bool is_error_code_enum_v = is_error_code_enum<_Tp>::value; // C++17
54*700637cbSDimitry Andric
55*700637cbSDimitry Andricclass error_code
56*700637cbSDimitry Andric{
57*700637cbSDimitry Andricpublic:
58*700637cbSDimitry Andric    // constructors:
59*700637cbSDimitry Andric    error_code() noexcept;
60*700637cbSDimitry Andric    error_code(int val, const error_category& cat) noexcept;
61*700637cbSDimitry Andric    template <class ErrorCodeEnum>
62*700637cbSDimitry Andric        error_code(ErrorCodeEnum e) noexcept;
63*700637cbSDimitry Andric
64*700637cbSDimitry Andric    // modifiers:
65*700637cbSDimitry Andric    void assign(int val, const error_category& cat) noexcept;
66*700637cbSDimitry Andric    template <class ErrorCodeEnum>
67*700637cbSDimitry Andric        error_code& operator=(ErrorCodeEnum e) noexcept;
68*700637cbSDimitry Andric    void clear() noexcept;
69*700637cbSDimitry Andric
70*700637cbSDimitry Andric    // observers:
71*700637cbSDimitry Andric    int value() const noexcept;
72*700637cbSDimitry Andric    const error_category& category() const noexcept;
73*700637cbSDimitry Andric    error_condition default_error_condition() const noexcept;
74*700637cbSDimitry Andric    string message() const;
75*700637cbSDimitry Andric    explicit operator bool() const noexcept;
76*700637cbSDimitry Andric};
77*700637cbSDimitry Andric
78*700637cbSDimitry Andric// non-member functions:
79*700637cbSDimitry Andrictemplate <class charT, class traits>
80*700637cbSDimitry Andric    basic_ostream<charT,traits>&
81*700637cbSDimitry Andric    operator<<(basic_ostream<charT,traits>& os, const error_code& ec);
82*700637cbSDimitry Andric
83*700637cbSDimitry Andricclass error_condition
84*700637cbSDimitry Andric{
85*700637cbSDimitry Andricpublic:
86*700637cbSDimitry Andric    // constructors:
87*700637cbSDimitry Andric    error_condition() noexcept;
88*700637cbSDimitry Andric    error_condition(int val, const error_category& cat) noexcept;
89*700637cbSDimitry Andric    template <class ErrorConditionEnum>
90*700637cbSDimitry Andric        error_condition(ErrorConditionEnum e) noexcept;
91*700637cbSDimitry Andric
92*700637cbSDimitry Andric    // modifiers:
93*700637cbSDimitry Andric    void assign(int val, const error_category& cat) noexcept;
94*700637cbSDimitry Andric    template <class ErrorConditionEnum>
95*700637cbSDimitry Andric        error_condition& operator=(ErrorConditionEnum e) noexcept;
96*700637cbSDimitry Andric    void clear() noexcept;
97*700637cbSDimitry Andric
98*700637cbSDimitry Andric    // observers:
99*700637cbSDimitry Andric    int value() const noexcept;
100*700637cbSDimitry Andric    const error_category& category() const noexcept;
101*700637cbSDimitry Andric    string message() const noexcept;
102*700637cbSDimitry Andric    explicit operator bool() const noexcept;
103*700637cbSDimitry Andric};
104*700637cbSDimitry Andric
105*700637cbSDimitry Andricclass system_error
106*700637cbSDimitry Andric    : public runtime_error
107*700637cbSDimitry Andric{
108*700637cbSDimitry Andricpublic:
109*700637cbSDimitry Andric    system_error(error_code ec, const string& what_arg);
110*700637cbSDimitry Andric    system_error(error_code ec, const char* what_arg);
111*700637cbSDimitry Andric    system_error(error_code ec);
112*700637cbSDimitry Andric    system_error(int ev, const error_category& ecat, const string& what_arg);
113*700637cbSDimitry Andric    system_error(int ev, const error_category& ecat, const char* what_arg);
114*700637cbSDimitry Andric    system_error(int ev, const error_category& ecat);
115*700637cbSDimitry Andric
116*700637cbSDimitry Andric    const error_code& code() const noexcept;
117*700637cbSDimitry Andric    const char* what() const noexcept;
118*700637cbSDimitry Andric};
119*700637cbSDimitry Andric
120*700637cbSDimitry Andrictemplate <> struct is_error_condition_enum<errc>
121*700637cbSDimitry Andric    : true_type { }
122*700637cbSDimitry Andric
123*700637cbSDimitry Andricerror_code make_error_code(errc e) noexcept;
124*700637cbSDimitry Andricerror_condition make_error_condition(errc e) noexcept;
125*700637cbSDimitry Andric
126*700637cbSDimitry Andric// Comparison operators:
127*700637cbSDimitry Andricbool operator==(const error_code& lhs, const error_code& rhs) noexcept;
128*700637cbSDimitry Andricbool operator==(const error_code& lhs, const error_condition& rhs) noexcept;
129*700637cbSDimitry Andricbool operator==(const error_condition& lhs, const error_code& rhs) noexcept;                  // removed in C++20
130*700637cbSDimitry Andricbool operator==(const error_condition& lhs, const error_condition& rhs) noexcept;
131*700637cbSDimitry Andricbool operator!=(const error_code& lhs, const error_code& rhs) noexcept;                       // removed in C++20
132*700637cbSDimitry Andricbool operator!=(const error_code& lhs, const error_condition& rhs) noexcept;                  // removed in C++20
133*700637cbSDimitry Andricbool operator!=(const error_condition& lhs, const error_code& rhs) noexcept;                  // removed in C++20
134*700637cbSDimitry Andricbool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept;             // removed in C++20
135*700637cbSDimitry Andricbool operator<(const error_condition& lhs, const error_condition& rhs) noexcept;              // removed in C++20
136*700637cbSDimitry Andricbool operator<(const error_code& lhs, const error_code& rhs) noexcept;                        // removed in C++20
137*700637cbSDimitry Andricstrong_ordering operator<=>(const error_code& lhs, const error_code& rhs) noexcept;           // C++20
138*700637cbSDimitry Andricstrong_ordering operator<=>(const error_condition& lhs, const error_condition& rhs) noexcept; // C++20
139*700637cbSDimitry Andric
140*700637cbSDimitry Andrictemplate <> struct hash<std::error_code>;
141*700637cbSDimitry Andrictemplate <> struct hash<std::error_condition>;
142*700637cbSDimitry Andric
143*700637cbSDimitry Andric}  // std
144*700637cbSDimitry Andric
145*700637cbSDimitry Andric*/
146*700637cbSDimitry Andric
147*700637cbSDimitry Andric#include <__cxx03/__config>
148*700637cbSDimitry Andric#include <__cxx03/__system_error/errc.h>
149*700637cbSDimitry Andric#include <__cxx03/__system_error/error_category.h>
150*700637cbSDimitry Andric#include <__cxx03/__system_error/error_code.h>
151*700637cbSDimitry Andric#include <__cxx03/__system_error/error_condition.h>
152*700637cbSDimitry Andric#include <__cxx03/__system_error/system_error.h>
153*700637cbSDimitry Andric#include <__cxx03/version>
154*700637cbSDimitry Andric
155*700637cbSDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
156*700637cbSDimitry Andric#  pragma GCC system_header
157*700637cbSDimitry Andric#endif
158*700637cbSDimitry Andric
159*700637cbSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
160*700637cbSDimitry Andric#  include <__cxx03/cstdint>
161*700637cbSDimitry Andric#  include <__cxx03/cstring>
162*700637cbSDimitry Andric#  include <__cxx03/limits>
163*700637cbSDimitry Andric#  include <__cxx03/type_traits>
164*700637cbSDimitry Andric#endif
165*700637cbSDimitry Andric
166*700637cbSDimitry Andric#endif // _LIBCPP___CXX03_SYSTEM_ERROR
167