xref: /freebsd/contrib/llvm-project/libcxx/include/system_error (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_SYSTEM_ERROR
110b57cec5SDimitry Andric#define _LIBCPP_SYSTEM_ERROR
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    system_error synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricnamespace std
170b57cec5SDimitry Andric{
180b57cec5SDimitry Andric
190b57cec5SDimitry Andricclass error_category
200b57cec5SDimitry Andric{
210b57cec5SDimitry Andricpublic:
220b57cec5SDimitry Andric    virtual ~error_category() noexcept;
230b57cec5SDimitry Andric
240b57cec5SDimitry Andric    constexpr error_category();
250b57cec5SDimitry Andric    error_category(const error_category&) = delete;
260b57cec5SDimitry Andric    error_category& operator=(const error_category&) = delete;
270b57cec5SDimitry Andric
280b57cec5SDimitry Andric    virtual const char* name() const noexcept = 0;
290b57cec5SDimitry Andric    virtual error_condition default_error_condition(int ev) const noexcept;
300b57cec5SDimitry Andric    virtual bool equivalent(int code, const error_condition& condition) const noexcept;
310b57cec5SDimitry Andric    virtual bool equivalent(const error_code& code, int condition) const noexcept;
320b57cec5SDimitry Andric    virtual string message(int ev) const = 0;
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric    bool operator==(const error_category& rhs) const noexcept;
35bdd1243dSDimitry Andric    bool operator!=(const error_category& rhs) const noexcept;              // removed in C++20
36bdd1243dSDimitry Andric    bool operator<(const error_category& rhs) const noexcept;               // removed in C++20
37bdd1243dSDimitry Andric    strong_ordering operator<=>(const error_category& rhs) const noexcept;  // C++20
380b57cec5SDimitry Andric};
390b57cec5SDimitry Andric
400b57cec5SDimitry Andricconst error_category& generic_category() noexcept;
410b57cec5SDimitry Andricconst error_category& system_category() noexcept;
420b57cec5SDimitry Andric
430b57cec5SDimitry Andrictemplate <class T> struct is_error_code_enum
440b57cec5SDimitry Andric    : public false_type {};
450b57cec5SDimitry Andric
460b57cec5SDimitry Andrictemplate <class T> struct is_error_condition_enum
470b57cec5SDimitry Andric    : public false_type {};
480b57cec5SDimitry Andric
490b57cec5SDimitry Andrictemplate <class _Tp>
50349cc55cSDimitry Andricinline constexpr bool is_error_condition_enum_v = is_error_condition_enum<_Tp>::value; // C++17
510b57cec5SDimitry Andric
520b57cec5SDimitry Andrictemplate <class _Tp>
53349cc55cSDimitry Andricinline constexpr bool is_error_code_enum_v = is_error_code_enum<_Tp>::value; // C++17
540b57cec5SDimitry Andric
550b57cec5SDimitry Andricclass error_code
560b57cec5SDimitry Andric{
570b57cec5SDimitry Andricpublic:
580b57cec5SDimitry Andric    // constructors:
590b57cec5SDimitry Andric    error_code() noexcept;
600b57cec5SDimitry Andric    error_code(int val, const error_category& cat) noexcept;
610b57cec5SDimitry Andric    template <class ErrorCodeEnum>
620b57cec5SDimitry Andric        error_code(ErrorCodeEnum e) noexcept;
630b57cec5SDimitry Andric
640b57cec5SDimitry Andric    // modifiers:
650b57cec5SDimitry Andric    void assign(int val, const error_category& cat) noexcept;
660b57cec5SDimitry Andric    template <class ErrorCodeEnum>
670b57cec5SDimitry Andric        error_code& operator=(ErrorCodeEnum e) noexcept;
680b57cec5SDimitry Andric    void clear() noexcept;
690b57cec5SDimitry Andric
700b57cec5SDimitry Andric    // observers:
710b57cec5SDimitry Andric    int value() const noexcept;
720b57cec5SDimitry Andric    const error_category& category() const noexcept;
730b57cec5SDimitry Andric    error_condition default_error_condition() const noexcept;
740b57cec5SDimitry Andric    string message() const;
750b57cec5SDimitry Andric    explicit operator bool() const noexcept;
760b57cec5SDimitry Andric};
770b57cec5SDimitry Andric
780b57cec5SDimitry Andric// non-member functions:
790b57cec5SDimitry Andrictemplate <class charT, class traits>
800b57cec5SDimitry Andric    basic_ostream<charT,traits>&
810b57cec5SDimitry Andric    operator<<(basic_ostream<charT,traits>& os, const error_code& ec);
820b57cec5SDimitry Andric
830b57cec5SDimitry Andricclass error_condition
840b57cec5SDimitry Andric{
850b57cec5SDimitry Andricpublic:
860b57cec5SDimitry Andric    // constructors:
870b57cec5SDimitry Andric    error_condition() noexcept;
880b57cec5SDimitry Andric    error_condition(int val, const error_category& cat) noexcept;
890b57cec5SDimitry Andric    template <class ErrorConditionEnum>
900b57cec5SDimitry Andric        error_condition(ErrorConditionEnum e) noexcept;
910b57cec5SDimitry Andric
920b57cec5SDimitry Andric    // modifiers:
930b57cec5SDimitry Andric    void assign(int val, const error_category& cat) noexcept;
940b57cec5SDimitry Andric    template <class ErrorConditionEnum>
950b57cec5SDimitry Andric        error_condition& operator=(ErrorConditionEnum e) noexcept;
960b57cec5SDimitry Andric    void clear() noexcept;
970b57cec5SDimitry Andric
980b57cec5SDimitry Andric    // observers:
990b57cec5SDimitry Andric    int value() const noexcept;
1000b57cec5SDimitry Andric    const error_category& category() const noexcept;
1010b57cec5SDimitry Andric    string message() const noexcept;
1020b57cec5SDimitry Andric    explicit operator bool() const noexcept;
1030b57cec5SDimitry Andric};
1040b57cec5SDimitry Andric
1050b57cec5SDimitry Andricclass system_error
1060b57cec5SDimitry Andric    : public runtime_error
1070b57cec5SDimitry Andric{
1080b57cec5SDimitry Andricpublic:
1090b57cec5SDimitry Andric    system_error(error_code ec, const string& what_arg);
1100b57cec5SDimitry Andric    system_error(error_code ec, const char* what_arg);
1110b57cec5SDimitry Andric    system_error(error_code ec);
1120b57cec5SDimitry Andric    system_error(int ev, const error_category& ecat, const string& what_arg);
1130b57cec5SDimitry Andric    system_error(int ev, const error_category& ecat, const char* what_arg);
1140b57cec5SDimitry Andric    system_error(int ev, const error_category& ecat);
1150b57cec5SDimitry Andric
1160b57cec5SDimitry Andric    const error_code& code() const noexcept;
1170b57cec5SDimitry Andric    const char* what() const noexcept;
1180b57cec5SDimitry Andric};
1190b57cec5SDimitry Andric
1200b57cec5SDimitry Andrictemplate <> struct is_error_condition_enum<errc>
1210b57cec5SDimitry Andric    : true_type { }
1220b57cec5SDimitry Andric
1230b57cec5SDimitry Andricerror_code make_error_code(errc e) noexcept;
1240b57cec5SDimitry Andricerror_condition make_error_condition(errc e) noexcept;
1250b57cec5SDimitry Andric
1260b57cec5SDimitry Andric// Comparison operators:
1270b57cec5SDimitry Andricbool operator==(const error_code& lhs, const error_code& rhs) noexcept;
1280b57cec5SDimitry Andricbool operator==(const error_code& lhs, const error_condition& rhs) noexcept;
129bdd1243dSDimitry Andricbool operator==(const error_condition& lhs, const error_code& rhs) noexcept;                  // removed in C++20
1300b57cec5SDimitry Andricbool operator==(const error_condition& lhs, const error_condition& rhs) noexcept;
131bdd1243dSDimitry Andricbool operator!=(const error_code& lhs, const error_code& rhs) noexcept;                       // removed in C++20
132bdd1243dSDimitry Andricbool operator!=(const error_code& lhs, const error_condition& rhs) noexcept;                  // removed in C++20
133bdd1243dSDimitry Andricbool operator!=(const error_condition& lhs, const error_code& rhs) noexcept;                  // removed in C++20
134bdd1243dSDimitry Andricbool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept;             // removed in C++20
135bdd1243dSDimitry Andricbool operator<(const error_condition& lhs, const error_condition& rhs) noexcept;              // removed in C++20
136bdd1243dSDimitry Andricbool operator<(const error_code& lhs, const error_code& rhs) noexcept;                        // removed in C++20
137bdd1243dSDimitry Andricstrong_ordering operator<=>(const error_code& lhs, const error_code& rhs) noexcept;           // C++20
138bdd1243dSDimitry Andricstrong_ordering operator<=>(const error_condition& lhs, const error_condition& rhs) noexcept; // C++20
1390b57cec5SDimitry Andric
1400b57cec5SDimitry Andrictemplate <> struct hash<std::error_code>;
1410b57cec5SDimitry Andrictemplate <> struct hash<std::error_condition>;
1420b57cec5SDimitry Andric
1430b57cec5SDimitry Andric}  // std
1440b57cec5SDimitry Andric
1450b57cec5SDimitry Andric*/
1460b57cec5SDimitry Andric
147fe6060f1SDimitry Andric#include <__config>
148*06c3fb27SDimitry Andric#include <__system_error/errc.h>
149*06c3fb27SDimitry Andric#include <__system_error/error_category.h>
150*06c3fb27SDimitry Andric#include <__system_error/error_code.h>
151*06c3fb27SDimitry Andric#include <__system_error/error_condition.h>
152*06c3fb27SDimitry Andric#include <__system_error/system_error.h>
15304eeddc0SDimitry Andric#include <version>
1540b57cec5SDimitry Andric
15581ad6265SDimitry Andric// standard-mandated includes
156bdd1243dSDimitry Andric
157bdd1243dSDimitry Andric// [system.error.syn]
15881ad6265SDimitry Andric#include <compare>
15981ad6265SDimitry Andric
1600b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1610b57cec5SDimitry Andric#  pragma GCC system_header
1620b57cec5SDimitry Andric#endif
1630b57cec5SDimitry Andric
164*06c3fb27SDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
165*06c3fb27SDimitry Andric#  include <cstdint>
166*06c3fb27SDimitry Andric#  include <cstring>
167*06c3fb27SDimitry Andric#  include <limits>
168*06c3fb27SDimitry Andric#  include <type_traits>
1690b57cec5SDimitry Andric#endif
1700b57cec5SDimitry Andric
1710b57cec5SDimitry Andric#endif // _LIBCPP_SYSTEM_ERROR
172