100.00% Lines (27/27) 100.00% Functions (6/6)
TLA Baseline Branch
Line Hits Code Line Hits Code
1   // 1   //
2   // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) 2   // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
  3 + // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
3   // 4   //
4   // Distributed under the Boost Software License, Version 1.0. (See accompanying 5   // Distributed under the Boost Software License, Version 1.0. (See accompanying
5   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6   // 7   //
7   // Official repository: https://github.com/boostorg/url 8   // Official repository: https://github.com/boostorg/url
8   // 9   //
9   10  
10   #ifndef BOOST_URL_IMPL_ERROR_HPP 11   #ifndef BOOST_URL_IMPL_ERROR_HPP
11   #define BOOST_URL_IMPL_ERROR_HPP 12   #define BOOST_URL_IMPL_ERROR_HPP
12   13  
13   #include <boost/url/grammar/error.hpp> 14   #include <boost/url/grammar/error.hpp>
14   #include <type_traits> 15   #include <type_traits>
15   16  
16   namespace boost { 17   namespace boost {
17   18  
18   //----------------------------------------------- 19   //-----------------------------------------------
19   namespace system { 20   namespace system {
20   template<> 21   template<>
21   struct is_error_code_enum<::boost::urls::error> 22   struct is_error_code_enum<::boost::urls::error>
22   { 23   {
23   static bool const value = true; 24   static bool const value = true;
24   }; 25   };
25   } // system 26   } // system
26   //----------------------------------------------- 27   //-----------------------------------------------
27   28  
28   namespace urls { 29   namespace urls {
29   30  
30   namespace detail { 31   namespace detail {
31   32  
32   struct BOOST_SYMBOL_VISIBLE 33   struct BOOST_SYMBOL_VISIBLE
33   error_cat_type 34   error_cat_type
34   : system::error_category 35   : system::error_category
35   { 36   {
36   BOOST_URL_CXX20_CONSTEXPR 37   BOOST_URL_CXX20_CONSTEXPR
HITCBC 37   246 const char* name( 38   246 const char* name(
38   ) const noexcept override 39   ) const noexcept override
39   { 40   {
HITCBC 40   246 return "boost.url"; 41   246 return "boost.url";
41   } 42   }
42   43  
HITCBC 43   247 std::string message( 44   247 std::string message(
44   int code) const override 45   int code) const override
45   { 46   {
HITCBC 46   494 return message(code, nullptr, 0); 47   494 return message(code, nullptr, 0);
47   } 48   }
48   49  
49   BOOST_URL_CXX20_CONSTEXPR 50   BOOST_URL_CXX20_CONSTEXPR
HITCBC 50   247 char const* message( 51   247 char const* message(
51   int code, 52   int code,
52   char*, 53   char*,
53   std::size_t) const noexcept override 54   std::size_t) const noexcept override
54   { 55   {
HITCBC 55   247 switch(static_cast<error>(code)) 56   247 switch(static_cast<error>(code))
56   { 57   {
HITCBC 57   1 case error::success: return "success"; 58   1 case error::success: return "success";
HITCBC 58   1 case error::illegal_null: return "illegal null"; 59   1 case error::illegal_null: return "illegal null";
HITCBC 59   1 case error::illegal_reserved_char: return "illegal reserved char"; 60   1 case error::illegal_reserved_char: return "illegal reserved char";
HITCBC 60   1 case error::non_canonical: return "non canonical"; 61   1 case error::non_canonical: return "non canonical";
HITCBC 61   98 case error::bad_pct_hexdig: return "bad hexdig in pct-encoding"; 62   98 case error::bad_pct_hexdig: return "bad hexdig in pct-encoding";
HITCBC 62   141 case error::incomplete_encoding: return "incomplete pct-encoding"; 63   141 case error::incomplete_encoding: return "incomplete pct-encoding";
HITCBC 63   1 case error::missing_pct_hexdig: return "missing hexdig in pct-encoding"; 64   1 case error::missing_pct_hexdig: return "missing hexdig in pct-encoding";
HITCBC 64   1 case error::no_space: return "no space"; 65   1 case error::no_space: return "no space";
HITCBC 65   1 case error::not_a_base: return "not a base"; 66   1 case error::not_a_base: return "not a base";
66   } 67   }
HITCBC 67   1 return ""; 68   1 return "";
68   } 69   }
69   70  
70   BOOST_URL_CXX20_CONSTEXPR 71   BOOST_URL_CXX20_CONSTEXPR
71   system::error_condition 72   system::error_condition
72   default_error_condition( 73   default_error_condition(
73   int ev) const noexcept override; 74   int ev) const noexcept override;
74   75  
HITCBC 75   78 BOOST_SYSTEM_CONSTEXPR error_cat_type() noexcept 76   78 BOOST_SYSTEM_CONSTEXPR error_cat_type() noexcept
HITCBC 76   78 : error_category(0xbc15399d7a4ce829) 77   78 : error_category(0xbc15399d7a4ce829)
77   { 78   {
HITCBC 78   78 } 79   78 }
79   }; 80   };
80   81  
81   #if defined(BOOST_URL_HAS_CXX20_CONSTEXPR) 82   #if defined(BOOST_URL_HAS_CXX20_CONSTEXPR)
  83 + // Visible so a shared library built as C++20
  84 + // still exports the symbol that consumers built
  85 + // as C++17 reference through the extern below
  86 + BOOST_SYMBOL_VISIBLE
82   inline constexpr error_cat_type error_cat{}; 87   inline constexpr error_cat_type error_cat{};
83   #else 88   #else
84   BOOST_URL_DECL extern error_cat_type error_cat; 89   BOOST_URL_DECL extern error_cat_type error_cat;
85   #endif 90   #endif
86   91  
87   } // detail 92   } // detail
88   93  
89   inline 94   inline
90   BOOST_SYSTEM_CONSTEXPR 95   BOOST_SYSTEM_CONSTEXPR
91   system::error_code 96   system::error_code
HITCBC 92   264 make_error_code( 97   264 make_error_code(
93   error ev) noexcept 98   error ev) noexcept
94   { 99   {
95   return system::error_code{ 100   return system::error_code{
96   static_cast<std::underlying_type< 101   static_cast<std::underlying_type<
97   error>::type>(ev), 102   error>::type>(ev),
HITCBC 98   264 detail::error_cat}; 103   264 detail::error_cat};
99   } 104   }
100   105  
101   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 106   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
102   system::error_condition 107   system::error_condition
HITCBC 103   9 detail::error_cat_type:: 108   9 detail::error_cat_type::
104   default_error_condition( 109   default_error_condition(
105   int ev) const noexcept 110   int ev) const noexcept
106   { 111   {
HITCBC 107   9 switch(static_cast<error>(ev)) 112   9 switch(static_cast<error>(ev))
108   { 113   {
HITCBC 109   6 default: 114   6 default:
HITCBC 110   6 return {ev, *this}; 115   6 return {ev, *this};
HITCBC 111   3 case error::bad_pct_hexdig: 116   3 case error::bad_pct_hexdig:
112   case error::incomplete_encoding: 117   case error::incomplete_encoding:
113   case error::missing_pct_hexdig: 118   case error::missing_pct_hexdig:
HITCBC 114   3 return grammar::condition::fatal; 119   3 return grammar::condition::fatal;
115   } 120   }
116   } 121   }
117   122  
118   } // urls 123   } // urls
119   } // boost 124   } // boost
120   125  
121   #endif 126   #endif