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