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