11 #ifndef NONSTD_SV_LITE_H_INCLUDED 12 #define NONSTD_SV_LITE_H_INCLUDED 14 #define string_view_lite_MAJOR 1
15 #define string_view_lite_MINOR 6
16 #define string_view_lite_PATCH 0
21 #define nssv_STRINGIFY_( x ) #x 25 #define nssv_STRING_VIEW_DEFAULT 0
26 #define nssv_STRING_VIEW_NONSTD 1
27 #define nssv_STRING_VIEW_STD 2
32 # if __has_include
(<nonstd/string_view.tweak.hpp>) 33 # include <nonstd/string_view.tweak.hpp> 35 #define nssv_HAVE_TWEAK_HEADER 1
37 #define nssv_HAVE_TWEAK_HEADER 0
43 #if !defined( nssv_CONFIG_SELECT_STRING_VIEW ) 47 #if defined( nssv_CONFIG_SELECT_STD_STRING_VIEW ) || defined( nssv_CONFIG_SELECT_NONSTD_STRING_VIEW ) 48 # 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_... 51 #ifndef nssv_CONFIG_STD_SV_OPERATOR 52 # define nssv_CONFIG_STD_SV_OPERATOR 0
55 #ifndef nssv_CONFIG_USR_SV_OPERATOR 56 # define nssv_CONFIG_USR_SV_OPERATOR 1
59 #ifdef nssv_CONFIG_CONVERSION_STD_STRING 60 # define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS nssv_CONFIG_CONVERSION_STD_STRING 61 # define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS nssv_CONFIG_CONVERSION_STD_STRING 64 #ifndef nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS 65 # define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS 1
68 #ifndef nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 69 # define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 1
74 #ifndef nssv_CONFIG_NO_EXCEPTIONS 75 # if defined(__cpp_exceptions
) || defined(__EXCEPTIONS) || defined(_CPPUNWIND
) 76 # define nssv_CONFIG_NO_EXCEPTIONS 0
78 # define nssv_CONFIG_NO_EXCEPTIONS 1
85 #ifndef nssv_CPLUSPLUS 86 # if defined(_MSVC_LANG
) && !defined(__clang__
) 87 # define nssv_CPLUSPLUS (_MSC_VER == 1900
? 201103L
: _MSVC_LANG ) 89 # define nssv_CPLUSPLUS __cplusplus
103 # if __has_include( <string_view> ) 104 # define nssv_HAVE_STD_STRING_VIEW 1
106 # define nssv_HAVE_STD_STRING_VIEW 0
109 # define nssv_HAVE_STD_STRING_VIEW 0
123 #include <string_view> 127 #if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 131 template<
class CharT,
class Traits,
class Allocator = std::allocator<CharT> >
132 std::basic_string<CharT, Traits, Allocator>
133 to_string( std::basic_string_view<CharT, Traits> v, Allocator
const & a = Allocator() )
135 return std::basic_string<CharT,Traits, Allocator>( v.begin(), v.end(), a );
138 template<
class CharT,
class Traits,
class Allocator >
139 std::basic_string_view<CharT, Traits>
140 to_string_view( std::basic_string<CharT, Traits, Allocator>
const & s )
142 return std::basic_string_view<CharT, Traits>( s.data(), s.size() );
147 #if nssv_CONFIG_STD_SV_OPERATOR 149 using namespace std::literals::string_view_literals;
153 #if nssv_CONFIG_USR_SV_OPERATOR 155 inline namespace literals {
156 inline namespace string_view_literals {
159 constexpr std::string_view operator
"" _sv(
const char* str, size_t len )
noexcept 161 return std::string_view{ str, len };
164 constexpr std::u16string_view operator
"" _sv(
const char16_t* str, size_t len )
noexcept 166 return std::u16string_view{ str, len };
169 constexpr std::u32string_view operator
"" _sv(
const char32_t* str, size_t len )
noexcept 171 return std::u32string_view{ str, len };
174 constexpr std::wstring_view operator
"" _sv(
const wchar_t* str, size_t len )
noexcept 176 return std::wstring_view{ str, len };
189 using std::string_view;
190 using std::wstring_view;
191 using std::u16string_view;
192 using std::u32string_view;
193 using std::basic_string_view;
197 using std::operator==;
198 using std::operator!=;
199 using std::operator<;
200 using std::operator<=;
201 using std::operator>;
202 using std::operator>=;
204 using std::operator<<;
228 #if defined(_MSC_VER
) && !defined(__clang__
) 229 # define nssv_COMPILER_MSVC_VER (_MSC_VER ) 230 # define nssv_COMPILER_MSVC_VERSION (_MSC_VER / 10
- 10
* ( 5
+ (_MSC_VER < 1900
) ) ) 232 # define nssv_COMPILER_MSVC_VER 0
233 # define nssv_COMPILER_MSVC_VERSION 0
236 #define nssv_COMPILER_VERSION( major, minor, patch ) ( 10
* ( 10
* (major) + (minor) ) + (patch) ) 238 #if defined( __apple_build_version__ ) 239 # define nssv_COMPILER_APPLECLANG_VERSION nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__) 240 # define nssv_COMPILER_CLANG_VERSION 0
241 #elif defined( __clang__
) 242 # define nssv_COMPILER_APPLECLANG_VERSION 0
243 # define nssv_COMPILER_CLANG_VERSION nssv_COMPILER_VERSION(__clang_major__
, __clang_minor__
, __clang_patchlevel__
) 245 # define nssv_COMPILER_APPLECLANG_VERSION 0
246 # define nssv_COMPILER_CLANG_VERSION 0
249 #if defined(__GNUC__) && !defined(__clang__
) 250 # define nssv_COMPILER_GNUC_VERSION nssv_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) 252 # define nssv_COMPILER_GNUC_VERSION 0
256 #define nssv_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) ) 261 # define nssv_HAS_CPP0X _HAS_CPP0X 263 # define nssv_HAS_CPP0X 0
269 # undef nssv_CPP11_OR_GREATER 270 # define nssv_CPP11_OR_GREATER 1
297 # define nssv_HAVE_STD_DEFINED_LITERALS nssv_CPP11_140 299 # define nssv_HAVE_STD_DEFINED_LITERALS 0
336 # define nssv_HAVE_BUILTIN( x ) __has_builtin( x ) 338 # define nssv_HAVE_BUILTIN( x ) 0
342 # define nssv_BUILTIN_MEMCMP __builtin_memcmp 344 # define nssv_BUILTIN_MEMCMP memcmp 348 # define nssv_BUILTIN_STRLEN __builtin_strlen 350 # define nssv_BUILTIN_STRLEN strlen 356 # define nssv_constexpr constexpr 358 # define nssv_constexpr 362 # define nssv_constexpr14 constexpr 364 # define nssv_constexpr14 368 # define nssv_explicit explicit 370 # define nssv_explicit 374 # define nssv_inline_ns inline 376 # define nssv_inline_ns 380 # define nssv_noexcept noexcept 382 # define nssv_noexcept 394 # define nssv_nullptr nullptr 396 # define nssv_nullptr NULL 400 # define nssv_nodiscard [[nodiscard]] 402 # define nssv_nodiscard 415 # include <stdexcept> 419 # include <type_traits> 424 #if defined(__clang__
) 425 # pragma clang diagnostic ignored "-Wreserved-user-defined-literal" 426 # pragma clang diagnostic push 427 # pragma clang diagnostic ignored "-Wuser-defined-literals" 428 #elif defined(__GNUC__) 429 # pragma GCC diagnostic push 430 # pragma GCC diagnostic ignored "-Wliteral-suffix" 434 # define nssv_SUPPRESS_MSGSL_WARNING(expr) [[gsl::suppress(expr)]] 435 # define nssv_SUPPRESS_MSVC_WARNING(code, descr) __pragma(warning(suppress: code) ) 436 # define nssv_DISABLE_MSVC_WARNINGS(codes) __pragma(warning(push)) __pragma(warning(disable: codes)) 438 # define nssv_SUPPRESS_MSGSL_WARNING(expr) 439 # define nssv_SUPPRESS_MSVC_WARNING(code, descr) 440 # define nssv_DISABLE_MSVC_WARNINGS(codes) 443 #if defined(__clang__
) 444 # define nssv_RESTORE_WARNINGS() _Pragma("clang diagnostic pop") 445 #elif defined(__GNUC__) 446 # define nssv_RESTORE_WARNINGS() _Pragma("GCC diagnostic pop") 447 #elif nssv_COMPILER_MSVC_VERSION >= 140
448 # define nssv_RESTORE_WARNINGS() __pragma(warning(pop )) 450 # define nssv_RESTORE_WARNINGS() 471 template<
typename CharT >
472 inline nssv_constexpr14 int compare( CharT
const * s1, CharT
const * s2, std::size_t count )
474 while ( count-- != 0 )
476 if ( *s1 < *s2 )
return -1;
477 if ( *s1 > *s2 )
return +1;
487 inline nssv_constexpr14 int compare(
char const * s1,
char const * s2, std::size_t count )
505 #if defined(__OPTIMIZE__) 510 template<
typename CharT >
511 inline nssv_constexpr std::size_t length( CharT * s, std::size_t result = 0 )
513 return *s ==
'\0' ? result : length( s + 1, result + 1 );
520 template<
typename CharT >
523 std::size_t result = 0;
524 while ( *s++ !=
'\0' )
538 class Traits = std::char_traits<CharT>
540 class basic_string_view;
551 class basic_string_view
556 typedef Traits traits_type;
557 typedef CharT value_type;
559 typedef CharT * pointer;
560 typedef CharT
const * const_pointer;
561 typedef CharT & reference;
562 typedef CharT
const & const_reference;
564 typedef const_pointer iterator;
565 typedef const_pointer const_iterator;
566 typedef std::reverse_iterator< const_iterator > reverse_iterator;
567 typedef std::reverse_iterator< const_iterator > const_reverse_iterator;
569 typedef std::size_t size_type;
570 typedef std::ptrdiff_t difference_type;
582 nssv_constexpr basic_string_view( basic_string_view
const & other ) nssv_noexcept
583 : data_( other.data_)
584 , size_( other.size_)
596 , size_( Traits::length(s) )
598 , size_( detail::length(s) )
600 , size_( Traits::length(s) )
609 nssv_constexpr14 basic_string_view & operator=( basic_string_view
const & other ) nssv_noexcept
647 return data_at( pos );
653 assert( pos < size() );
657 throw std::out_of_range(
"nonstd::string_view::at()");
660 return data_at( pos );
663 nssv_constexpr const_reference front()
const {
return data_at( 0 ); }
664 nssv_constexpr const_reference back()
const {
return data_at( size() - 1 ); }
672 assert( n <= size() );
679 assert( n <= size() );
686 swap( data_, other.data_ );
687 swap( size_, other.size_ );
692 size_type copy( CharT * dest, size_type n, size_type pos = 0 )
const 695 assert( pos <= size() );
699 throw std::out_of_range(
"nonstd::string_view::copy()");
702 const size_type rlen = (std::min)( n, size() - pos );
704 (
void) Traits::copy( dest, data() + pos, rlen );
709 nssv_constexpr14 basic_string_view substr( size_type pos = 0, size_type n = npos )
const 712 assert( pos <= size() );
716 throw std::out_of_range(
"nonstd::string_view::substr()");
719 return basic_string_view( data() + pos, (std::min)( n, size() - pos ) );
727 if (
const int result = Traits::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )
729 if (
const int result = detail::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )
735 return size() == other.size() ? 0 : size() < other.size() ? -1 : 1;
738 nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other )
const 740 return substr( pos1, n1 ).compare( other );
743 nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other, size_type pos2, size_type n2 )
const 745 return substr( pos1, n1 ).compare( other.substr( pos2, n2 ) );
750 return compare( basic_string_view( s ) );
753 nssv_constexpr int compare( size_type pos1, size_type n1, CharT
const * s )
const 755 return substr( pos1, n1 ).compare( basic_string_view( s ) );
758 nssv_constexpr int compare( size_type pos1, size_type n1, CharT
const * s, size_type n2 )
const 760 return substr( pos1, n1 ).compare( basic_string_view( s, n2 ) );
769 return size() >= v.size() && compare( 0, v.size(), v ) == 0;
774 return starts_with( basic_string_view( &c, 1 ) );
779 return starts_with( basic_string_view( s ) );
786 return size() >= v.size() && compare( size() - v.size(), npos, v ) == 0;
791 return ends_with( basic_string_view( &c, 1 ) );
796 return ends_with( basic_string_view( s ) );
803 return assert( v.size() == 0 || v.data() !=
nssv_nullptr )
806 : to_pos( std::search( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) );
811 return find( basic_string_view( &c, 1 ), pos );
814 nssv_constexpr14 size_type find( CharT
const * s, size_type pos, size_type n )
const 816 return find( basic_string_view( s, n ), pos );
821 return find( basic_string_view( s ), pos );
828 if ( size() < v.size() )
835 return (std::min)( size(), pos );
838 const_iterator last = cbegin() + (std::min)( size() - v.size(), pos ) + v.size();
839 const_iterator result = std::find_end( cbegin(), last, v.cbegin(), v.cend(), Traits::eq );
841 return result != last ? size_type( result - cbegin() ) : npos;
846 return rfind( basic_string_view( &c, 1 ), pos );
849 nssv_constexpr14 size_type rfind( CharT
const * s, size_type pos, size_type n )
const 851 return rfind( basic_string_view( s, n ), pos );
854 nssv_constexpr14 size_type rfind( CharT
const * s, size_type pos = npos )
const 856 return rfind( basic_string_view( s ), pos );
865 : to_pos( std::find_first_of( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) );
870 return find_first_of( basic_string_view( &c, 1 ), pos );
873 nssv_constexpr size_type find_first_of( CharT
const * s, size_type pos, size_type n )
const 875 return find_first_of( basic_string_view( s, n ), pos );
878 nssv_constexpr size_type find_first_of( CharT
const * s, size_type pos = 0 )
const 880 return find_first_of( basic_string_view( s ), pos );
890 ? find_last_of( v, size() - 1 )
891 : to_pos( std::find_first_of( const_reverse_iterator( cbegin() + pos + 1 ), crend(), v.cbegin(), v.cend(), Traits::eq ) );
896 return find_last_of( basic_string_view( &c, 1 ), pos );
899 nssv_constexpr size_type find_last_of( CharT
const * s, size_type pos, size_type count )
const 901 return find_last_of( basic_string_view( s, count ), pos );
904 nssv_constexpr size_type find_last_of( CharT
const * s, size_type pos = npos )
const 906 return find_last_of( basic_string_view( s ), pos );
915 : to_pos( std::find_if( cbegin() + pos, cend(), not_in_view( v ) ) );
920 return find_first_not_of( basic_string_view( &c, 1 ), pos );
923 nssv_constexpr size_type find_first_not_of( CharT
const * s, size_type pos, size_type count )
const 925 return find_first_not_of( basic_string_view( s, count ), pos );
928 nssv_constexpr size_type find_first_not_of( CharT
const * s, size_type pos = 0 )
const 930 return find_first_not_of( basic_string_view( s ), pos );
940 ? find_last_not_of( v, size() - 1 )
941 : to_pos( std::find_if( const_reverse_iterator( cbegin() + pos + 1 ), crend(), not_in_view( v ) ) );
946 return find_last_not_of( basic_string_view( &c, 1 ), pos );
949 nssv_constexpr size_type find_last_not_of( CharT
const * s, size_type pos, size_type count )
const 951 return find_last_not_of( basic_string_view( s, count ), pos );
954 nssv_constexpr size_type find_last_not_of( CharT
const * s, size_type pos = npos )
const 956 return find_last_not_of( basic_string_view( s ), pos );
962 static nssv_constexpr size_type npos = size_type(-1);
964 enum : size_type { npos = size_type(-1) };
966 enum { npos = size_type(-1) };
972 const basic_string_view v;
974 nssv_constexpr explicit not_in_view( basic_string_view v_ ) : v( v_ ) {}
978 return npos == v.find_first_of( c );
984 return it == cend() ? npos : size_type( it - cbegin() );
987 nssv_constexpr size_type to_pos( const_reverse_iterator it )
const 989 return it == crend() ? npos : size_type( crend() - it - 1 );
997 return assert( pos < size() ), data_[pos];
1002 const_pointer data_;
1008 template<
class Allocator >
1009 basic_string_view( std::basic_string<CharT, Traits, Allocator>
const & s )
nssv_noexcept 1016 template<
class Allocator >
1017 explicit operator std::basic_string<CharT, Traits, Allocator>()
const 1019 return to_string( Allocator() );
1026 template<
class Allocator = std::allocator<CharT> >
1027 std::basic_string<CharT, Traits, Allocator>
1028 to_string( Allocator
const & a = Allocator() )
const 1030 return std::basic_string<CharT, Traits, Allocator>( begin(), end(), a );
1035 std::basic_string<CharT, Traits>
1038 return std::basic_string<CharT, Traits>( begin(), end() );
1041 template<
class Allocator >
1042 std::basic_string<CharT, Traits, Allocator>
1043 to_string( Allocator
const & a )
const 1045 return std::basic_string<CharT, Traits, Allocator>( begin(), end(), a );
1060 template<
class CharT,
class Traits >
1062 basic_string_view <CharT, Traits> lhs,
1064 {
return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
1066 template<
class CharT,
class Traits >
1068 basic_string_view <CharT, Traits> lhs,
1070 {
return !( lhs == rhs ); }
1072 template<
class CharT,
class Traits >
1074 basic_string_view <CharT, Traits> lhs,
1076 {
return lhs.compare( rhs ) < 0; }
1078 template<
class CharT,
class Traits >
1080 basic_string_view <CharT, Traits> lhs,
1082 {
return lhs.compare( rhs ) <= 0; }
1084 template<
class CharT,
class Traits >
1086 basic_string_view <CharT, Traits> lhs,
1088 {
return lhs.compare( rhs ) > 0; }
1090 template<
class CharT,
class Traits >
1092 basic_string_view <CharT, Traits> lhs,
1094 {
return lhs.compare( rhs ) >= 0; }
1137 {
return !(
lhs ==
rhs ); }
1143 {
return !(
lhs ==
rhs ); }
1149 {
return !(
lhs ==
rhs ); }
1155 {
return !(
lhs ==
rhs ); }
1263 #define nssv_BASIC_STRING_VIEW_I(T,U) typename std::decay< basic_string_view<T,U> >::type 1266 # define nssv_MSVC_ORDER(x) , int=x 1268 # define nssv_MSVC_ORDER(x) 1273 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
1275 basic_string_view <CharT, Traits> lhs,
1277 {
return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
1279 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
1281 nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
1283 {
return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
1287 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
1289 basic_string_view < CharT, Traits > lhs,
1290 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs )
nssv_noexcept 1291 {
return !( lhs == rhs ); }
1293 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
1295 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
1297 {
return !( lhs == rhs ); }
1301 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
1303 basic_string_view < CharT, Traits > lhs,
1304 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs )
nssv_noexcept 1305 {
return lhs.compare( rhs ) < 0; }
1307 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
1309 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
1311 {
return lhs.compare( rhs ) < 0; }
1315 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
1317 basic_string_view < CharT, Traits > lhs,
1318 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs )
nssv_noexcept 1319 {
return lhs.compare( rhs ) <= 0; }
1321 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
1323 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
1325 {
return lhs.compare( rhs ) <= 0; }
1329 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
1331 basic_string_view < CharT, Traits > lhs,
1332 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs )
nssv_noexcept 1333 {
return lhs.compare( rhs ) > 0; }
1335 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
1337 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
1339 {
return lhs.compare( rhs ) > 0; }
1343 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
1345 basic_string_view < CharT, Traits > lhs,
1346 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs )
nssv_noexcept 1347 {
return lhs.compare( rhs ) >= 0; }
1349 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
1351 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
1353 {
return lhs.compare( rhs ) >= 0; }
1355 #undef nssv_MSVC_ORDER 1356 #undef nssv_BASIC_STRING_VIEW_I 1364 template<
class Stream >
1365 void write_padding( Stream & os, std::streamsize n )
1367 for ( std::streamsize i = 0; i < n; ++i )
1368 os.rdbuf()->sputc( os.fill() );
1371 template<
class Stream,
class View >
1372 Stream & write_to_stream( Stream & os, View
const & sv )
1374 typename Stream::sentry sentry( os );
1379 const std::streamsize length =
static_cast<std::streamsize>( sv.length() );
1382 const bool pad = ( length < os.width() );
1383 const bool left_pad = pad && ( os.flags() & std::ios_base::adjustfield ) == std::ios_base::right;
1386 write_padding( os, os.width() - length );
1389 os.rdbuf()->sputn( sv.begin(), length );
1391 if ( pad && !left_pad )
1392 write_padding( os, os.width() - length );
1402 template<
class CharT,
class Traits >
1403 std::basic_ostream<CharT, Traits> &
1405 std::basic_ostream<CharT, Traits>& os,
1406 basic_string_view <CharT, Traits> sv )
1413 typedef basic_string_view<
char> string_view;
1414 typedef basic_string_view<
wchar_t> wstring_view;
1416 typedef basic_string_view<
char16_t> u16string_view;
1417 typedef basic_string_view<
char32_t> u32string_view;
1434 nssv_constexpr nonstd::sv_lite::string_view operator
"" sv(
const char* str, size_t len ) nssv_noexcept
1436 return nonstd::sv_lite::string_view{ str, len };
1439 nssv_constexpr nonstd::sv_lite::u16string_view operator
"" sv(
const char16_t* str, size_t len ) nssv_noexcept
1441 return nonstd::sv_lite::u16string_view{ str, len };
1444 nssv_constexpr nonstd::sv_lite::u32string_view operator
"" sv(
const char32_t* str, size_t len ) nssv_noexcept
1446 return nonstd::sv_lite::u32string_view{ str, len };
1449 nssv_constexpr nonstd::sv_lite::wstring_view operator
"" sv(
const wchar_t* str, size_t len ) nssv_noexcept
1451 return nonstd::sv_lite::wstring_view{ str, len };
1460 return nonstd::sv_lite::string_view{ str, len };
1465 return nonstd::sv_lite::u16string_view{ str, len };
1470 return nonstd::sv_lite::u32string_view{ str, len };
1475 return nonstd::sv_lite::wstring_view{ str, len };
1497 template<
class CharT,
class Traits,
class Allocator = std::allocator<CharT> >
1498 std::basic_string<CharT, Traits, Allocator>
1499 to_string( basic_string_view<CharT, Traits> v, Allocator
const & a = Allocator() )
1539 using sv_lite::basic_string_view;
1544 using sv_lite::u16string_view;
1547 using sv_lite::u32string_view;
1563 using sv_lite::to_string_view;
1575 #include <functional> 1580 struct hash< nonstd::string_view >
1583 std::size_t operator()( nonstd::string_view v )
const nssv_noexcept 1585 return std::hash<std::string>()( std::string( v.data(), v.size() ) );
#define nssv_CPP14_OR_GREATER
#define nssv_HAVE_BUILTIN_CE
#define nssv_CPP11_OR_GREATER_
#define nssv_BETWEEN(v, lo, hi)
#define nssv_CONFIG_STD_SV_OPERATOR
#define nssv_HAVE_USER_DEFINED_LITERALS
#define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
#define nssv_HAVE_STD_STRING_VIEW
basic_string_view< CharT, Traits > to_string_view(std::basic_string< CharT, Traits, Allocator > const &s)
#define nssv_HAVE_EXPLICIT_CONVERSION
#define nssv_HAVE_BUILTIN(x)
#define nssv_COMPILER_VERSION(major, minor, patch)
#define nssv_HAVE_CONSTEXPR_11
#define nssv_COMPILER_GNUC_VERSION
#define nssv_HAVE_BUILTIN_MEMCMP
#define nssv_STRINGIFY_(x)
#define nssv_HAVE_WCHAR32_T
#define nssv_STRING_VIEW_DEFAULT
#define string_view_lite_MINOR
#define nssv_HAVE_WCHAR16_T
#define string_view_lite_PATCH
#define nssv_HAVE_INLINE_NAMESPACE
#define nssv_RESTORE_WARNINGS()
#define nssv_COMPILER_APPLECLANG_VERSION
#define nssv_CPP17_OR_GREATER
#define nssv_STRINGIFY( x)
#define nssv_STRING_VIEW_STD
#define nssv_BUILTIN_MEMCMP
#define nssv_HAVE_BUILTIN_VER
#define nssv_CPP20_OR_GREATER
#define nssv_DISABLE_MSVC_WARNINGS(codes)
#define nssv_BUILTIN_STRLEN
#define string_view_lite_MAJOR
#define nssv_HAVE_STARTS_WITH
#define nssv_CONFIG_SELECT_STRING_VIEW
constexpr result_type operator()(argument_type const &arg) const
#define nssv_COMPILER_CLANG_VERSION
#define nssv_HAVE_CONSTEXPR_14
#define nssv_HAVE_NODISCARD
#define nssv_CONFIG_USR_SV_OPERATOR
#define nssv_COMPILER_MSVC_VER
#define nssv_HAVE_NULLPTR
#define nssv_STRING_VIEW_NONSTD
#define nssv_CONFIG_NO_EXCEPTIONS
#define nssv_CPP11_OR_GREATER
#define nssv_HAVE_STD_HASH
#define nssv_HAVE_BUILTIN_STRLEN
#define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
std::basic_string< CharT, Traits, Allocator > to_string(basic_string_view< CharT, Traits > v, Allocator const &a)
#define nssv_COMPILER_MSVC_VERSION
#define nssv_HAVE_NOEXCEPT
#define nssv_USES_STD_STRING_VIEW
#define nssv_HAVE_STD_DEFINED_LITERALS