1e8cfbfd0SMark de Wever // -*- C++ -*- 2e8cfbfd0SMark de Wever //===----------------------------------------------------------------------===// 3e8cfbfd0SMark de Wever // 4e8cfbfd0SMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e8cfbfd0SMark de Wever // See https://llvm.org/LICENSE.txt for license information. 6e8cfbfd0SMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e8cfbfd0SMark de Wever // 8e8cfbfd0SMark de Wever //===----------------------------------------------------------------------===// 9e8cfbfd0SMark de Wever 10e8cfbfd0SMark de Wever #ifndef _LIBCPP___SYSTEM_ERROR_ERROR_CONDITION_H 11e8cfbfd0SMark de Wever #define _LIBCPP___SYSTEM_ERROR_ERROR_CONDITION_H 12e8cfbfd0SMark de Wever 13e8cfbfd0SMark de Wever #include <__compare/ordering.h> 14e8cfbfd0SMark de Wever #include <__config> 1540cdb220SIan Anderson #include <__functional/hash.h> 16e8cfbfd0SMark de Wever #include <__functional/unary_function.h> 17eb65912eSNikolas Klauser #include <__system_error/errc.h> 18e8cfbfd0SMark de Wever #include <__system_error/error_category.h> 19e8cfbfd0SMark de Wever #include <string> 20e8cfbfd0SMark de Wever 21e8cfbfd0SMark de Wever #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 22e8cfbfd0SMark de Wever # pragma GCC system_header 23e8cfbfd0SMark de Wever #endif 24e8cfbfd0SMark de Wever 25e8cfbfd0SMark de Wever _LIBCPP_BEGIN_NAMESPACE_STD 26e8cfbfd0SMark de Wever 27e8cfbfd0SMark de Wever template <class _Tp> 2851f0b809SMark de Wever struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum : public false_type {}; 29e8cfbfd0SMark de Wever 30e8cfbfd0SMark de Wever #if _LIBCPP_STD_VER >= 17 31e8cfbfd0SMark de Wever template <class _Tp> 32e8cfbfd0SMark de Wever inline constexpr bool is_error_condition_enum_v = is_error_condition_enum<_Tp>::value; 33e8cfbfd0SMark de Wever #endif 34e8cfbfd0SMark de Wever 35e8cfbfd0SMark de Wever template <> 3651f0b809SMark de Wever struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum<errc> : true_type {}; 37e8cfbfd0SMark de Wever 38e8cfbfd0SMark de Wever #ifdef _LIBCPP_CXX03_LANG 39e8cfbfd0SMark de Wever template <> 4051f0b809SMark de Wever struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum<errc::__lx> : true_type {}; 41e8cfbfd0SMark de Wever #endif 42e8cfbfd0SMark de Wever 43e8cfbfd0SMark de Wever namespace __adl_only { 44e8cfbfd0SMark de Wever // Those cause ADL to trigger but they are not viable candidates, 45e8cfbfd0SMark de Wever // so they are never actually selected. 46e8cfbfd0SMark de Wever void make_error_condition() = delete; 47e8cfbfd0SMark de Wever } // namespace __adl_only 48e8cfbfd0SMark de Wever 49f1ea0b11SNikolas Klauser class _LIBCPP_EXPORTED_FROM_ABI error_condition { 50e8cfbfd0SMark de Wever int __val_; 51e8cfbfd0SMark de Wever const error_category* __cat_; 52e8cfbfd0SMark de Wever 5351f0b809SMark de Wever public: 54943d2257SMark de Wever _LIBCPP_HIDE_FROM_ABI error_condition() _NOEXCEPT : __val_(0), __cat_(&generic_category()) {} 5551f0b809SMark de Wever 56943d2257SMark de Wever _LIBCPP_HIDE_FROM_ABI error_condition(int __val, const error_category& __cat) _NOEXCEPT 5751f0b809SMark de Wever : __val_(__val), 5851f0b809SMark de Wever __cat_(&__cat) {} 59e8cfbfd0SMark de Wever 60*4da76ea7SNikolas Klauser template <class _Ep, __enable_if_t<is_error_condition_enum<_Ep>::value, int> = 0> 61*4da76ea7SNikolas Klauser _LIBCPP_HIDE_FROM_ABI error_condition(_Ep __e) _NOEXCEPT { 62e8cfbfd0SMark de Wever using __adl_only::make_error_condition; 63e8cfbfd0SMark de Wever *this = make_error_condition(__e); 64e8cfbfd0SMark de Wever } 65e8cfbfd0SMark de Wever 66943d2257SMark de Wever _LIBCPP_HIDE_FROM_ABI void assign(int __val, const error_category& __cat) _NOEXCEPT { 67e8cfbfd0SMark de Wever __val_ = __val; 68e8cfbfd0SMark de Wever __cat_ = &__cat; 69e8cfbfd0SMark de Wever } 70e8cfbfd0SMark de Wever 71475bd19eSNikolas Klauser template <class _Ep, __enable_if_t<is_error_condition_enum<_Ep>::value, int> = 0> 72475bd19eSNikolas Klauser _LIBCPP_HIDE_FROM_ABI error_condition& operator=(_Ep __e) _NOEXCEPT { 73e8cfbfd0SMark de Wever using __adl_only::make_error_condition; 74e8cfbfd0SMark de Wever *this = make_error_condition(__e); 75e8cfbfd0SMark de Wever return *this; 76e8cfbfd0SMark de Wever } 77e8cfbfd0SMark de Wever 78943d2257SMark de Wever _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { 79e8cfbfd0SMark de Wever __val_ = 0; 80e8cfbfd0SMark de Wever __cat_ = &generic_category(); 81e8cfbfd0SMark de Wever } 82e8cfbfd0SMark de Wever 83943d2257SMark de Wever _LIBCPP_HIDE_FROM_ABI int value() const _NOEXCEPT { return __val_; } 84e8cfbfd0SMark de Wever 85943d2257SMark de Wever _LIBCPP_HIDE_FROM_ABI const error_category& category() const _NOEXCEPT { return *__cat_; } 86e8cfbfd0SMark de Wever string message() const; 87e8cfbfd0SMark de Wever 88943d2257SMark de Wever _LIBCPP_HIDE_FROM_ABI explicit operator bool() const _NOEXCEPT { return __val_ != 0; } 89e8cfbfd0SMark de Wever }; 90e8cfbfd0SMark de Wever 91943d2257SMark de Wever inline _LIBCPP_HIDE_FROM_ABI error_condition make_error_condition(errc __e) _NOEXCEPT { 92e8cfbfd0SMark de Wever return error_condition(static_cast<int>(__e), generic_category()); 93e8cfbfd0SMark de Wever } 94e8cfbfd0SMark de Wever 95943d2257SMark de Wever inline _LIBCPP_HIDE_FROM_ABI bool operator==(const error_condition& __x, const error_condition& __y) _NOEXCEPT { 96e8cfbfd0SMark de Wever return __x.category() == __y.category() && __x.value() == __y.value(); 97e8cfbfd0SMark de Wever } 98e8cfbfd0SMark de Wever 99e8cfbfd0SMark de Wever #if _LIBCPP_STD_VER <= 17 100e8cfbfd0SMark de Wever 101943d2257SMark de Wever inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const error_condition& __x, const error_condition& __y) _NOEXCEPT { 10251f0b809SMark de Wever return !(__x == __y); 103e8cfbfd0SMark de Wever } 104e8cfbfd0SMark de Wever 105943d2257SMark de Wever inline _LIBCPP_HIDE_FROM_ABI bool operator<(const error_condition& __x, const error_condition& __y) _NOEXCEPT { 10651f0b809SMark de Wever return __x.category() < __y.category() || (__x.category() == __y.category() && __x.value() < __y.value()); 10751f0b809SMark de Wever } 108e8cfbfd0SMark de Wever 109e8cfbfd0SMark de Wever #else // _LIBCPP_STD_VER <= 17 110e8cfbfd0SMark de Wever 111e8cfbfd0SMark de Wever inline _LIBCPP_HIDE_FROM_ABI strong_ordering 11251f0b809SMark de Wever operator<=>(const error_condition& __x, const error_condition& __y) noexcept { 113e8cfbfd0SMark de Wever if (auto __c = __x.category() <=> __y.category(); __c != 0) 114e8cfbfd0SMark de Wever return __c; 115e8cfbfd0SMark de Wever return __x.value() <=> __y.value(); 116e8cfbfd0SMark de Wever } 117e8cfbfd0SMark de Wever 118e8cfbfd0SMark de Wever #endif // _LIBCPP_STD_VER <= 17 119e8cfbfd0SMark de Wever 120e8cfbfd0SMark de Wever template <> 12151f0b809SMark de Wever struct _LIBCPP_TEMPLATE_VIS hash<error_condition> : public __unary_function<error_condition, size_t> { 122943d2257SMark de Wever _LIBCPP_HIDE_FROM_ABI size_t operator()(const error_condition& __ec) const _NOEXCEPT { 123e8cfbfd0SMark de Wever return static_cast<size_t>(__ec.value()); 124e8cfbfd0SMark de Wever } 125e8cfbfd0SMark de Wever }; 126e8cfbfd0SMark de Wever 127e8cfbfd0SMark de Wever _LIBCPP_END_NAMESPACE_STD 128e8cfbfd0SMark de Wever 129e8cfbfd0SMark de Wever #endif // _LIBCPP___SYSTEM_ERROR_ERROR_CONDITION_H 130