1227825Stheraven//===---------------------- system_error.cpp ------------------------------===// 2227825Stheraven// 3227825Stheraven// The LLVM Compiler Infrastructure 4227825Stheraven// 5227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open 6227825Stheraven// Source Licenses. See LICENSE.TXT for details. 7227825Stheraven// 8227825Stheraven//===----------------------------------------------------------------------===// 9227825Stheraven 10227825Stheraven#include "system_error" 11227825Stheraven#include "string" 12227825Stheraven#include "cstring" 13227825Stheraven 14227825Stheraven_LIBCPP_BEGIN_NAMESPACE_STD 15227825Stheraven 16227825Stheraven// class error_category 17227825Stheraven 18227825Stheravenerror_category::error_category() _NOEXCEPT 19227825Stheraven{ 20227825Stheraven} 21227825Stheraven 22227825Stheravenerror_category::~error_category() _NOEXCEPT 23227825Stheraven{ 24227825Stheraven} 25227825Stheraven 26227825Stheravenerror_condition 27227825Stheravenerror_category::default_error_condition(int ev) const _NOEXCEPT 28227825Stheraven{ 29227825Stheraven return error_condition(ev, *this); 30227825Stheraven} 31227825Stheraven 32227825Stheravenbool 33227825Stheravenerror_category::equivalent(int code, const error_condition& condition) const _NOEXCEPT 34227825Stheraven{ 35227825Stheraven return default_error_condition(code) == condition; 36227825Stheraven} 37227825Stheraven 38227825Stheravenbool 39227825Stheravenerror_category::equivalent(const error_code& code, int condition) const _NOEXCEPT 40227825Stheraven{ 41227825Stheraven return *this == code.category() && code.value() == condition; 42227825Stheraven} 43227825Stheraven 44227825Stheravenstring 45227825Stheraven__do_message::message(int ev) const 46227825Stheraven{ 47227825Stheraven return string(strerror(ev)); 48227825Stheraven} 49227825Stheraven 50227825Stheravenclass _LIBCPP_HIDDEN __generic_error_category 51227825Stheraven : public __do_message 52227825Stheraven{ 53227825Stheravenpublic: 54227825Stheraven virtual const char* name() const _NOEXCEPT; 55227825Stheraven virtual string message(int ev) const; 56227825Stheraven}; 57227825Stheraven 58227825Stheravenconst char* 59227825Stheraven__generic_error_category::name() const _NOEXCEPT 60227825Stheraven{ 61227825Stheraven return "generic"; 62227825Stheraven} 63227825Stheraven 64227825Stheravenstring 65227825Stheraven__generic_error_category::message(int ev) const 66227825Stheraven{ 67227825Stheraven#ifdef ELAST 68227825Stheraven if (ev > ELAST) 69227825Stheraven return string("unspecified generic_category error"); 70227825Stheraven#endif // ELAST 71227825Stheraven return __do_message::message(ev); 72227825Stheraven} 73227825Stheraven 74227825Stheravenconst error_category& 75227825Stheravengeneric_category() _NOEXCEPT 76227825Stheraven{ 77227825Stheraven static __generic_error_category s; 78227825Stheraven return s; 79227825Stheraven} 80227825Stheraven 81227825Stheravenclass _LIBCPP_HIDDEN __system_error_category 82227825Stheraven : public __do_message 83227825Stheraven{ 84227825Stheravenpublic: 85227825Stheraven virtual const char* name() const _NOEXCEPT; 86227825Stheraven virtual string message(int ev) const; 87227825Stheraven virtual error_condition default_error_condition(int ev) const _NOEXCEPT; 88227825Stheraven}; 89227825Stheraven 90227825Stheravenconst char* 91227825Stheraven__system_error_category::name() const _NOEXCEPT 92227825Stheraven{ 93227825Stheraven return "system"; 94227825Stheraven} 95227825Stheraven 96227825Stheravenstring 97227825Stheraven__system_error_category::message(int ev) const 98227825Stheraven{ 99227825Stheraven#ifdef ELAST 100227825Stheraven if (ev > ELAST) 101227825Stheraven return string("unspecified system_category error"); 102227825Stheraven#endif // ELAST 103227825Stheraven return __do_message::message(ev); 104227825Stheraven} 105227825Stheraven 106227825Stheravenerror_condition 107227825Stheraven__system_error_category::default_error_condition(int ev) const _NOEXCEPT 108227825Stheraven{ 109227825Stheraven#ifdef ELAST 110227825Stheraven if (ev > ELAST) 111227825Stheraven return error_condition(ev, system_category()); 112227825Stheraven#endif // ELAST 113227825Stheraven return error_condition(ev, generic_category()); 114227825Stheraven} 115227825Stheraven 116227825Stheravenconst error_category& 117227825Stheravensystem_category() _NOEXCEPT 118227825Stheraven{ 119227825Stheraven static __system_error_category s; 120227825Stheraven return s; 121227825Stheraven} 122227825Stheraven 123227825Stheraven// error_condition 124227825Stheraven 125227825Stheravenstring 126227825Stheravenerror_condition::message() const 127227825Stheraven{ 128227825Stheraven return __cat_->message(__val_); 129227825Stheraven} 130227825Stheraven 131227825Stheraven// error_code 132227825Stheraven 133227825Stheravenstring 134227825Stheravenerror_code::message() const 135227825Stheraven{ 136227825Stheraven return __cat_->message(__val_); 137227825Stheraven} 138227825Stheraven 139227825Stheraven// system_error 140227825Stheraven 141227825Stheravenstring 142227825Stheravensystem_error::__init(const error_code& ec, string what_arg) 143227825Stheraven{ 144227825Stheraven if (ec) 145227825Stheraven { 146227825Stheraven if (!what_arg.empty()) 147227825Stheraven what_arg += ": "; 148227825Stheraven what_arg += ec.message(); 149227825Stheraven } 150227825Stheraven return _VSTD::move(what_arg); 151227825Stheraven} 152227825Stheraven 153227825Stheravensystem_error::system_error(error_code ec, const string& what_arg) 154227825Stheraven : runtime_error(__init(ec, what_arg)), 155227825Stheraven __ec_(ec) 156227825Stheraven{ 157227825Stheraven} 158227825Stheraven 159227825Stheravensystem_error::system_error(error_code ec, const char* what_arg) 160227825Stheraven : runtime_error(__init(ec, what_arg)), 161227825Stheraven __ec_(ec) 162227825Stheraven{ 163227825Stheraven} 164227825Stheraven 165227825Stheravensystem_error::system_error(error_code ec) 166227825Stheraven : runtime_error(__init(ec, "")), 167227825Stheraven __ec_(ec) 168227825Stheraven{ 169227825Stheraven} 170227825Stheraven 171227825Stheravensystem_error::system_error(int ev, const error_category& ecat, const string& what_arg) 172227825Stheraven : runtime_error(__init(error_code(ev, ecat), what_arg)), 173227825Stheraven __ec_(error_code(ev, ecat)) 174227825Stheraven{ 175227825Stheraven} 176227825Stheraven 177227825Stheravensystem_error::system_error(int ev, const error_category& ecat, const char* what_arg) 178227825Stheraven : runtime_error(__init(error_code(ev, ecat), what_arg)), 179227825Stheraven __ec_(error_code(ev, ecat)) 180227825Stheraven{ 181227825Stheraven} 182227825Stheraven 183227825Stheravensystem_error::system_error(int ev, const error_category& ecat) 184227825Stheraven : runtime_error(__init(error_code(ev, ecat), "")), 185227825Stheraven __ec_(error_code(ev, ecat)) 186227825Stheraven{ 187227825Stheraven} 188227825Stheraven 189227825Stheravensystem_error::~system_error() _NOEXCEPT 190227825Stheraven{ 191227825Stheraven} 192227825Stheraven 193227825Stheravenvoid 194227825Stheraven__throw_system_error(int ev, const char* what_arg) 195227825Stheraven{ 196227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 197227825Stheraven throw system_error(error_code(ev, system_category()), what_arg); 198249998Sdim#else 199249998Sdim (void)ev; 200249998Sdim (void)what_arg; 201227825Stheraven#endif 202227825Stheraven} 203227825Stheraven 204227825Stheraven_LIBCPP_END_NAMESPACE_STD 205