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