annotate libcxx/include/system_error @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children 0572611fdcc8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // -*- C++ -*-
anatofuz
parents:
diff changeset
2 //===---------------------------- system_error ----------------------------===//
anatofuz
parents:
diff changeset
3 //
anatofuz
parents:
diff changeset
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
5 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
7 //
anatofuz
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 #ifndef _LIBCPP_SYSTEM_ERROR
anatofuz
parents:
diff changeset
11 #define _LIBCPP_SYSTEM_ERROR
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 /*
anatofuz
parents:
diff changeset
14 system_error synopsis
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 namespace std
anatofuz
parents:
diff changeset
17 {
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 class error_category
anatofuz
parents:
diff changeset
20 {
anatofuz
parents:
diff changeset
21 public:
anatofuz
parents:
diff changeset
22 virtual ~error_category() noexcept;
anatofuz
parents:
diff changeset
23
anatofuz
parents:
diff changeset
24 constexpr error_category();
anatofuz
parents:
diff changeset
25 error_category(const error_category&) = delete;
anatofuz
parents:
diff changeset
26 error_category& operator=(const error_category&) = delete;
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 virtual const char* name() const noexcept = 0;
anatofuz
parents:
diff changeset
29 virtual error_condition default_error_condition(int ev) const noexcept;
anatofuz
parents:
diff changeset
30 virtual bool equivalent(int code, const error_condition& condition) const noexcept;
anatofuz
parents:
diff changeset
31 virtual bool equivalent(const error_code& code, int condition) const noexcept;
anatofuz
parents:
diff changeset
32 virtual string message(int ev) const = 0;
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 bool operator==(const error_category& rhs) const noexcept;
anatofuz
parents:
diff changeset
35 bool operator!=(const error_category& rhs) const noexcept;
anatofuz
parents:
diff changeset
36 bool operator<(const error_category& rhs) const noexcept;
anatofuz
parents:
diff changeset
37 };
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 const error_category& generic_category() noexcept;
anatofuz
parents:
diff changeset
40 const error_category& system_category() noexcept;
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 template <class T> struct is_error_code_enum
anatofuz
parents:
diff changeset
43 : public false_type {};
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 template <class T> struct is_error_condition_enum
anatofuz
parents:
diff changeset
46 : public false_type {};
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 template <class _Tp>
anatofuz
parents:
diff changeset
49 inline constexpr size_t is_error_condition_enum_v = is_error_condition_enum<_Tp>::value; // C++17
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 template <class _Tp>
anatofuz
parents:
diff changeset
52 inline constexpr size_t is_error_code_enum_v = is_error_code_enum<_Tp>::value; // C++17
anatofuz
parents:
diff changeset
53
anatofuz
parents:
diff changeset
54 class error_code
anatofuz
parents:
diff changeset
55 {
anatofuz
parents:
diff changeset
56 public:
anatofuz
parents:
diff changeset
57 // constructors:
anatofuz
parents:
diff changeset
58 error_code() noexcept;
anatofuz
parents:
diff changeset
59 error_code(int val, const error_category& cat) noexcept;
anatofuz
parents:
diff changeset
60 template <class ErrorCodeEnum>
anatofuz
parents:
diff changeset
61 error_code(ErrorCodeEnum e) noexcept;
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 // modifiers:
anatofuz
parents:
diff changeset
64 void assign(int val, const error_category& cat) noexcept;
anatofuz
parents:
diff changeset
65 template <class ErrorCodeEnum>
anatofuz
parents:
diff changeset
66 error_code& operator=(ErrorCodeEnum e) noexcept;
anatofuz
parents:
diff changeset
67 void clear() noexcept;
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 // observers:
anatofuz
parents:
diff changeset
70 int value() const noexcept;
anatofuz
parents:
diff changeset
71 const error_category& category() const noexcept;
anatofuz
parents:
diff changeset
72 error_condition default_error_condition() const noexcept;
anatofuz
parents:
diff changeset
73 string message() const;
anatofuz
parents:
diff changeset
74 explicit operator bool() const noexcept;
anatofuz
parents:
diff changeset
75 };
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 // non-member functions:
anatofuz
parents:
diff changeset
78 bool operator<(const error_code& lhs, const error_code& rhs) noexcept;
anatofuz
parents:
diff changeset
79 template <class charT, class traits>
anatofuz
parents:
diff changeset
80 basic_ostream<charT,traits>&
anatofuz
parents:
diff changeset
81 operator<<(basic_ostream<charT,traits>& os, const error_code& ec);
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 class error_condition
anatofuz
parents:
diff changeset
84 {
anatofuz
parents:
diff changeset
85 public:
anatofuz
parents:
diff changeset
86 // constructors:
anatofuz
parents:
diff changeset
87 error_condition() noexcept;
anatofuz
parents:
diff changeset
88 error_condition(int val, const error_category& cat) noexcept;
anatofuz
parents:
diff changeset
89 template <class ErrorConditionEnum>
anatofuz
parents:
diff changeset
90 error_condition(ErrorConditionEnum e) noexcept;
anatofuz
parents:
diff changeset
91
anatofuz
parents:
diff changeset
92 // modifiers:
anatofuz
parents:
diff changeset
93 void assign(int val, const error_category& cat) noexcept;
anatofuz
parents:
diff changeset
94 template <class ErrorConditionEnum>
anatofuz
parents:
diff changeset
95 error_condition& operator=(ErrorConditionEnum e) noexcept;
anatofuz
parents:
diff changeset
96 void clear() noexcept;
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 // observers:
anatofuz
parents:
diff changeset
99 int value() const noexcept;
anatofuz
parents:
diff changeset
100 const error_category& category() const noexcept;
anatofuz
parents:
diff changeset
101 string message() const noexcept;
anatofuz
parents:
diff changeset
102 explicit operator bool() const noexcept;
anatofuz
parents:
diff changeset
103 };
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 bool operator<(const error_condition& lhs, const error_condition& rhs) noexcept;
anatofuz
parents:
diff changeset
106
anatofuz
parents:
diff changeset
107 class system_error
anatofuz
parents:
diff changeset
108 : public runtime_error
anatofuz
parents:
diff changeset
109 {
anatofuz
parents:
diff changeset
110 public:
anatofuz
parents:
diff changeset
111 system_error(error_code ec, const string& what_arg);
anatofuz
parents:
diff changeset
112 system_error(error_code ec, const char* what_arg);
anatofuz
parents:
diff changeset
113 system_error(error_code ec);
anatofuz
parents:
diff changeset
114 system_error(int ev, const error_category& ecat, const string& what_arg);
anatofuz
parents:
diff changeset
115 system_error(int ev, const error_category& ecat, const char* what_arg);
anatofuz
parents:
diff changeset
116 system_error(int ev, const error_category& ecat);
anatofuz
parents:
diff changeset
117
anatofuz
parents:
diff changeset
118 const error_code& code() const noexcept;
anatofuz
parents:
diff changeset
119 const char* what() const noexcept;
anatofuz
parents:
diff changeset
120 };
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 template <> struct is_error_condition_enum<errc>
anatofuz
parents:
diff changeset
123 : true_type { }
anatofuz
parents:
diff changeset
124
anatofuz
parents:
diff changeset
125 error_code make_error_code(errc e) noexcept;
anatofuz
parents:
diff changeset
126 error_condition make_error_condition(errc e) noexcept;
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 // Comparison operators:
anatofuz
parents:
diff changeset
129 bool operator==(const error_code& lhs, const error_code& rhs) noexcept;
anatofuz
parents:
diff changeset
130 bool operator==(const error_code& lhs, const error_condition& rhs) noexcept;
anatofuz
parents:
diff changeset
131 bool operator==(const error_condition& lhs, const error_code& rhs) noexcept;
anatofuz
parents:
diff changeset
132 bool operator==(const error_condition& lhs, const error_condition& rhs) noexcept;
anatofuz
parents:
diff changeset
133 bool operator!=(const error_code& lhs, const error_code& rhs) noexcept;
anatofuz
parents:
diff changeset
134 bool operator!=(const error_code& lhs, const error_condition& rhs) noexcept;
anatofuz
parents:
diff changeset
135 bool operator!=(const error_condition& lhs, const error_code& rhs) noexcept;
anatofuz
parents:
diff changeset
136 bool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept;
anatofuz
parents:
diff changeset
137
anatofuz
parents:
diff changeset
138 template <> struct hash<std::error_code>;
anatofuz
parents:
diff changeset
139 template <> struct hash<std::error_condition>;
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 } // std
anatofuz
parents:
diff changeset
142
anatofuz
parents:
diff changeset
143 */
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 #include <__errc>
anatofuz
parents:
diff changeset
146 #include <type_traits>
anatofuz
parents:
diff changeset
147 #include <stdexcept>
anatofuz
parents:
diff changeset
148 #include <__functional_base>
anatofuz
parents:
diff changeset
149 #include <string>
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
anatofuz
parents:
diff changeset
152 #pragma GCC system_header
anatofuz
parents:
diff changeset
153 #endif
anatofuz
parents:
diff changeset
154
anatofuz
parents:
diff changeset
155 _LIBCPP_BEGIN_NAMESPACE_STD
anatofuz
parents:
diff changeset
156
anatofuz
parents:
diff changeset
157 // is_error_code_enum
anatofuz
parents:
diff changeset
158
anatofuz
parents:
diff changeset
159 template <class _Tp>
anatofuz
parents:
diff changeset
160 struct _LIBCPP_TEMPLATE_VIS is_error_code_enum
anatofuz
parents:
diff changeset
161 : public false_type {};
anatofuz
parents:
diff changeset
162
anatofuz
parents:
diff changeset
163 #if _LIBCPP_STD_VER > 14
anatofuz
parents:
diff changeset
164 template <class _Tp>
anatofuz
parents:
diff changeset
165 _LIBCPP_INLINE_VAR constexpr size_t is_error_code_enum_v = is_error_code_enum<_Tp>::value;
anatofuz
parents:
diff changeset
166 #endif
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 // is_error_condition_enum
anatofuz
parents:
diff changeset
169
anatofuz
parents:
diff changeset
170 template <class _Tp>
anatofuz
parents:
diff changeset
171 struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum
anatofuz
parents:
diff changeset
172 : public false_type {};
anatofuz
parents:
diff changeset
173
anatofuz
parents:
diff changeset
174 #if _LIBCPP_STD_VER > 14
anatofuz
parents:
diff changeset
175 template <class _Tp>
anatofuz
parents:
diff changeset
176 _LIBCPP_INLINE_VAR constexpr size_t is_error_condition_enum_v = is_error_condition_enum<_Tp>::value;
anatofuz
parents:
diff changeset
177 #endif
anatofuz
parents:
diff changeset
178
anatofuz
parents:
diff changeset
179 template <>
anatofuz
parents:
diff changeset
180 struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum<errc>
anatofuz
parents:
diff changeset
181 : true_type { };
anatofuz
parents:
diff changeset
182
anatofuz
parents:
diff changeset
183 #ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
anatofuz
parents:
diff changeset
184 template <>
anatofuz
parents:
diff changeset
185 struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum<errc::__lx>
anatofuz
parents:
diff changeset
186 : true_type { };
anatofuz
parents:
diff changeset
187 #endif
anatofuz
parents:
diff changeset
188
anatofuz
parents:
diff changeset
189 class _LIBCPP_TYPE_VIS error_condition;
anatofuz
parents:
diff changeset
190 class _LIBCPP_TYPE_VIS error_code;
anatofuz
parents:
diff changeset
191
anatofuz
parents:
diff changeset
192 // class error_category
anatofuz
parents:
diff changeset
193
anatofuz
parents:
diff changeset
194 class _LIBCPP_HIDDEN __do_message;
anatofuz
parents:
diff changeset
195
anatofuz
parents:
diff changeset
196 class _LIBCPP_TYPE_VIS error_category
anatofuz
parents:
diff changeset
197 {
anatofuz
parents:
diff changeset
198 public:
anatofuz
parents:
diff changeset
199 virtual ~error_category() _NOEXCEPT;
anatofuz
parents:
diff changeset
200
anatofuz
parents:
diff changeset
201 #if defined(_LIBCPP_BUILDING_LIBRARY) && \
anatofuz
parents:
diff changeset
202 defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS)
anatofuz
parents:
diff changeset
203 error_category() _NOEXCEPT;
anatofuz
parents:
diff changeset
204 #else
anatofuz
parents:
diff changeset
205 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
206 _LIBCPP_CONSTEXPR_AFTER_CXX11 error_category() _NOEXCEPT _LIBCPP_DEFAULT
anatofuz
parents:
diff changeset
207 #endif
anatofuz
parents:
diff changeset
208 private:
anatofuz
parents:
diff changeset
209 error_category(const error_category&);// = delete;
anatofuz
parents:
diff changeset
210 error_category& operator=(const error_category&);// = delete;
anatofuz
parents:
diff changeset
211
anatofuz
parents:
diff changeset
212 public:
anatofuz
parents:
diff changeset
213 virtual const char* name() const _NOEXCEPT = 0;
anatofuz
parents:
diff changeset
214 virtual error_condition default_error_condition(int __ev) const _NOEXCEPT;
anatofuz
parents:
diff changeset
215 virtual bool equivalent(int __code, const error_condition& __condition) const _NOEXCEPT;
anatofuz
parents:
diff changeset
216 virtual bool equivalent(const error_code& __code, int __condition) const _NOEXCEPT;
anatofuz
parents:
diff changeset
217 virtual string message(int __ev) const = 0;
anatofuz
parents:
diff changeset
218
anatofuz
parents:
diff changeset
219 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
220 bool operator==(const error_category& __rhs) const _NOEXCEPT {return this == &__rhs;}
anatofuz
parents:
diff changeset
221
anatofuz
parents:
diff changeset
222 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
223 bool operator!=(const error_category& __rhs) const _NOEXCEPT {return !(*this == __rhs);}
anatofuz
parents:
diff changeset
224
anatofuz
parents:
diff changeset
225 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
226 bool operator< (const error_category& __rhs) const _NOEXCEPT {return this < &__rhs;}
anatofuz
parents:
diff changeset
227
anatofuz
parents:
diff changeset
228 friend class _LIBCPP_HIDDEN __do_message;
anatofuz
parents:
diff changeset
229 };
anatofuz
parents:
diff changeset
230
anatofuz
parents:
diff changeset
231 class _LIBCPP_HIDDEN __do_message
anatofuz
parents:
diff changeset
232 : public error_category
anatofuz
parents:
diff changeset
233 {
anatofuz
parents:
diff changeset
234 public:
anatofuz
parents:
diff changeset
235 virtual string message(int ev) const;
anatofuz
parents:
diff changeset
236 };
anatofuz
parents:
diff changeset
237
anatofuz
parents:
diff changeset
238 _LIBCPP_FUNC_VIS const error_category& generic_category() _NOEXCEPT;
anatofuz
parents:
diff changeset
239 _LIBCPP_FUNC_VIS const error_category& system_category() _NOEXCEPT;
anatofuz
parents:
diff changeset
240
anatofuz
parents:
diff changeset
241 class _LIBCPP_TYPE_VIS error_condition
anatofuz
parents:
diff changeset
242 {
anatofuz
parents:
diff changeset
243 int __val_;
anatofuz
parents:
diff changeset
244 const error_category* __cat_;
anatofuz
parents:
diff changeset
245 public:
anatofuz
parents:
diff changeset
246 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
247 error_condition() _NOEXCEPT : __val_(0), __cat_(&generic_category()) {}
anatofuz
parents:
diff changeset
248
anatofuz
parents:
diff changeset
249 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
250 error_condition(int __val, const error_category& __cat) _NOEXCEPT
anatofuz
parents:
diff changeset
251 : __val_(__val), __cat_(&__cat) {}
anatofuz
parents:
diff changeset
252
anatofuz
parents:
diff changeset
253 template <class _Ep>
anatofuz
parents:
diff changeset
254 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
255 error_condition(_Ep __e,
anatofuz
parents:
diff changeset
256 typename enable_if<is_error_condition_enum<_Ep>::value>::type* = 0
anatofuz
parents:
diff changeset
257 ) _NOEXCEPT
anatofuz
parents:
diff changeset
258 {*this = make_error_condition(__e);}
anatofuz
parents:
diff changeset
259
anatofuz
parents:
diff changeset
260 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
261 void assign(int __val, const error_category& __cat) _NOEXCEPT
anatofuz
parents:
diff changeset
262 {
anatofuz
parents:
diff changeset
263 __val_ = __val;
anatofuz
parents:
diff changeset
264 __cat_ = &__cat;
anatofuz
parents:
diff changeset
265 }
anatofuz
parents:
diff changeset
266
anatofuz
parents:
diff changeset
267 template <class _Ep>
anatofuz
parents:
diff changeset
268 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
269 typename enable_if
anatofuz
parents:
diff changeset
270 <
anatofuz
parents:
diff changeset
271 is_error_condition_enum<_Ep>::value,
anatofuz
parents:
diff changeset
272 error_condition&
anatofuz
parents:
diff changeset
273 >::type
anatofuz
parents:
diff changeset
274 operator=(_Ep __e) _NOEXCEPT
anatofuz
parents:
diff changeset
275 {*this = make_error_condition(__e); return *this;}
anatofuz
parents:
diff changeset
276
anatofuz
parents:
diff changeset
277 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
278 void clear() _NOEXCEPT
anatofuz
parents:
diff changeset
279 {
anatofuz
parents:
diff changeset
280 __val_ = 0;
anatofuz
parents:
diff changeset
281 __cat_ = &generic_category();
anatofuz
parents:
diff changeset
282 }
anatofuz
parents:
diff changeset
283
anatofuz
parents:
diff changeset
284 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
285 int value() const _NOEXCEPT {return __val_;}
anatofuz
parents:
diff changeset
286
anatofuz
parents:
diff changeset
287 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
288 const error_category& category() const _NOEXCEPT {return *__cat_;}
anatofuz
parents:
diff changeset
289 string message() const;
anatofuz
parents:
diff changeset
290
anatofuz
parents:
diff changeset
291 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
292 _LIBCPP_EXPLICIT
anatofuz
parents:
diff changeset
293 operator bool() const _NOEXCEPT {return __val_ != 0;}
anatofuz
parents:
diff changeset
294 };
anatofuz
parents:
diff changeset
295
anatofuz
parents:
diff changeset
296 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
297 error_condition
anatofuz
parents:
diff changeset
298 make_error_condition(errc __e) _NOEXCEPT
anatofuz
parents:
diff changeset
299 {
anatofuz
parents:
diff changeset
300 return error_condition(static_cast<int>(__e), generic_category());
anatofuz
parents:
diff changeset
301 }
anatofuz
parents:
diff changeset
302
anatofuz
parents:
diff changeset
303 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
304 bool
anatofuz
parents:
diff changeset
305 operator<(const error_condition& __x, const error_condition& __y) _NOEXCEPT
anatofuz
parents:
diff changeset
306 {
anatofuz
parents:
diff changeset
307 return __x.category() < __y.category()
anatofuz
parents:
diff changeset
308 || (__x.category() == __y.category() && __x.value() < __y.value());
anatofuz
parents:
diff changeset
309 }
anatofuz
parents:
diff changeset
310
anatofuz
parents:
diff changeset
311 // error_code
anatofuz
parents:
diff changeset
312
anatofuz
parents:
diff changeset
313 class _LIBCPP_TYPE_VIS error_code
anatofuz
parents:
diff changeset
314 {
anatofuz
parents:
diff changeset
315 int __val_;
anatofuz
parents:
diff changeset
316 const error_category* __cat_;
anatofuz
parents:
diff changeset
317 public:
anatofuz
parents:
diff changeset
318 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
319 error_code() _NOEXCEPT : __val_(0), __cat_(&system_category()) {}
anatofuz
parents:
diff changeset
320
anatofuz
parents:
diff changeset
321 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
322 error_code(int __val, const error_category& __cat) _NOEXCEPT
anatofuz
parents:
diff changeset
323 : __val_(__val), __cat_(&__cat) {}
anatofuz
parents:
diff changeset
324
anatofuz
parents:
diff changeset
325 template <class _Ep>
anatofuz
parents:
diff changeset
326 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
327 error_code(_Ep __e,
anatofuz
parents:
diff changeset
328 typename enable_if<is_error_code_enum<_Ep>::value>::type* = 0
anatofuz
parents:
diff changeset
329 ) _NOEXCEPT
anatofuz
parents:
diff changeset
330 {*this = make_error_code(__e);}
anatofuz
parents:
diff changeset
331
anatofuz
parents:
diff changeset
332 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
333 void assign(int __val, const error_category& __cat) _NOEXCEPT
anatofuz
parents:
diff changeset
334 {
anatofuz
parents:
diff changeset
335 __val_ = __val;
anatofuz
parents:
diff changeset
336 __cat_ = &__cat;
anatofuz
parents:
diff changeset
337 }
anatofuz
parents:
diff changeset
338
anatofuz
parents:
diff changeset
339 template <class _Ep>
anatofuz
parents:
diff changeset
340 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
341 typename enable_if
anatofuz
parents:
diff changeset
342 <
anatofuz
parents:
diff changeset
343 is_error_code_enum<_Ep>::value,
anatofuz
parents:
diff changeset
344 error_code&
anatofuz
parents:
diff changeset
345 >::type
anatofuz
parents:
diff changeset
346 operator=(_Ep __e) _NOEXCEPT
anatofuz
parents:
diff changeset
347 {*this = make_error_code(__e); return *this;}
anatofuz
parents:
diff changeset
348
anatofuz
parents:
diff changeset
349 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
350 void clear() _NOEXCEPT
anatofuz
parents:
diff changeset
351 {
anatofuz
parents:
diff changeset
352 __val_ = 0;
anatofuz
parents:
diff changeset
353 __cat_ = &system_category();
anatofuz
parents:
diff changeset
354 }
anatofuz
parents:
diff changeset
355
anatofuz
parents:
diff changeset
356 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
357 int value() const _NOEXCEPT {return __val_;}
anatofuz
parents:
diff changeset
358
anatofuz
parents:
diff changeset
359 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
360 const error_category& category() const _NOEXCEPT {return *__cat_;}
anatofuz
parents:
diff changeset
361
anatofuz
parents:
diff changeset
362 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
363 error_condition default_error_condition() const _NOEXCEPT
anatofuz
parents:
diff changeset
364 {return __cat_->default_error_condition(__val_);}
anatofuz
parents:
diff changeset
365
anatofuz
parents:
diff changeset
366 string message() const;
anatofuz
parents:
diff changeset
367
anatofuz
parents:
diff changeset
368 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
369 _LIBCPP_EXPLICIT
anatofuz
parents:
diff changeset
370 operator bool() const _NOEXCEPT {return __val_ != 0;}
anatofuz
parents:
diff changeset
371 };
anatofuz
parents:
diff changeset
372
anatofuz
parents:
diff changeset
373 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
374 error_code
anatofuz
parents:
diff changeset
375 make_error_code(errc __e) _NOEXCEPT
anatofuz
parents:
diff changeset
376 {
anatofuz
parents:
diff changeset
377 return error_code(static_cast<int>(__e), generic_category());
anatofuz
parents:
diff changeset
378 }
anatofuz
parents:
diff changeset
379
anatofuz
parents:
diff changeset
380 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
381 bool
anatofuz
parents:
diff changeset
382 operator<(const error_code& __x, const error_code& __y) _NOEXCEPT
anatofuz
parents:
diff changeset
383 {
anatofuz
parents:
diff changeset
384 return __x.category() < __y.category()
anatofuz
parents:
diff changeset
385 || (__x.category() == __y.category() && __x.value() < __y.value());
anatofuz
parents:
diff changeset
386 }
anatofuz
parents:
diff changeset
387
anatofuz
parents:
diff changeset
388 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
389 bool
anatofuz
parents:
diff changeset
390 operator==(const error_code& __x, const error_code& __y) _NOEXCEPT
anatofuz
parents:
diff changeset
391 {
anatofuz
parents:
diff changeset
392 return __x.category() == __y.category() && __x.value() == __y.value();
anatofuz
parents:
diff changeset
393 }
anatofuz
parents:
diff changeset
394
anatofuz
parents:
diff changeset
395 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
396 bool
anatofuz
parents:
diff changeset
397 operator==(const error_code& __x, const error_condition& __y) _NOEXCEPT
anatofuz
parents:
diff changeset
398 {
anatofuz
parents:
diff changeset
399 return __x.category().equivalent(__x.value(), __y)
anatofuz
parents:
diff changeset
400 || __y.category().equivalent(__x, __y.value());
anatofuz
parents:
diff changeset
401 }
anatofuz
parents:
diff changeset
402
anatofuz
parents:
diff changeset
403 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
404 bool
anatofuz
parents:
diff changeset
405 operator==(const error_condition& __x, const error_code& __y) _NOEXCEPT
anatofuz
parents:
diff changeset
406 {
anatofuz
parents:
diff changeset
407 return __y == __x;
anatofuz
parents:
diff changeset
408 }
anatofuz
parents:
diff changeset
409
anatofuz
parents:
diff changeset
410 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
411 bool
anatofuz
parents:
diff changeset
412 operator==(const error_condition& __x, const error_condition& __y) _NOEXCEPT
anatofuz
parents:
diff changeset
413 {
anatofuz
parents:
diff changeset
414 return __x.category() == __y.category() && __x.value() == __y.value();
anatofuz
parents:
diff changeset
415 }
anatofuz
parents:
diff changeset
416
anatofuz
parents:
diff changeset
417 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
418 bool
anatofuz
parents:
diff changeset
419 operator!=(const error_code& __x, const error_code& __y) _NOEXCEPT
anatofuz
parents:
diff changeset
420 {return !(__x == __y);}
anatofuz
parents:
diff changeset
421
anatofuz
parents:
diff changeset
422 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
423 bool
anatofuz
parents:
diff changeset
424 operator!=(const error_code& __x, const error_condition& __y) _NOEXCEPT
anatofuz
parents:
diff changeset
425 {return !(__x == __y);}
anatofuz
parents:
diff changeset
426
anatofuz
parents:
diff changeset
427 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
428 bool
anatofuz
parents:
diff changeset
429 operator!=(const error_condition& __x, const error_code& __y) _NOEXCEPT
anatofuz
parents:
diff changeset
430 {return !(__x == __y);}
anatofuz
parents:
diff changeset
431
anatofuz
parents:
diff changeset
432 inline _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
433 bool
anatofuz
parents:
diff changeset
434 operator!=(const error_condition& __x, const error_condition& __y) _NOEXCEPT
anatofuz
parents:
diff changeset
435 {return !(__x == __y);}
anatofuz
parents:
diff changeset
436
anatofuz
parents:
diff changeset
437 template <>
anatofuz
parents:
diff changeset
438 struct _LIBCPP_TEMPLATE_VIS hash<error_code>
anatofuz
parents:
diff changeset
439 : public unary_function<error_code, size_t>
anatofuz
parents:
diff changeset
440 {
anatofuz
parents:
diff changeset
441 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
442 size_t operator()(const error_code& __ec) const _NOEXCEPT
anatofuz
parents:
diff changeset
443 {
anatofuz
parents:
diff changeset
444 return static_cast<size_t>(__ec.value());
anatofuz
parents:
diff changeset
445 }
anatofuz
parents:
diff changeset
446 };
anatofuz
parents:
diff changeset
447
anatofuz
parents:
diff changeset
448 template <>
anatofuz
parents:
diff changeset
449 struct _LIBCPP_TEMPLATE_VIS hash<error_condition>
anatofuz
parents:
diff changeset
450 : public unary_function<error_condition, size_t>
anatofuz
parents:
diff changeset
451 {
anatofuz
parents:
diff changeset
452 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
453 size_t operator()(const error_condition& __ec) const _NOEXCEPT
anatofuz
parents:
diff changeset
454 {
anatofuz
parents:
diff changeset
455 return static_cast<size_t>(__ec.value());
anatofuz
parents:
diff changeset
456 }
anatofuz
parents:
diff changeset
457 };
anatofuz
parents:
diff changeset
458
anatofuz
parents:
diff changeset
459 // system_error
anatofuz
parents:
diff changeset
460
anatofuz
parents:
diff changeset
461 class _LIBCPP_TYPE_VIS system_error
anatofuz
parents:
diff changeset
462 : public runtime_error
anatofuz
parents:
diff changeset
463 {
anatofuz
parents:
diff changeset
464 error_code __ec_;
anatofuz
parents:
diff changeset
465 public:
anatofuz
parents:
diff changeset
466 system_error(error_code __ec, const string& __what_arg);
anatofuz
parents:
diff changeset
467 system_error(error_code __ec, const char* __what_arg);
anatofuz
parents:
diff changeset
468 system_error(error_code __ec);
anatofuz
parents:
diff changeset
469 system_error(int __ev, const error_category& __ecat, const string& __what_arg);
anatofuz
parents:
diff changeset
470 system_error(int __ev, const error_category& __ecat, const char* __what_arg);
anatofuz
parents:
diff changeset
471 system_error(int __ev, const error_category& __ecat);
anatofuz
parents:
diff changeset
472 ~system_error() _NOEXCEPT;
anatofuz
parents:
diff changeset
473
anatofuz
parents:
diff changeset
474 _LIBCPP_INLINE_VISIBILITY
anatofuz
parents:
diff changeset
475 const error_code& code() const _NOEXCEPT {return __ec_;}
anatofuz
parents:
diff changeset
476
anatofuz
parents:
diff changeset
477 private:
anatofuz
parents:
diff changeset
478 static string __init(const error_code&, string);
anatofuz
parents:
diff changeset
479 };
anatofuz
parents:
diff changeset
480
anatofuz
parents:
diff changeset
481 _LIBCPP_NORETURN _LIBCPP_FUNC_VIS
anatofuz
parents:
diff changeset
482 void __throw_system_error(int ev, const char* what_arg);
anatofuz
parents:
diff changeset
483
anatofuz
parents:
diff changeset
484 _LIBCPP_END_NAMESPACE_STD
anatofuz
parents:
diff changeset
485
anatofuz
parents:
diff changeset
486 #endif // _LIBCPP_SYSTEM_ERROR