GCC Code Coverage Report


Directory: libs/url/
File: boost/url/detail/optional_string.hpp
Date: 2024-03-15 21:27:27
Exec Total Coverage
Lines: 14 14 100.0%
Functions: 14 15 93.3%
Branches: 3 4 75.0%

Line Branch Exec Source
1 //
2 // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
3 //
4 // 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 //
7 // Official repository: https://github.com/boostorg/url
8 //
9
10 #ifndef BOOST_URL_DETAIL_OPTIONAL_STRING_HPP
11 #define BOOST_URL_DETAIL_OPTIONAL_STRING_HPP
12
13 #include <boost/url/detail/string_view.hpp>
14 #include <boost/core/detail/string_view.hpp>
15
16 namespace boost {
17 namespace urls {
18
19 #ifndef BOOST_URL_DOCS
20 struct no_value_t;
21 #endif
22
23 namespace detail {
24 struct optional_string
25 {
26 core::string_view s;
27 bool b = false;
28 };
29
30 template <class String>
31 typename std::enable_if<
32 std::is_convertible<String, core::string_view>::value,
33 optional_string>::type
34 809 get_optional_string(
35 String const& s)
36 {
37 809 optional_string r;
38 809 r.s = s;
39 809 r.b = true;
40 809 return r;
41 }
42
43 template <class T, class = void>
44 struct is_dereferenceable : std::false_type
45 {};
46
47 template <class T>
48 struct is_dereferenceable<
49 T,
50 void_t<
51 decltype(*std::declval<T>())
52 >> : std::true_type
53 {};
54
55 template <class OptionalString>
56 typename std::enable_if<
57 !std::is_convertible<OptionalString, core::string_view>::value,
58 optional_string>::type
59 6 get_optional_string(
60 OptionalString const& opt)
61 {
62 // If this goes off, it means the rule
63 // passed in did not meet the requirements.
64 // Please check the documentation of functions
65 // that call get_optional_string.
66 static_assert(
67 is_dereferenceable<OptionalString>::value &&
68 std::is_constructible<bool, OptionalString>::value &&
69 !std::is_convertible<OptionalString, core::string_view>::value &&
70 std::is_convertible<typename std::decay<decltype(*std::declval<OptionalString>())>::type, core::string_view>::value,
71 "OptionalString requirements not met");
72 6 optional_string r;
73
3/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
6 r.s = opt ? detail::to_sv(*opt) : core::string_view{};
74 6 r.b = static_cast<bool>(opt);
75 6 return r;
76 }
77
78 inline
79 optional_string
80 21 get_optional_string(
81 std::nullptr_t)
82 {
83 21 return {};
84 }
85
86 inline
87 optional_string
88 388 get_optional_string(
89 no_value_t const&)
90 {
91 388 return {};
92 }
93
94
95 } // detail
96 } // urls
97 } // boost
98
99 #endif
100