TLA Line data Source code
1 : //
2 : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3 : // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
4 : //
5 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 : //
8 : // Official repository: https://github.com/boostorg/url
9 : //
10 :
11 : #ifndef BOOST_URL_GRAMMAR_IMPL_ERROR_HPP
12 : #define BOOST_URL_GRAMMAR_IMPL_ERROR_HPP
13 :
14 : #include <type_traits>
15 :
16 : namespace boost {
17 : namespace system {
18 : template<>
19 : struct is_error_code_enum<
20 : ::boost::urls::grammar::error>
21 : {
22 : static bool const value = true;
23 : };
24 : template<>
25 : struct is_error_condition_enum<
26 : ::boost::urls::grammar::condition>
27 : {
28 : static bool const value = true;
29 : };
30 : } // system
31 : } // boost
32 :
33 : namespace boost {
34 : namespace urls {
35 : namespace grammar {
36 :
37 : namespace detail {
38 :
39 : struct BOOST_SYMBOL_VISIBLE
40 : error_cat_type
41 : : system::error_category
42 : {
43 : BOOST_URL_CXX20_CONSTEXPR
44 HIT 616 : const char* name(
45 : ) const noexcept override
46 : {
47 616 : return "boost.url.grammar";
48 : }
49 :
50 616 : std::string message(
51 : int code) const override
52 : {
53 1232 : return message(code, nullptr, 0);
54 : }
55 :
56 : BOOST_URL_CXX20_CONSTEXPR
57 616 : char const* message(
58 : int code,
59 : char*,
60 : std::size_t) const noexcept override
61 : {
62 616 : switch(static_cast<error>(code))
63 : {
64 1 : default:
65 1 : case error::need_more: return "need more";
66 63 : case error::mismatch: return "mismatch";
67 13 : case error::invalid: return "invalid";
68 1 : case error::end_of_range: return "end of range";
69 537 : case error::leftover: return "leftover";
70 1 : case error::out_of_range: return "out of range";
71 : }
72 : }
73 :
74 : BOOST_URL_CXX20_CONSTEXPR
75 : system::error_condition
76 : default_error_condition(
77 : int ev) const noexcept override;
78 :
79 78 : BOOST_SYSTEM_CONSTEXPR error_cat_type() noexcept
80 78 : : error_category(0x0536e50a30f9e9f2)
81 : {
82 78 : }
83 : };
84 :
85 : struct BOOST_SYMBOL_VISIBLE
86 : condition_cat_type
87 : : system::error_category
88 : {
89 : BOOST_URL_CXX20_CONSTEXPR
90 5 : const char* name(
91 : ) const noexcept override
92 : {
93 5 : return "boost.url.grammar";
94 : }
95 :
96 5 : std::string message(
97 : int code) const override
98 : {
99 10 : return message(code, nullptr, 0);
100 : }
101 :
102 : BOOST_URL_CXX20_CONSTEXPR
103 5 : char const* message(
104 : int code,
105 : char*,
106 : std::size_t) const noexcept override
107 : {
108 : switch(static_cast<condition>(code))
109 : {
110 : default:
111 : case condition::fatal:
112 5 : return "fatal condition";
113 : }
114 : }
115 :
116 78 : BOOST_SYSTEM_CONSTEXPR condition_cat_type()
117 78 : : error_category(0x0536e50a30f9e9f2)
118 : {
119 78 : }
120 : };
121 :
122 : #if defined(BOOST_URL_HAS_CXX20_CONSTEXPR)
123 : // Visible so a shared library built as C++20
124 : // still exports the symbols that consumers built
125 : // as C++17 reference through the externs below
126 : BOOST_SYMBOL_VISIBLE
127 : inline constexpr error_cat_type error_cat{};
128 : BOOST_SYMBOL_VISIBLE
129 : inline constexpr condition_cat_type condition_cat{};
130 : #else
131 : BOOST_URL_DECL extern error_cat_type error_cat;
132 : BOOST_URL_DECL extern condition_cat_type condition_cat;
133 : #endif
134 :
135 : } // detail
136 :
137 : inline
138 : BOOST_SYSTEM_CONSTEXPR
139 : system::error_code
140 53401 : make_error_code(
141 : error ev) noexcept
142 : {
143 : return system::error_code{
144 : static_cast<std::underlying_type<
145 : error>::type>(ev),
146 53401 : detail::error_cat};
147 : }
148 :
149 : inline
150 : BOOST_SYSTEM_CONSTEXPR
151 : system::error_condition
152 20 : make_error_condition(
153 : condition c) noexcept
154 : {
155 20 : return system::error_condition{
156 : static_cast<std::underlying_type<
157 : condition>::type>(c),
158 20 : detail::condition_cat};
159 : }
160 :
161 : BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
162 : system::error_condition
163 6 : detail::error_cat_type::
164 : default_error_condition(
165 : int ev) const noexcept
166 : {
167 6 : switch(static_cast<error>(ev))
168 : {
169 2 : case error::invalid:
170 : case error::out_of_range:
171 2 : return condition::fatal;
172 4 : default:
173 4 : return {ev, *this};
174 : }
175 : }
176 :
177 : } // grammar
178 : } // urls
179 : } // boost
180 :
181 : #endif
|