ext-boost/boost/url/detail/optional_string.hpp
2023-05-22 18:45:02 +10:00

99 lines
2.1 KiB
C++

//
// Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Official repository: https://github.com/boostorg/url
//
#ifndef BOOST_URL_DETAIL_OPTIONAL_STRING_HPP
#define BOOST_URL_DETAIL_OPTIONAL_STRING_HPP
#include <boost/url/string_view.hpp>
namespace boost {
namespace urls {
#ifndef BOOST_URL_DOCS
struct no_value_t;
#endif
namespace detail {
struct optional_string
{
string_view s;
bool b = false;
};
template <class String>
typename std::enable_if<
std::is_convertible<String, string_view>::value,
optional_string>::type
get_optional_string(
String const& s)
{
optional_string r;
r.s = s;
r.b = true;
return r;
}
template <class T, class = void>
struct is_dereferenceable : std::false_type
{};
template <class T>
struct is_dereferenceable<
T,
void_t<
decltype(*std::declval<T>())
>> : std::true_type
{};
template <class OptionalString>
typename std::enable_if<
!std::is_convertible<OptionalString, string_view>::value,
optional_string>::type
get_optional_string(
OptionalString const& opt)
{
// If this goes off, it means the rule
// passed in did not meet the requirements.
// Please check the documentation of functions
// that call get_optional_string.
static_assert(
is_dereferenceable<OptionalString>::value &&
std::is_constructible<bool, OptionalString>::value &&
!std::is_convertible<OptionalString, string_view>::value &&
std::is_convertible<typename std::decay<decltype(*std::declval<OptionalString>())>::type, string_view>::value,
"OptionalString requirements not met");
optional_string r;
r.s = opt ? detail::to_sv(*opt) : string_view{};
r.b = static_cast<bool>(opt);
return r;
}
inline
optional_string
get_optional_string(
std::nullptr_t)
{
return {};
}
inline
optional_string
get_optional_string(
no_value_t const&)
{
return {};
}
} // detail
} // urls
} // boost
#endif