update string_view lite to version 1.6.0 (#1677)
This is the header as seen in the current master branch, commit d27d7b5081406a35b41cb16b321be8833b4cd811, on <https://github.com/martinmoene/string-view-lite>.
This commit is contained in:
parent
bd0f5e9322
commit
5f0b35b2c5
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2017-2019 by Martin Moene
|
// Copyright 2017-2020 by Martin Moene
|
||||||
//
|
//
|
||||||
// string-view lite, a C++17-like string_view for C++98 and later.
|
// string-view lite, a C++17-like string_view for C++98 and later.
|
||||||
// For more information see https://github.com/martinmoene/string-view-lite
|
// For more information see https://github.com/martinmoene/string-view-lite
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
#define NONSTD_SV_LITE_H_INCLUDED
|
#define NONSTD_SV_LITE_H_INCLUDED
|
||||||
|
|
||||||
#define string_view_lite_MAJOR 1
|
#define string_view_lite_MAJOR 1
|
||||||
#define string_view_lite_MINOR 4
|
#define string_view_lite_MINOR 6
|
||||||
#define string_view_lite_PATCH 0
|
#define string_view_lite_PATCH 0
|
||||||
|
|
||||||
#define string_view_lite_VERSION nssv_STRINGIFY(string_view_lite_MAJOR) "." nssv_STRINGIFY(string_view_lite_MINOR) "." nssv_STRINGIFY(string_view_lite_PATCH)
|
#define string_view_lite_VERSION nssv_STRINGIFY(string_view_lite_MAJOR) "." nssv_STRINGIFY(string_view_lite_MINOR) "." nssv_STRINGIFY(string_view_lite_PATCH)
|
||||||
|
@ -26,12 +26,22 @@
|
||||||
#define nssv_STRING_VIEW_NONSTD 1
|
#define nssv_STRING_VIEW_NONSTD 1
|
||||||
#define nssv_STRING_VIEW_STD 2
|
#define nssv_STRING_VIEW_STD 2
|
||||||
|
|
||||||
#if !defined( nssv_CONFIG_SELECT_STRING_VIEW )
|
// tweak header support:
|
||||||
# define nssv_CONFIG_SELECT_STRING_VIEW ( nssv_HAVE_STD_STRING_VIEW ? nssv_STRING_VIEW_STD : nssv_STRING_VIEW_NONSTD )
|
|
||||||
|
#ifdef __has_include
|
||||||
|
# if __has_include(<nonstd/string_view.tweak.hpp>)
|
||||||
|
# include <nonstd/string_view.tweak.hpp>
|
||||||
|
# endif
|
||||||
|
#define nssv_HAVE_TWEAK_HEADER 1
|
||||||
|
#else
|
||||||
|
#define nssv_HAVE_TWEAK_HEADER 0
|
||||||
|
//# pragma message("string_view.hpp: Note: Tweak header not supported.")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined( nssv_CONFIG_SELECT_STD_STRING_VIEW ) || defined( nssv_CONFIG_SELECT_NONSTD_STRING_VIEW )
|
// string_view selection and configuration:
|
||||||
# error nssv_CONFIG_SELECT_STD_STRING_VIEW and nssv_CONFIG_SELECT_NONSTD_STRING_VIEW are deprecated and removed, please use nssv_CONFIG_SELECT_STRING_VIEW=nssv_STRING_VIEW_...
|
|
||||||
|
#if !defined( nssv_CONFIG_SELECT_STRING_VIEW )
|
||||||
|
# define nssv_CONFIG_SELECT_STRING_VIEW ( nssv_HAVE_STD_STRING_VIEW ? nssv_STRING_VIEW_STD : nssv_STRING_VIEW_NONSTD )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef nssv_CONFIG_STD_SV_OPERATOR
|
#ifndef nssv_CONFIG_STD_SV_OPERATOR
|
||||||
|
@ -55,10 +65,17 @@
|
||||||
# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 1
|
# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef nssv_CONFIG_NO_STREAM_INSERTION
|
||||||
|
# define nssv_CONFIG_NO_STREAM_INSERTION 0
|
||||||
|
#endif
|
||||||
|
|
||||||
// Control presence of exception handling (try and auto discover):
|
// Control presence of exception handling (try and auto discover):
|
||||||
|
|
||||||
#ifndef nssv_CONFIG_NO_EXCEPTIONS
|
#ifndef nssv_CONFIG_NO_EXCEPTIONS
|
||||||
# if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)
|
# if _MSC_VER
|
||||||
|
# include <cstddef> // for _HAS_EXCEPTIONS
|
||||||
|
# endif
|
||||||
|
# if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || (_HAS_EXCEPTIONS)
|
||||||
# define nssv_CONFIG_NO_EXCEPTIONS 0
|
# define nssv_CONFIG_NO_EXCEPTIONS 0
|
||||||
# else
|
# else
|
||||||
# define nssv_CONFIG_NO_EXCEPTIONS 1
|
# define nssv_CONFIG_NO_EXCEPTIONS 1
|
||||||
|
@ -221,9 +238,14 @@ using std::operator<<;
|
||||||
|
|
||||||
#define nssv_COMPILER_VERSION( major, minor, patch ) ( 10 * ( 10 * (major) + (minor) ) + (patch) )
|
#define nssv_COMPILER_VERSION( major, minor, patch ) ( 10 * ( 10 * (major) + (minor) ) + (patch) )
|
||||||
|
|
||||||
#if defined(__clang__)
|
#if defined( __apple_build_version__ )
|
||||||
|
# define nssv_COMPILER_APPLECLANG_VERSION nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
|
||||||
|
# define nssv_COMPILER_CLANG_VERSION 0
|
||||||
|
#elif defined( __clang__ )
|
||||||
|
# define nssv_COMPILER_APPLECLANG_VERSION 0
|
||||||
# define nssv_COMPILER_CLANG_VERSION nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
|
# define nssv_COMPILER_CLANG_VERSION nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
|
||||||
#else
|
#else
|
||||||
|
# define nssv_COMPILER_APPLECLANG_VERSION 0
|
||||||
# define nssv_COMPILER_CLANG_VERSION 0
|
# define nssv_COMPILER_CLANG_VERSION 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -292,6 +314,45 @@ using std::operator<<;
|
||||||
|
|
||||||
#define nssv_HAVE_STD_HASH nssv_CPP11_120
|
#define nssv_HAVE_STD_HASH nssv_CPP11_120
|
||||||
|
|
||||||
|
// Presence of compiler intrinsics:
|
||||||
|
|
||||||
|
// Providing char-type specializations for compare() and length() that
|
||||||
|
// use compiler intrinsics can improve compile- and run-time performance.
|
||||||
|
//
|
||||||
|
// The challenge is in using the right combinations of builtin availability
|
||||||
|
// and its constexpr-ness.
|
||||||
|
//
|
||||||
|
// | compiler | __builtin_memcmp (constexpr) | memcmp (constexpr) |
|
||||||
|
// |----------|------------------------------|---------------------|
|
||||||
|
// | clang | 4.0 (>= 4.0 ) | any (? ) |
|
||||||
|
// | clang-a | 9.0 (>= 9.0 ) | any (? ) |
|
||||||
|
// | gcc | any (constexpr) | any (? ) |
|
||||||
|
// | msvc | >= 14.2 C++17 (>= 14.2 ) | any (? ) |
|
||||||
|
|
||||||
|
#define nssv_HAVE_BUILTIN_VER ( (nssv_CPP17_000 && nssv_COMPILER_MSVC_VERSION >= 142) || nssv_COMPILER_GNUC_VERSION > 0 || nssv_COMPILER_CLANG_VERSION >= 400 || nssv_COMPILER_APPLECLANG_VERSION >= 900 )
|
||||||
|
#define nssv_HAVE_BUILTIN_CE ( nssv_HAVE_BUILTIN_VER )
|
||||||
|
|
||||||
|
#define nssv_HAVE_BUILTIN_MEMCMP ( (nssv_HAVE_CONSTEXPR_14 && nssv_HAVE_BUILTIN_CE) || !nssv_HAVE_CONSTEXPR_14 )
|
||||||
|
#define nssv_HAVE_BUILTIN_STRLEN ( (nssv_HAVE_CONSTEXPR_11 && nssv_HAVE_BUILTIN_CE) || !nssv_HAVE_CONSTEXPR_11 )
|
||||||
|
|
||||||
|
#ifdef __has_builtin
|
||||||
|
# define nssv_HAVE_BUILTIN( x ) __has_builtin( x )
|
||||||
|
#else
|
||||||
|
# define nssv_HAVE_BUILTIN( x ) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if nssv_HAVE_BUILTIN(__builtin_memcmp) || nssv_HAVE_BUILTIN_VER
|
||||||
|
# define nssv_BUILTIN_MEMCMP __builtin_memcmp
|
||||||
|
#else
|
||||||
|
# define nssv_BUILTIN_MEMCMP memcmp
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if nssv_HAVE_BUILTIN(__builtin_strlen) || nssv_HAVE_BUILTIN_VER
|
||||||
|
# define nssv_BUILTIN_STRLEN __builtin_strlen
|
||||||
|
#else
|
||||||
|
# define nssv_BUILTIN_STRLEN strlen
|
||||||
|
#endif
|
||||||
|
|
||||||
// C++ feature usage:
|
// C++ feature usage:
|
||||||
|
|
||||||
#if nssv_HAVE_CONSTEXPR_11
|
#if nssv_HAVE_CONSTEXPR_11
|
||||||
|
@ -350,9 +411,12 @@ using std::operator<<;
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <ostream>
|
|
||||||
#include <string> // std::char_traits<>
|
#include <string> // std::char_traits<>
|
||||||
|
|
||||||
|
#if ! nssv_CONFIG_NO_STREAM_INSERTION
|
||||||
|
# include <ostream>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ! nssv_CONFIG_NO_EXCEPTIONS
|
#if ! nssv_CONFIG_NO_EXCEPTIONS
|
||||||
# include <stdexcept>
|
# include <stdexcept>
|
||||||
#endif
|
#endif
|
||||||
|
@ -405,40 +469,75 @@ nssv_DISABLE_MSVC_WARNINGS( 4455 26481 26472 )
|
||||||
|
|
||||||
namespace nonstd { namespace sv_lite {
|
namespace nonstd { namespace sv_lite {
|
||||||
|
|
||||||
#if nssv_CPP11_OR_GREATER
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
#if nssv_CPP14_OR_GREATER
|
// support constexpr comparison in C++14;
|
||||||
|
// for C++17 and later, use provided traits:
|
||||||
|
|
||||||
template< typename CharT >
|
template< typename CharT >
|
||||||
inline constexpr std::size_t length( CharT * s, std::size_t result = 0 )
|
inline nssv_constexpr14 int compare( CharT const * s1, CharT const * s2, std::size_t count )
|
||||||
{
|
{
|
||||||
CharT * v = s;
|
while ( count-- != 0 )
|
||||||
std::size_t r = result;
|
{
|
||||||
while ( *v != '\0' ) {
|
if ( *s1 < *s2 ) return -1;
|
||||||
++v;
|
if ( *s1 > *s2 ) return +1;
|
||||||
++r;
|
++s1; ++s2;
|
||||||
}
|
}
|
||||||
return r;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // nssv_CPP14_OR_GREATER
|
#if nssv_HAVE_BUILTIN_MEMCMP
|
||||||
|
|
||||||
|
// specialization of compare() for char, see also generic compare() above:
|
||||||
|
|
||||||
|
inline nssv_constexpr14 int compare( char const * s1, char const * s2, std::size_t count )
|
||||||
|
{
|
||||||
|
return nssv_BUILTIN_MEMCMP( s1, s2, count );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if nssv_HAVE_BUILTIN_STRLEN
|
||||||
|
|
||||||
|
// specialization of length() for char, see also generic length() further below:
|
||||||
|
|
||||||
|
inline nssv_constexpr std::size_t length( char const * s )
|
||||||
|
{
|
||||||
|
return nssv_BUILTIN_STRLEN( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__OPTIMIZE__)
|
||||||
|
|
||||||
|
// gcc, clang provide __OPTIMIZE__
|
||||||
// Expect tail call optimization to make length() non-recursive:
|
// Expect tail call optimization to make length() non-recursive:
|
||||||
|
|
||||||
template< typename CharT >
|
template< typename CharT >
|
||||||
inline constexpr std::size_t length( CharT * s, std::size_t result = 0 )
|
inline nssv_constexpr std::size_t length( CharT * s, std::size_t result = 0 )
|
||||||
{
|
{
|
||||||
return *s == '\0' ? result : length( s + 1, result + 1 );
|
return *s == '\0' ? result : length( s + 1, result + 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // nssv_CPP14_OR_GREATER
|
#else // OPTIMIZE
|
||||||
|
|
||||||
|
// non-recursive:
|
||||||
|
|
||||||
|
template< typename CharT >
|
||||||
|
inline nssv_constexpr14 std::size_t length( CharT * s )
|
||||||
|
{
|
||||||
|
std::size_t result = 0;
|
||||||
|
while ( *s++ != '\0' )
|
||||||
|
{
|
||||||
|
++result;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // OPTIMIZE
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
#endif // nssv_CPP11_OR_GREATER
|
|
||||||
|
|
||||||
template
|
template
|
||||||
<
|
<
|
||||||
class CharT,
|
class CharT,
|
||||||
|
@ -589,9 +688,9 @@ public:
|
||||||
|
|
||||||
nssv_constexpr14 void swap( basic_string_view & other ) nssv_noexcept
|
nssv_constexpr14 void swap( basic_string_view & other ) nssv_noexcept
|
||||||
{
|
{
|
||||||
using std::swap;
|
const basic_string_view tmp(other);
|
||||||
swap( data_, other.data_ );
|
other = *this;
|
||||||
swap( size_, other.size_ );
|
*this = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 24.4.2.6 String operations:
|
// 24.4.2.6 String operations:
|
||||||
|
@ -630,7 +729,11 @@ public:
|
||||||
|
|
||||||
nssv_constexpr14 int compare( basic_string_view other ) const nssv_noexcept // (1)
|
nssv_constexpr14 int compare( basic_string_view other ) const nssv_noexcept // (1)
|
||||||
{
|
{
|
||||||
|
#if nssv_CPP17_OR_GREATER
|
||||||
if ( const int result = Traits::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )
|
if ( const int result = Traits::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )
|
||||||
|
#else
|
||||||
|
if ( const int result = detail::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -874,7 +977,7 @@ private:
|
||||||
{
|
{
|
||||||
const basic_string_view v;
|
const basic_string_view v;
|
||||||
|
|
||||||
nssv_constexpr explicit not_in_view( basic_string_view v ) : v( v ) {}
|
nssv_constexpr explicit not_in_view( basic_string_view v_ ) : v( v_ ) {}
|
||||||
|
|
||||||
nssv_constexpr bool operator()( CharT c ) const
|
nssv_constexpr bool operator()( CharT c ) const
|
||||||
{
|
{
|
||||||
|
@ -964,37 +1067,37 @@ template< class CharT, class Traits >
|
||||||
nssv_constexpr bool operator== (
|
nssv_constexpr bool operator== (
|
||||||
basic_string_view <CharT, Traits> lhs,
|
basic_string_view <CharT, Traits> lhs,
|
||||||
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) == 0 ; }
|
{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits >
|
template< class CharT, class Traits >
|
||||||
nssv_constexpr bool operator!= (
|
nssv_constexpr bool operator!= (
|
||||||
basic_string_view <CharT, Traits> lhs,
|
basic_string_view <CharT, Traits> lhs,
|
||||||
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) != 0 ; }
|
{ return !( lhs == rhs ); }
|
||||||
|
|
||||||
template< class CharT, class Traits >
|
template< class CharT, class Traits >
|
||||||
nssv_constexpr bool operator< (
|
nssv_constexpr bool operator< (
|
||||||
basic_string_view <CharT, Traits> lhs,
|
basic_string_view <CharT, Traits> lhs,
|
||||||
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) < 0 ; }
|
{ return lhs.compare( rhs ) < 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits >
|
template< class CharT, class Traits >
|
||||||
nssv_constexpr bool operator<= (
|
nssv_constexpr bool operator<= (
|
||||||
basic_string_view <CharT, Traits> lhs,
|
basic_string_view <CharT, Traits> lhs,
|
||||||
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) <= 0 ; }
|
{ return lhs.compare( rhs ) <= 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits >
|
template< class CharT, class Traits >
|
||||||
nssv_constexpr bool operator> (
|
nssv_constexpr bool operator> (
|
||||||
basic_string_view <CharT, Traits> lhs,
|
basic_string_view <CharT, Traits> lhs,
|
||||||
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) > 0 ; }
|
{ return lhs.compare( rhs ) > 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits >
|
template< class CharT, class Traits >
|
||||||
nssv_constexpr bool operator>= (
|
nssv_constexpr bool operator>= (
|
||||||
basic_string_view <CharT, Traits> lhs,
|
basic_string_view <CharT, Traits> lhs,
|
||||||
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view <CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) >= 0 ; }
|
{ return lhs.compare( rhs ) >= 0; }
|
||||||
|
|
||||||
// Let S be basic_string_view<CharT, Traits>, and sv be an instance of S.
|
// Let S be basic_string_view<CharT, Traits>, and sv be an instance of S.
|
||||||
// Implementations shall provide sufficient additional overloads marked
|
// Implementations shall provide sufficient additional overloads marked
|
||||||
|
@ -1003,21 +1106,21 @@ nssv_constexpr bool operator>= (
|
||||||
|
|
||||||
#if ! nssv_CPP11_OR_GREATER || nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 100, 141 )
|
#if ! nssv_CPP11_OR_GREATER || nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 100, 141 )
|
||||||
|
|
||||||
// accomodate for older compilers:
|
// accommodate for older compilers:
|
||||||
|
|
||||||
// ==
|
// ==
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator==(
|
nssv_constexpr bool operator==(
|
||||||
basic_string_view<CharT, Traits> lhs,
|
basic_string_view<CharT, Traits> lhs,
|
||||||
char const * rhs ) nssv_noexcept
|
CharT const * rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) == 0; }
|
{ return lhs.size() == detail::length( rhs ) && lhs.compare( rhs ) == 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator==(
|
nssv_constexpr bool operator==(
|
||||||
char const * lhs,
|
CharT const * lhs,
|
||||||
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return rhs.compare( lhs ) == 0; }
|
{ return detail::length( lhs ) == rhs.size() && rhs.compare( lhs ) == 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator==(
|
nssv_constexpr bool operator==(
|
||||||
|
@ -1036,38 +1139,38 @@ nssv_constexpr bool operator==(
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator!=(
|
nssv_constexpr bool operator!=(
|
||||||
basic_string_view<CharT, Traits> lhs,
|
basic_string_view<CharT, Traits> lhs,
|
||||||
char const * rhs ) nssv_noexcept
|
CharT const * rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) != 0; }
|
{ return !( lhs == rhs ); }
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator!=(
|
nssv_constexpr bool operator!=(
|
||||||
char const * lhs,
|
CharT const * lhs,
|
||||||
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return rhs.compare( lhs ) != 0; }
|
{ return !( lhs == rhs ); }
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator!=(
|
nssv_constexpr bool operator!=(
|
||||||
basic_string_view<CharT, Traits> lhs,
|
basic_string_view<CharT, Traits> lhs,
|
||||||
std::basic_string<CharT, Traits> rhs ) nssv_noexcept
|
std::basic_string<CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return lhs.size() != rhs.size() && lhs.compare( rhs ) != 0; }
|
{ return !( lhs == rhs ); }
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator!=(
|
nssv_constexpr bool operator!=(
|
||||||
std::basic_string<CharT, Traits> rhs,
|
std::basic_string<CharT, Traits> rhs,
|
||||||
basic_string_view<CharT, Traits> lhs ) nssv_noexcept
|
basic_string_view<CharT, Traits> lhs ) nssv_noexcept
|
||||||
{ return lhs.size() != rhs.size() || rhs.compare( lhs ) != 0; }
|
{ return !( lhs == rhs ); }
|
||||||
|
|
||||||
// <
|
// <
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator<(
|
nssv_constexpr bool operator<(
|
||||||
basic_string_view<CharT, Traits> lhs,
|
basic_string_view<CharT, Traits> lhs,
|
||||||
char const * rhs ) nssv_noexcept
|
CharT const * rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) < 0; }
|
{ return lhs.compare( rhs ) < 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator<(
|
nssv_constexpr bool operator<(
|
||||||
char const * lhs,
|
CharT const * lhs,
|
||||||
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return rhs.compare( lhs ) > 0; }
|
{ return rhs.compare( lhs ) > 0; }
|
||||||
|
|
||||||
|
@ -1088,12 +1191,12 @@ nssv_constexpr bool operator<(
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator<=(
|
nssv_constexpr bool operator<=(
|
||||||
basic_string_view<CharT, Traits> lhs,
|
basic_string_view<CharT, Traits> lhs,
|
||||||
char const * rhs ) nssv_noexcept
|
CharT const * rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) <= 0; }
|
{ return lhs.compare( rhs ) <= 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator<=(
|
nssv_constexpr bool operator<=(
|
||||||
char const * lhs,
|
CharT const * lhs,
|
||||||
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return rhs.compare( lhs ) >= 0; }
|
{ return rhs.compare( lhs ) >= 0; }
|
||||||
|
|
||||||
|
@ -1114,12 +1217,12 @@ nssv_constexpr bool operator<=(
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator>(
|
nssv_constexpr bool operator>(
|
||||||
basic_string_view<CharT, Traits> lhs,
|
basic_string_view<CharT, Traits> lhs,
|
||||||
char const * rhs ) nssv_noexcept
|
CharT const * rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) > 0; }
|
{ return lhs.compare( rhs ) > 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator>(
|
nssv_constexpr bool operator>(
|
||||||
char const * lhs,
|
CharT const * lhs,
|
||||||
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return rhs.compare( lhs ) < 0; }
|
{ return rhs.compare( lhs ) < 0; }
|
||||||
|
|
||||||
|
@ -1140,12 +1243,12 @@ nssv_constexpr bool operator>(
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator>=(
|
nssv_constexpr bool operator>=(
|
||||||
basic_string_view<CharT, Traits> lhs,
|
basic_string_view<CharT, Traits> lhs,
|
||||||
char const * rhs ) nssv_noexcept
|
CharT const * rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) >= 0; }
|
{ return lhs.compare( rhs ) >= 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits>
|
template< class CharT, class Traits>
|
||||||
nssv_constexpr bool operator>=(
|
nssv_constexpr bool operator>=(
|
||||||
char const * lhs,
|
CharT const * lhs,
|
||||||
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
basic_string_view<CharT, Traits> rhs ) nssv_noexcept
|
||||||
{ return rhs.compare( lhs ) <= 0; }
|
{ return rhs.compare( lhs ) <= 0; }
|
||||||
|
|
||||||
|
@ -1165,7 +1268,7 @@ nssv_constexpr bool operator>=(
|
||||||
|
|
||||||
#define nssv_BASIC_STRING_VIEW_I(T,U) typename std::decay< basic_string_view<T,U> >::type
|
#define nssv_BASIC_STRING_VIEW_I(T,U) typename std::decay< basic_string_view<T,U> >::type
|
||||||
|
|
||||||
#if nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 140, 150 )
|
#if defined(_MSC_VER) // issue 40
|
||||||
# define nssv_MSVC_ORDER(x) , int=x
|
# define nssv_MSVC_ORDER(x) , int=x
|
||||||
#else
|
#else
|
||||||
# define nssv_MSVC_ORDER(x) /*, int=x*/
|
# define nssv_MSVC_ORDER(x) /*, int=x*/
|
||||||
|
@ -1177,7 +1280,7 @@ template< class CharT, class Traits nssv_MSVC_ORDER(1) >
|
||||||
nssv_constexpr bool operator==(
|
nssv_constexpr bool operator==(
|
||||||
basic_string_view <CharT, Traits> lhs,
|
basic_string_view <CharT, Traits> lhs,
|
||||||
nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs ) nssv_noexcept
|
nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) == 0; }
|
{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
||||||
nssv_constexpr bool operator==(
|
nssv_constexpr bool operator==(
|
||||||
|
@ -1191,13 +1294,13 @@ template< class CharT, class Traits nssv_MSVC_ORDER(1) >
|
||||||
nssv_constexpr bool operator!= (
|
nssv_constexpr bool operator!= (
|
||||||
basic_string_view < CharT, Traits > lhs,
|
basic_string_view < CharT, Traits > lhs,
|
||||||
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
|
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
|
||||||
{ return lhs.size() != rhs.size() || lhs.compare( rhs ) != 0 ; }
|
{ return !( lhs == rhs ); }
|
||||||
|
|
||||||
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
||||||
nssv_constexpr bool operator!= (
|
nssv_constexpr bool operator!= (
|
||||||
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
|
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
|
||||||
basic_string_view < CharT, Traits > rhs ) nssv_noexcept
|
basic_string_view < CharT, Traits > rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) != 0 ; }
|
{ return !( lhs == rhs ); }
|
||||||
|
|
||||||
// <
|
// <
|
||||||
|
|
||||||
|
@ -1205,13 +1308,13 @@ template< class CharT, class Traits nssv_MSVC_ORDER(1) >
|
||||||
nssv_constexpr bool operator< (
|
nssv_constexpr bool operator< (
|
||||||
basic_string_view < CharT, Traits > lhs,
|
basic_string_view < CharT, Traits > lhs,
|
||||||
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
|
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) < 0 ; }
|
{ return lhs.compare( rhs ) < 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
||||||
nssv_constexpr bool operator< (
|
nssv_constexpr bool operator< (
|
||||||
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
|
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
|
||||||
basic_string_view < CharT, Traits > rhs ) nssv_noexcept
|
basic_string_view < CharT, Traits > rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) < 0 ; }
|
{ return lhs.compare( rhs ) < 0; }
|
||||||
|
|
||||||
// <=
|
// <=
|
||||||
|
|
||||||
|
@ -1219,13 +1322,13 @@ template< class CharT, class Traits nssv_MSVC_ORDER(1) >
|
||||||
nssv_constexpr bool operator<= (
|
nssv_constexpr bool operator<= (
|
||||||
basic_string_view < CharT, Traits > lhs,
|
basic_string_view < CharT, Traits > lhs,
|
||||||
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
|
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) <= 0 ; }
|
{ return lhs.compare( rhs ) <= 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
||||||
nssv_constexpr bool operator<= (
|
nssv_constexpr bool operator<= (
|
||||||
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
|
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
|
||||||
basic_string_view < CharT, Traits > rhs ) nssv_noexcept
|
basic_string_view < CharT, Traits > rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) <= 0 ; }
|
{ return lhs.compare( rhs ) <= 0; }
|
||||||
|
|
||||||
// >
|
// >
|
||||||
|
|
||||||
|
@ -1233,13 +1336,13 @@ template< class CharT, class Traits nssv_MSVC_ORDER(1) >
|
||||||
nssv_constexpr bool operator> (
|
nssv_constexpr bool operator> (
|
||||||
basic_string_view < CharT, Traits > lhs,
|
basic_string_view < CharT, Traits > lhs,
|
||||||
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
|
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) > 0 ; }
|
{ return lhs.compare( rhs ) > 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
||||||
nssv_constexpr bool operator> (
|
nssv_constexpr bool operator> (
|
||||||
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
|
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
|
||||||
basic_string_view < CharT, Traits > rhs ) nssv_noexcept
|
basic_string_view < CharT, Traits > rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) > 0 ; }
|
{ return lhs.compare( rhs ) > 0; }
|
||||||
|
|
||||||
// >=
|
// >=
|
||||||
|
|
||||||
|
@ -1247,13 +1350,13 @@ template< class CharT, class Traits nssv_MSVC_ORDER(1) >
|
||||||
nssv_constexpr bool operator>= (
|
nssv_constexpr bool operator>= (
|
||||||
basic_string_view < CharT, Traits > lhs,
|
basic_string_view < CharT, Traits > lhs,
|
||||||
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
|
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) >= 0 ; }
|
{ return lhs.compare( rhs ) >= 0; }
|
||||||
|
|
||||||
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
template< class CharT, class Traits nssv_MSVC_ORDER(2) >
|
||||||
nssv_constexpr bool operator>= (
|
nssv_constexpr bool operator>= (
|
||||||
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
|
nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
|
||||||
basic_string_view < CharT, Traits > rhs ) nssv_noexcept
|
basic_string_view < CharT, Traits > rhs ) nssv_noexcept
|
||||||
{ return lhs.compare( rhs ) >= 0 ; }
|
{ return lhs.compare( rhs ) >= 0; }
|
||||||
|
|
||||||
#undef nssv_MSVC_ORDER
|
#undef nssv_MSVC_ORDER
|
||||||
#undef nssv_BASIC_STRING_VIEW_I
|
#undef nssv_BASIC_STRING_VIEW_I
|
||||||
|
@ -1262,6 +1365,8 @@ nssv_constexpr bool operator>= (
|
||||||
|
|
||||||
// 24.4.4 Inserters and extractors:
|
// 24.4.4 Inserters and extractors:
|
||||||
|
|
||||||
|
#if ! nssv_CONFIG_NO_STREAM_INSERTION
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
template< class Stream >
|
template< class Stream >
|
||||||
|
@ -1311,6 +1416,8 @@ operator<<(
|
||||||
return detail::write_to_stream( os, sv );
|
return detail::write_to_stream( os, sv );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // nssv_CONFIG_NO_STREAM_INSERTION
|
||||||
|
|
||||||
// Several typedefs for common character types are provided:
|
// Several typedefs for common character types are provided:
|
||||||
|
|
||||||
typedef basic_string_view<char> string_view;
|
typedef basic_string_view<char> string_view;
|
||||||
|
@ -1459,7 +1566,9 @@ using sv_lite::operator<=;
|
||||||
using sv_lite::operator>;
|
using sv_lite::operator>;
|
||||||
using sv_lite::operator>=;
|
using sv_lite::operator>=;
|
||||||
|
|
||||||
|
#if ! nssv_CONFIG_NO_STREAM_INSERTION
|
||||||
using sv_lite::operator<<;
|
using sv_lite::operator<<;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
|
#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
|
||||||
using sv_lite::to_string;
|
using sv_lite::to_string;
|
||||||
|
|
Loading…
Reference in New Issue