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