1 // <system_error> implementation file 2 3 // Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 26 #include <cstring> 27 #include <system_error> 28 #include <bits/functexcept.h> 29 #include <limits> 30 31 namespace 32 { 33 using std::string; 34 35 struct generic_error_category : public std::error_category 36 { 37 virtual const char* 38 name() const noexcept 39 { return "generic"; } 40 41 virtual string 42 message(int i) const 43 { 44 // XXX locale issues: how does one get or set loc. 45 // _GLIBCXX_HAVE_STRERROR_L, strerror_l(i, cloc) 46 return string(strerror(i)); 47 } 48 }; 49 50 struct system_error_category : public std::error_category 51 { 52 virtual const char* 53 name() const noexcept 54 { return "system"; } 55 56 virtual string 57 message(int i) const 58 { 59 // XXX locale issues: how does one get or set loc. 60 // _GLIBCXX_HAVE_STRERROR_L, strerror_l(i, cloc) 61 return string(strerror(i)); 62 } 63 }; 64 65 const generic_error_category generic_category_instance{}; 66 const system_error_category system_category_instance{}; 67 } 68 69 namespace std _GLIBCXX_VISIBILITY(default) 70 { 71 _GLIBCXX_BEGIN_NAMESPACE_VERSION 72 73 error_category::error_category() noexcept = default; 74 75 error_category::~error_category() noexcept = default; 76 77 const error_category& 78 system_category() noexcept { return system_category_instance; } 79 80 const error_category& 81 generic_category() noexcept { return generic_category_instance; } 82 83 system_error::~system_error() noexcept = default; 84 85 error_condition 86 error_category::default_error_condition(int __i) const noexcept 87 { return error_condition(__i, *this); } 88 89 bool 90 error_category::equivalent(int __i, 91 const error_condition& __cond) const noexcept 92 { return default_error_condition(__i) == __cond; } 93 94 bool 95 error_category::equivalent(const error_code& __code, int __i) const noexcept 96 { return *this == __code.category() && __code.value() == __i; } 97 98 error_condition 99 error_code::default_error_condition() const noexcept 100 { return category().default_error_condition(value()); } 101 102 _GLIBCXX_END_NAMESPACE_VERSION 103 } // namespace 104