1//===---------------------- system_error.cpp ------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "system_error" 11#include "string" 12#include "cstring" 13 14_LIBCPP_BEGIN_NAMESPACE_STD 15 16// class error_category 17 18error_category::error_category() _NOEXCEPT 19{ 20} 21 22error_category::~error_category() _NOEXCEPT 23{ 24} 25 26error_condition 27error_category::default_error_condition(int ev) const _NOEXCEPT 28{ 29 return error_condition(ev, *this); 30} 31 32bool 33error_category::equivalent(int code, const error_condition& condition) const _NOEXCEPT 34{ 35 return default_error_condition(code) == condition; 36} 37 38bool 39error_category::equivalent(const error_code& code, int condition) const _NOEXCEPT 40{ 41 return *this == code.category() && code.value() == condition; 42} 43 44string 45__do_message::message(int ev) const 46{ 47 return string(strerror(ev)); 48} 49 50class _LIBCPP_HIDDEN __generic_error_category 51 : public __do_message 52{ 53public: 54 virtual const char* name() const _NOEXCEPT; 55 virtual string message(int ev) const; 56}; 57 58const char* 59__generic_error_category::name() const _NOEXCEPT 60{ 61 return "generic"; 62} 63 64string 65__generic_error_category::message(int ev) const 66{ 67#ifdef ELAST 68 if (ev > ELAST) 69 return string("unspecified generic_category error"); 70#endif // ELAST 71 return __do_message::message(ev); 72} 73 74const error_category& 75generic_category() _NOEXCEPT 76{ 77 static __generic_error_category s; 78 return s; 79} 80 81class _LIBCPP_HIDDEN __system_error_category 82 : public __do_message 83{ 84public: 85 virtual const char* name() const _NOEXCEPT; 86 virtual string message(int ev) const; 87 virtual error_condition default_error_condition(int ev) const _NOEXCEPT; 88}; 89 90const char* 91__system_error_category::name() const _NOEXCEPT 92{ 93 return "system"; 94} 95 96string 97__system_error_category::message(int ev) const 98{ 99#ifdef ELAST 100 if (ev > ELAST) 101 return string("unspecified system_category error"); 102#endif // ELAST 103 return __do_message::message(ev); 104} 105 106error_condition 107__system_error_category::default_error_condition(int ev) const _NOEXCEPT 108{ 109#ifdef ELAST 110 if (ev > ELAST) 111 return error_condition(ev, system_category()); 112#endif // ELAST 113 return error_condition(ev, generic_category()); 114} 115 116const error_category& 117system_category() _NOEXCEPT 118{ 119 static __system_error_category s; 120 return s; 121} 122 123// error_condition 124 125string 126error_condition::message() const 127{ 128 return __cat_->message(__val_); 129} 130 131// error_code 132 133string 134error_code::message() const 135{ 136 return __cat_->message(__val_); 137} 138 139// system_error 140 141string 142system_error::__init(const error_code& ec, string what_arg) 143{ 144 if (ec) 145 { 146 if (!what_arg.empty()) 147 what_arg += ": "; 148 what_arg += ec.message(); 149 } 150 return _VSTD::move(what_arg); 151} 152 153system_error::system_error(error_code ec, const string& what_arg) 154 : runtime_error(__init(ec, what_arg)), 155 __ec_(ec) 156{ 157} 158 159system_error::system_error(error_code ec, const char* what_arg) 160 : runtime_error(__init(ec, what_arg)), 161 __ec_(ec) 162{ 163} 164 165system_error::system_error(error_code ec) 166 : runtime_error(__init(ec, "")), 167 __ec_(ec) 168{ 169} 170 171system_error::system_error(int ev, const error_category& ecat, const string& what_arg) 172 : runtime_error(__init(error_code(ev, ecat), what_arg)), 173 __ec_(error_code(ev, ecat)) 174{ 175} 176 177system_error::system_error(int ev, const error_category& ecat, const char* what_arg) 178 : runtime_error(__init(error_code(ev, ecat), what_arg)), 179 __ec_(error_code(ev, ecat)) 180{ 181} 182 183system_error::system_error(int ev, const error_category& ecat) 184 : runtime_error(__init(error_code(ev, ecat), "")), 185 __ec_(error_code(ev, ecat)) 186{ 187} 188 189system_error::~system_error() _NOEXCEPT 190{ 191} 192 193void 194__throw_system_error(int ev, const char* what_arg) 195{ 196#ifndef _LIBCPP_NO_EXCEPTIONS 197 throw system_error(error_code(ev, system_category()), what_arg); 198#else 199 (void)ev; 200 (void)what_arg; 201#endif 202} 203 204_LIBCPP_END_NAMESPACE_STD 205