Line data Source code
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 406 : get_optional_string( 35 : String const& s) 36 : { 37 406 : optional_string r; 38 406 : r.s = s; 39 406 : r.b = true; 40 406 : 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 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