]>
Commit | Line | Data |
---|---|---|
0646d8a3 BK |
1 | // <system_error> implementation file |
2 | ||
5624e564 | 3 | // Copyright (C) 2007-2015 Free Software Foundation, Inc. |
0646d8a3 BK |
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 | |
748086b7 | 8 | // Free Software Foundation; either version 3, or (at your option) |
0646d8a3 BK |
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 | ||
748086b7 JJ |
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/>. | |
0646d8a3 | 24 | |
0646d8a3 | 25 | |
34a2b755 JW |
26 | #define _GLIBCXX_USE_CXX11_ABI 1 |
27 | #define __sso_string __sso_stringxxx | |
0646d8a3 BK |
28 | #include <cstring> |
29 | #include <system_error> | |
30 | #include <bits/functexcept.h> | |
31 | #include <limits> | |
34a2b755 | 32 | #undef __sso_string |
0646d8a3 BK |
33 | |
34 | namespace | |
35 | { | |
70593ad2 | 36 | using std::string; |
92010a79 CF |
37 | |
38 | struct generic_error_category : public std::error_category | |
0646d8a3 | 39 | { |
70593ad2 | 40 | virtual const char* |
cd88bb8c | 41 | name() const noexcept |
92010a79 | 42 | { return "generic"; } |
0646d8a3 | 43 | |
70593ad2 BK |
44 | virtual string |
45 | message(int i) const | |
0646d8a3 | 46 | { |
70593ad2 BK |
47 | // XXX locale issues: how does one get or set loc. |
48 | // _GLIBCXX_HAVE_STRERROR_L, strerror_l(i, cloc) | |
49 | return string(strerror(i)); | |
0646d8a3 BK |
50 | } |
51 | }; | |
52 | ||
92010a79 CF |
53 | struct system_error_category : public std::error_category |
54 | { | |
55 | virtual const char* | |
cd88bb8c | 56 | name() const noexcept |
92010a79 | 57 | { return "system"; } |
0646d8a3 | 58 | |
92010a79 CF |
59 | virtual string |
60 | message(int i) const | |
61 | { | |
62 | // XXX locale issues: how does one get or set loc. | |
63 | // _GLIBCXX_HAVE_STRERROR_L, strerror_l(i, cloc) | |
64 | return string(strerror(i)); | |
65 | } | |
66 | }; | |
0646d8a3 | 67 | |
1cbe724c ES |
68 | const generic_error_category generic_category_instance{}; |
69 | const system_error_category system_category_instance{}; | |
92010a79 | 70 | } |
70593ad2 | 71 | |
12ffa228 BK |
72 | namespace std _GLIBCXX_VISIBILITY(default) |
73 | { | |
74 | _GLIBCXX_BEGIN_NAMESPACE_VERSION | |
0646d8a3 | 75 | |
cd88bb8c | 76 | error_category::~error_category() noexcept = default; |
e9599233 | 77 | |
9b3003d5 | 78 | const error_category& |
34a2b755 | 79 | _V2::system_category() noexcept { return system_category_instance; } |
9b3003d5 BK |
80 | |
81 | const error_category& | |
34a2b755 | 82 | _V2::generic_category() noexcept { return generic_category_instance; } |
92010a79 | 83 | |
cd88bb8c | 84 | system_error::~system_error() noexcept = default; |
0646d8a3 | 85 | |
70593ad2 | 86 | error_condition |
cd88bb8c | 87 | error_category::default_error_condition(int __i) const noexcept |
70593ad2 BK |
88 | { return error_condition(__i, *this); } |
89 | ||
90 | bool | |
cd88bb8c PC |
91 | error_category::equivalent(int __i, |
92 | const error_condition& __cond) const noexcept | |
70593ad2 BK |
93 | { return default_error_condition(__i) == __cond; } |
94 | ||
95 | bool | |
cd88bb8c | 96 | error_category::equivalent(const error_code& __code, int __i) const noexcept |
70593ad2 BK |
97 | { return *this == __code.category() && __code.value() == __i; } |
98 | ||
99 | error_condition | |
cd88bb8c | 100 | error_code::default_error_condition() const noexcept |
70593ad2 BK |
101 | { return category().default_error_condition(value()); } |
102 | ||
34a2b755 JW |
103 | #if _GLIBCXX_USE_CXX11_ABI |
104 | // Return error_category::message() as a COW string | |
105 | __cow_string | |
106 | error_category::_M_message(int i) const | |
107 | { | |
108 | string msg = this->message(i); | |
109 | return {msg.c_str(), msg.length()}; | |
110 | } | |
111 | #endif | |
112 | ||
113 | #if _GLIBCXX_USE_DUAL_ABI | |
114 | // Redefine __sso_string so that we can define and export its members | |
115 | // in terms of the SSO std::string. | |
116 | struct __sso_string | |
117 | { | |
118 | struct __str | |
119 | { | |
120 | const char* _M_p; | |
121 | size_t _M_string_length; | |
122 | char _M_local_buf[16]; | |
123 | }; | |
124 | ||
125 | union { | |
126 | __str _M_s; | |
127 | char _M_bytes[sizeof(_M_s)]; | |
128 | std::string _M_str; | |
129 | }; | |
130 | ||
131 | __sso_string(); | |
132 | __sso_string(const std::string& s); | |
133 | __sso_string(const char*, size_t n); | |
134 | __sso_string(const __sso_string&) noexcept; | |
135 | __sso_string& operator=(const __sso_string&) noexcept; | |
136 | ~__sso_string(); | |
137 | __sso_string(__sso_string&&) noexcept; | |
138 | __sso_string& operator=(__sso_string&&) noexcept; | |
139 | }; | |
140 | ||
141 | __sso_string::__sso_string() : _M_str() { } | |
142 | ||
143 | #if _GLIBCXX_USE_CXX11_ABI | |
144 | static_assert(sizeof(__sso_string) == sizeof(std::string), | |
145 | "sizeof(std::string) has changed"); | |
146 | static_assert(alignof(__sso_string) == alignof(std::string), | |
147 | "alignof(std::string) has changed"); | |
148 | ||
149 | // This constructor is defined in src/c++11/cow-stdexcept.cc for COW strings | |
150 | __sso_string::__sso_string(const std::string& s) : _M_str(s) { } | |
151 | #endif | |
152 | ||
153 | __sso_string::__sso_string(const char* s, size_t n) : _M_str(s, n) { } | |
154 | ||
155 | __sso_string::__sso_string(const __sso_string& s) noexcept | |
156 | : _M_str(s._M_str) { } | |
157 | ||
158 | __sso_string& | |
159 | __sso_string::operator=(const __sso_string& s) noexcept | |
160 | { | |
161 | _M_str = s._M_str; | |
162 | return *this; | |
163 | } | |
164 | ||
165 | __sso_string::~__sso_string() { _M_str.~basic_string(); } | |
166 | ||
167 | __sso_string::__sso_string(__sso_string&& s) noexcept | |
168 | : _M_str(std::move(s._M_str)) { } | |
169 | ||
170 | __sso_string& | |
171 | __sso_string::operator=(__sso_string&& s) noexcept | |
172 | { | |
173 | _M_str = std::move(s._M_str); | |
174 | return *this; | |
175 | } | |
176 | #endif // _GLIBCXX_USE_DUAL_ABI | |
177 | ||
12ffa228 BK |
178 | _GLIBCXX_END_NAMESPACE_VERSION |
179 | } // namespace |