blob: 763d62c2a0b43f1b740d5396dca5c85987411ad7 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001//===---------------------- system_error.cpp ------------------------------===//
2//
Howard Hinnantf5256e12010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#include "system_error"
11#include "string"
12#include "cstring"
13
14_LIBCPP_BEGIN_NAMESPACE_STD
15
16// class error_category
17
Howard Hinnant1e15fd12011-05-26 19:48:01 +000018error_category::error_category() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000019{
20}
21
Howard Hinnant1e15fd12011-05-26 19:48:01 +000022error_category::~error_category() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000023{
24}
25
26error_condition
Howard Hinnant1e15fd12011-05-26 19:48:01 +000027error_category::default_error_condition(int ev) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000028{
29 return error_condition(ev, *this);
30}
31
32bool
Howard Hinnant1e15fd12011-05-26 19:48:01 +000033error_category::equivalent(int code, const error_condition& condition) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000034{
35 return default_error_condition(code) == condition;
36}
37
38bool
Howard Hinnant1e15fd12011-05-26 19:48:01 +000039error_category::equivalent(const error_code& code, int condition) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000040{
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:
Howard Hinnant1e15fd12011-05-26 19:48:01 +000054 virtual const char* name() const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000055 virtual string message(int ev) const;
56};
57
58const char*
Howard Hinnant1e15fd12011-05-26 19:48:01 +000059__generic_error_category::name() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000060{
61 return "generic";
62}
63
64string
65__generic_error_category::message(int ev) const
66{
Howard Hinnantadff4892010-05-24 17:49:41 +000067#ifdef ELAST
68 if (ev > ELAST)
69 return string("unspecified generic_category error");
Howard Hinnant16e6e1d2010-08-22 00:03:27 +000070#endif // ELAST
Howard Hinnantadff4892010-05-24 17:49:41 +000071 return __do_message::message(ev);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000072}
73
74const error_category&
Howard Hinnant1e15fd12011-05-26 19:48:01 +000075generic_category() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000076{
77 static __generic_error_category s;
78 return s;
79}
80
81class _LIBCPP_HIDDEN __system_error_category
82 : public __do_message
83{
84public:
Howard Hinnant1e15fd12011-05-26 19:48:01 +000085 virtual const char* name() const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000086 virtual string message(int ev) const;
Howard Hinnant1e15fd12011-05-26 19:48:01 +000087 virtual error_condition default_error_condition(int ev) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000088};
89
90const char*
Howard Hinnant1e15fd12011-05-26 19:48:01 +000091__system_error_category::name() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000092{
93 return "system";
94}
95
96string
97__system_error_category::message(int ev) const
98{
Howard Hinnantadff4892010-05-24 17:49:41 +000099#ifdef ELAST
100 if (ev > ELAST)
101 return string("unspecified system_category error");
Howard Hinnant16e6e1d2010-08-22 00:03:27 +0000102#endif // ELAST
Howard Hinnantadff4892010-05-24 17:49:41 +0000103 return __do_message::message(ev);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000104}
105
106error_condition
Howard Hinnant1e15fd12011-05-26 19:48:01 +0000107__system_error_category::default_error_condition(int ev) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000108{
Howard Hinnantadff4892010-05-24 17:49:41 +0000109#ifdef ELAST
110 if (ev > ELAST)
111 return error_condition(ev, system_category());
Howard Hinnant16e6e1d2010-08-22 00:03:27 +0000112#endif // ELAST
Howard Hinnantadff4892010-05-24 17:49:41 +0000113 return error_condition(ev, generic_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000114}
115
116const error_category&
Howard Hinnant1e15fd12011-05-26 19:48:01 +0000117system_category() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000118{
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 }
Howard Hinnant0949eed2011-06-30 21:18:19 +0000150 return _VSTD::move(what_arg);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000151}
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
Howard Hinnant1e15fd12011-05-26 19:48:01 +0000189system_error::~system_error() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000190{
191}
192
193void
194__throw_system_error(int ev, const char* what_arg)
195{
Howard Hinnantd4444702010-08-11 17:04:31 +0000196#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000197 throw system_error(error_code(ev, system_category()), what_arg);
Howard Hinnantd4444702010-08-11 17:04:31 +0000198#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000199}
200
201_LIBCPP_END_NAMESPACE_STD