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 |