diff --git a/include/boost/core/string_view.hpp b/include/boost/core/string_view.hpp index 941891a..4cb120c 100644 --- a/include/boost/core/string_view.hpp +++ b/include/boost/core/string_view.hpp @@ -381,6 +381,35 @@ public: // BOOST_CONSTEXPR basic_string_view& operator=( basic_string_view const& ) BOOST_NOEXCEPT & = default; + // conversions + +#if !defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) + + template >::type> + operator std::basic_string() const + { + return std::basic_string( data(), size() ); + } + +#else + + operator std::basic_string() const + { + return std::basic_string( data(), size() ); + } + +#endif + +#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW) + + template >::type> + operator std::basic_string_view() const BOOST_NOEXCEPT + { + return std::basic_string_view( data(), size() ); + } + +#endif + // iterator support BOOST_CONSTEXPR const_iterator begin() const BOOST_NOEXCEPT @@ -925,6 +954,198 @@ public: { return sv1.compare( sv2 ) >= 0; } + +#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW) + + // "sufficient number of additional overloads" + + // against std::string_view + + BOOST_CXX14_CONSTEXPR friend bool operator==( basic_string_view sv1, std::basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) == 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator==( std::basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) == 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator!=( basic_string_view sv1, std::basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) != 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator!=( std::basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) != 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<( basic_string_view sv1, std::basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) < 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<( std::basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) < 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<=( basic_string_view sv1, std::basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) <= 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<=( std::basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) <= 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>( basic_string_view sv1, std::basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) > 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>( std::basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) > 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>=( basic_string_view sv1, std::basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) >= 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>=( std::basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) >= 0; + } + + // against Ch const* + + BOOST_CXX14_CONSTEXPR friend bool operator==( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) == 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator==( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) == 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator!=( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) != 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator!=( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) != 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) < 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) > 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<=( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) <= 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<=( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) >= 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) > 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) < 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>=( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) >= 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>=( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) <= 0; + } + + // against std::string + + BOOST_CXX14_CONSTEXPR friend bool operator==( basic_string_view sv1, std::basic_string const& sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) == 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator==( std::basic_string const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) == 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator!=( basic_string_view sv1, std::basic_string const& sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) != 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator!=( std::basic_string const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) != 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<( basic_string_view sv1, std::basic_string const& sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) < 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<( std::basic_string const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) > 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<=( basic_string_view sv1, std::basic_string const& sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) <= 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator<=( std::basic_string const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) >= 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>( basic_string_view sv1, std::basic_string const& sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) > 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>( std::basic_string const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) < 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>=( basic_string_view sv1, std::basic_string const& sv2 ) BOOST_NOEXCEPT + { + return sv1.compare( sv2 ) >= 0; + } + + BOOST_CXX14_CONSTEXPR friend bool operator>=( std::basic_string const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT + { + return sv2.compare( sv1 ) <= 0; + } + +#endif }; template std::basic_ostream& operator<<( std::basic_ostream& os, basic_string_view str ) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index b6c89b5..7a1912c 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -267,6 +267,7 @@ run sv_contains_test.cpp ; run sv_eq_test.cpp ; run sv_lt_test.cpp ; run sv_stream_insert_test.cpp ; +run sv_conversion_test.cpp ; use-project /boost/core/swap : ./swap ; build-project ./swap ; diff --git a/test/sv_conversion_test.cpp b/test/sv_conversion_test.cpp new file mode 100644 index 0000000..fb77e8d --- /dev/null +++ b/test/sv_conversion_test.cpp @@ -0,0 +1,38 @@ +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW) +# include +#endif + +boost::core::string_view f( boost::core::string_view const& str ) +{ + return str; +} + +int main() +{ + { + std::string s1( "123" ); + std::string s2 = f( s1 ); + + BOOST_TEST_EQ( s1, s2 ); + } + +#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW) + + { + std::string_view s1( "123" ); + std::string_view s2 = f( s1 ); + + BOOST_TEST_EQ( s1, s2 ); + } + +#endif + + return boost::report_errors(); +}