17 #ifndef NONSTD_SV_LITE_H_INCLUDED 18 #define NONSTD_SV_LITE_H_INCLUDED 20 #define string_view_lite_VERSION "0.2.0" 24 #if nssv_CONFIG_SELECT_STD_STRING_VIEW 25 # define nssv_USES_STD_STRING_VIEW 1
26 #elif nssv_CONFIG_SELECT_NONSTD_STRING_VIEW 27 # define nssv_USES_STD_STRING_VIEW 0
30 #if nssv_CONFIG_SELECT_STD_STRING_VIEW && nssv_CONFIG_SELECT_NONSTD_STRING_VIEW 31 # error Please define none or one of nssv_CONFIG_SELECT_STD_STRING_VIEW, nssv_CONFIG_SELECT_NONSTD_STRING_VIEW to 1
, but not both. 34 #ifndef nssv_CONFIG_STD_SV_OPERATOR 35 # define nssv_CONFIG_STD_SV_OPERATOR 0
38 #ifndef nssv_CONFIG_USR_SV_OPERATOR 39 # define nssv_CONFIG_USR_SV_OPERATOR 1
42 #ifdef nssv_CONFIG_CONVERSION_STD_STRING 43 # define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS nssv_CONFIG_CONVERSION_STD_STRING 44 # define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS nssv_CONFIG_CONVERSION_STD_STRING 47 #ifndef nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS 48 # define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS 1
50 #ifndef nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 51 # define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 1
58 # define nssv_MSVC_LANG _MSVC_LANG
60 # define nssv_MSVC_LANG 0
63 #define nssv_CPP11 (__cplusplus
== 201103L
) 64 #define nssv_CPP11_OR_GREATER (__cplusplus
>= 201103L
|| nssv_MSVC_LANG >= 201103L
) 65 #define nssv_CPP14_OR_GREATER (__cplusplus
>= 201402L
|| nssv_MSVC_LANG >= 201703L
) 66 #define nssv_CPP17_OR_GREATER (__cplusplus
>= 201703L
|| nssv_MSVC_LANG >= 201703L
) 67 #define nssv_CPP20_OR_GREATER (__cplusplus
>= 202000L
|| nssv_MSVC_LANG >= 202000L
) 71 #if defined( __has_include
) 72 # define nssv_HAS_INCLUDE( arg ) __has_include( arg ) 74 # define nssv_HAS_INCLUDE( arg ) 0
79 #ifndef nssv_USES_STD_STRING_VIEW 92 #include <string_view> 96 #if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 100 template<
class CharT,
class Traits,
class Allocator = std::allocator<CharT> >
101 std::basic_string<CharT, Traits, Allocator>
102 to_string( std::basic_string_view<CharT, Traits> v, Allocator
const & a = Allocator() )
104 return std::basic_string<CharT,Traits, Allocator>( v.begin(), v.end(), a );
107 template<
class CharT,
class Traits,
class Allocator >
108 std::basic_string_view<CharT, Traits>
109 to_string_view( std::basic_string<CharT, Traits, Allocator>
const & s )
111 return std::basic_string_view<CharT, Traits>( s.data(), s.size() );
116 #if nssv_CONFIG_STD_SV_OPERATOR 118 using namespace std::literals::string_view_literals;
122 #if nssv_CONFIG_USR_SV_OPERATOR 124 inline namespace literals {
125 inline namespace string_view_literals {
128 constexpr std::string_view operator
"" _sv(
const char* str, size_t len )
noexcept 130 return std::string_view{ str, len };
133 constexpr std::u16string_view operator
"" _sv(
const char16_t* str, size_t len )
noexcept 135 return std::u16string_view{ str, len };
138 constexpr std::u32string_view operator
"" _sv(
const char32_t* str, size_t len )
noexcept 140 return std::u32string_view{ str, len };
143 constexpr std::wstring_view operator
"" _sv(
const wchar_t* str, size_t len )
noexcept 145 return std::wstring_view{ str, len };
158 using std::string_view;
159 using std::wstring_view;
160 using std::u16string_view;
161 using std::u32string_view;
162 using std::basic_string_view;
166 using std::operator==;
167 using std::operator!=;
168 using std::operator<;
169 using std::operator<=;
170 using std::operator>;
171 using std::operator>=;
173 using std::operator<<;
196 #if defined(_MSC_VER
) && !defined(__clang__
) 197 # define nssv_COMPILER_MSVC_VERSION (_MSC_VER / 10
- 10
* ( 5
+ (_MSC_VER < 1900
)) ) 199 # define nssv_COMPILER_MSVC_VERSION 0
202 #define nssv_COMPILER_VERSION( major, minor, patch ) (10
* ( 10
* major + minor) + patch) 204 #if defined __clang__
205 # define nssv_COMPILER_CLANG_VERSION nssv_COMPILER_VERSION(__clang_major__
, __clang_minor__
, __clang_patchlevel__
) 207 # define nssv_COMPILER_CLANG_VERSION 0
211 # define nssv_COMPILER_GNUC_VERSION nssv_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) 213 # define nssv_COMPILER_GNUC_VERSION 0
217 #define nssv_BETWEEN( v, lo, hi ) ( lo <= v && v < hi ) 222 # define nssv_HAVE_AUTO 1
223 # define nssv_HAVE_NULLPTR 1
224 # define nssv_HAVE_STATIC_ASSERT 1
225 # define nssv_HAVE_WCHAR16_T 1
226 # define nssv_HAVE_WCHAR32_T 1
230 # define nssv_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG 1
231 # define nssv_HAVE_INITIALIZER_LIST 1
235 # define nssv_HAVE_ALIAS_TEMPLATE 1
236 # define nssv_HAVE_CONSTEXPR_11 1
237 # define nssv_HAVE_ENUM_CLASS 1
238 # define nssv_HAVE_EXPLICIT_CONVERSION 1
239 # define nssv_HAVE_INLINE_NAMESPACE 1
240 # define nssv_HAVE_IS_DEFAULT 1
241 # define nssv_HAVE_IS_DELETE 1
242 # define nssv_HAVE_NOEXCEPT 1
243 # define nssv_HAVE_REF_QUALIFIER 1
244 # define nssv_HAVE_UNICODE_LITERALS 1
245 # define nssv_HAVE_USER_DEFINED_LITERALS 1
247 # define nssv_HAVE_STD_DEFINED_LITERALS 1
254 # define nssv_HAVE_CONSTEXPR_14 1
260 # define nssv_HAVE_NODISCARD 1
266 # undef nssv_CPP11_OR_GREATER 267 # define nssv_CPP11_OR_GREATER 1
273 # define nssv_HAVE_STD_HASH 1
278 #if nssv_HAVE_CONSTEXPR_11
279 # define nssv_constexpr constexpr 281 # define nssv_constexpr 284 #if nssv_HAVE_CONSTEXPR_14
285 # define nssv_constexpr14 constexpr 287 # define nssv_constexpr14 290 #if nssv_HAVE_EXPLICIT_CONVERSION
291 # define nssv_explicit explicit 293 # define nssv_explicit 296 #if nssv_HAVE_INLINE_NAMESPACE
297 # define nssv_inline_ns inline 299 # define nssv_inline_ns 302 #if nssv_HAVE_NOEXCEPT
303 # define nssv_noexcept noexcept 305 # define nssv_noexcept 308 #if nssv_HAVE_REF_QUALIFIER
309 # define nssv_ref_qual & 310 # define nssv_refref_qual && 312 # define nssv_ref_qual 313 # define nssv_refref_qual 316 #if nssv_HAVE_NULLPTR
317 # define nssv_nullptr nullptr 319 # define nssv_nullptr NULL 322 #if nssv_HAVE_NODISCARD 323 # define nssv_nodiscard [[nodiscard]] 325 # define nssv_nodiscard 339 # include <type_traits> 345 # pragma clang diagnostic ignored "-Wreserved-user-defined-literal" 346 # pragma clang diagnostic push 347 # pragma clang diagnostic ignored "-Wuser-defined-literals" 348 #elif defined __GNUC__ 349 # pragma GCC diagnostic push 350 # pragma GCC diagnostic ignored "-Wliteral-suffix" 354 # define nssv_SUPPRESS_MSGSL_WARNING(expr) [[gsl::suppress(expr)]] 355 # define nssv_SUPPRESS_MSVC_WARNING(code, descr) __pragma(warning(suppress: code) ) 356 # define nssv_DISABLE_MSVC_WARNINGS(codes) __pragma(warning(push)) __pragma(warning(disable: codes)) 358 # define nssv_SUPPRESS_MSGSL_WARNING(expr) 359 # define nssv_SUPPRESS_MSVC_WARNING(code, descr) 360 # define nssv_DISABLE_MSVC_WARNINGS(codes) 364 # define nssv_RESTORE_WARNINGS() _Pragma("clang diagnostic pop") 365 #elif defined __GNUC__ 366 # define nssv_RESTORE_WARNINGS() _Pragma("GCC diagnostic pop") 367 #elif nssv_COMPILER_MSVC_VERSION >= 140
368 # define nssv_RESTORE_WARNINGS() __pragma(warning(pop )) 370 # define nssv_RESTORE_WARNINGS() 389 class Traits = std::char_traits<CharT>
391 class basic_string_view;
402 class basic_string_view
407 typedef Traits traits_type;
408 typedef CharT value_type;
410 typedef CharT * pointer;
411 typedef CharT
const * const_pointer;
412 typedef CharT & reference;
413 typedef CharT
const & const_reference;
415 typedef const_pointer iterator;
416 typedef const_pointer const_iterator;
417 typedef std::reverse_iterator< const_iterator > reverse_iterator;
418 typedef std::reverse_iterator< const_iterator > const_reverse_iterator;
420 typedef std::size_t size_type;
421 typedef std::ptrdiff_t difference_type;
433 nssv_constexpr basic_string_view( basic_string_view
const & other ) nssv_noexcept
434 : data_( other.data_)
435 , size_( other.size_)
439 nssv_constexpr basic_string_view( CharT
const * s, size_type count )
446 , size_( Traits::length(s) )
454 nssv_constexpr14 basic_string_view & operator=( basic_string_view
const & other ) nssv_noexcept
492 return assert( pos < size() ),
502 throw std::out_of_range(
"nonst::string_view::at()");
505 nssv_constexpr const_reference front()
const {
return assert( !empty() ), data_[0]; }
506 nssv_constexpr const_reference back()
const {
return assert( !empty() ), data_[size() - 1]; }
514 assert( n <= size() );
521 assert( n <= size() );
528 swap( data_, other.data_ );
529 swap( size_, other.size_ );
534 size_type copy( CharT * dest, size_type n, size_type pos = 0 )
const 537 throw std::out_of_range(
"nonst::string_view::copy()");
539 const size_type rlen = std::min( n, size() - pos );
541 (
void) Traits::copy( dest, data() + pos, rlen );
546 nssv_constexpr14 basic_string_view substr( size_type pos = 0, size_type n = npos )
const 549 throw std::out_of_range(
"nonst::string_view::copy()");
551 return basic_string_view( data() + pos, std::min( n, size() - pos ) );
558 if (
const int result = Traits::compare( data(), other.data(), std::min( size(), other.size() ) ) )
561 return size() == other.size() ? 0 : size() < other.size() ? -1 : 1;
564 nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other )
const 566 return substr( pos1, n1 ).compare( other );
569 nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other, size_type pos2, size_type n2 )
const 571 return substr( pos1, n1 ).compare( other.substr( pos2, n2 ) );
576 return compare( basic_string_view( s ) );
579 nssv_constexpr int compare( size_type pos1, size_type n1, CharT
const * s )
const 581 return substr( pos1, n1 ).compare( basic_string_view( s ) );
584 nssv_constexpr int compare( size_type pos1, size_type n1, CharT
const * s, size_type n2 )
const 586 return substr( pos1, n1 ).compare( basic_string_view( s, n2 ) );
595 return size() >= v.size() && compare( 0, v.size(), v ) == 0;
600 return starts_with( basic_string_view( &c, 1 ) );
605 return starts_with( basic_string_view( s ) );
612 return size() >= v.size() && compare( size() - v.size(), npos, v ) == 0;
617 return ends_with( basic_string_view( &c, 1 ) );
622 return ends_with( basic_string_view( s ) );
629 return assert( v.size() == 0 || v.data() !=
nssv_nullptr )
632 : to_pos( std::search( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) );
637 return find( basic_string_view( &c, 1 ), pos );
640 nssv_constexpr14 size_type find( CharT
const * s, size_type pos, size_type n )
const 642 return find( basic_string_view( s, n ), pos );
647 return find( basic_string_view( s ), pos );
654 if ( size() < v.size() )
658 return std::min( size(), pos );
660 const_iterator last = cbegin() + std::min( size() - v.size(), pos ) + v.size();
661 const_iterator result = std::find_end( cbegin(), last, v.cbegin(), v.cend(), Traits::eq );
663 return result != last ? size_type( result - cbegin() ) : npos;
668 return rfind( basic_string_view( &c, 1 ), pos );
671 nssv_constexpr14 size_type rfind( CharT
const * s, size_type pos, size_type n )
const 673 return rfind( basic_string_view( s, n ), pos );
676 nssv_constexpr14 size_type rfind( CharT
const * s, size_type pos = npos )
const 678 return rfind( basic_string_view( s ), pos );
687 : to_pos( std::find_first_of( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) );
692 return find_first_of( basic_string_view( &c, 1 ), pos );
695 nssv_constexpr size_type find_first_of( CharT
const * s, size_type pos, size_type n )
const 697 return find_first_of( basic_string_view( s, n ), pos );
700 nssv_constexpr size_type find_first_of( CharT
const * s, size_type pos = 0 )
const 702 return find_first_of( basic_string_view( s ), pos );
710 ? find_last_of( v, size() - 1 )
711 : to_pos( std::find_first_of( const_reverse_iterator( cbegin() + pos + 1 ), crend(), v.cbegin(), v.cend(), Traits::eq ) );
716 return find_last_of( basic_string_view( &c, 1 ), pos );
719 nssv_constexpr size_type find_last_of( CharT
const * s, size_type pos, size_type count )
const 721 return find_last_of( basic_string_view( s, count ), pos );
724 nssv_constexpr size_type find_last_of( CharT
const * s, size_type pos = npos )
const 726 return find_last_of( basic_string_view( s ), pos );
735 : to_pos( std::find_if( cbegin() + pos, cend(), not_in_view( v ) ) );
740 return find_first_not_of( basic_string_view( &c, 1 ), pos );
743 nssv_constexpr size_type find_first_not_of( CharT
const * s, size_type pos, size_type count )
const 745 return find_first_not_of( basic_string_view( s, count ), pos );
748 nssv_constexpr size_type find_first_not_of( CharT
const * s, size_type pos = 0 )
const 750 return find_first_not_of( basic_string_view( s ), pos );
758 ? find_last_not_of( v, size() - 1 )
759 : to_pos( std::find_if( const_reverse_iterator( cbegin() + pos + 1 ), crend(), not_in_view( v ) ) );
764 return find_last_not_of( basic_string_view( &c, 1 ), pos );
767 nssv_constexpr size_type find_last_not_of( CharT
const * s, size_type pos, size_type count )
const 769 return find_last_not_of( basic_string_view( s, count ), pos );
772 nssv_constexpr size_type find_last_not_of( CharT
const * s, size_type pos = npos )
const 774 return find_last_not_of( basic_string_view( s ), pos );
780 static nssv_constexpr size_type npos = size_type(-1);
782 enum : size_type { npos = size_type(-1) };
784 enum { npos = size_type(-1) };
790 const basic_string_view v;
796 return npos == v.find_first_of( c );
802 return it == cend() ? npos : size_type( it - cbegin() );
805 nssv_constexpr size_type to_pos( const_reverse_iterator it )
const 807 return it == crend() ? npos : size_type( crend() - it - 1 );
817 template<
class Allocator >
818 basic_string_view( std::basic_string<CharT, Traits, Allocator>
const & s )
nssv_noexcept 823 #if nssv_HAVE_EXPLICIT_CONVERSION
824 template<
class Allocator >
825 explicit operator std::basic_string<CharT, Traits, Allocator>()
const 827 return to_string( Allocator() );
832 template<
class Allocator = std::allocator<CharT> >
833 std::basic_string<CharT, Traits, Allocator>
834 to_string( Allocator
const & a = Allocator() )
const 836 return std::basic_string<CharT, Traits, Allocator>( begin(), end(), a );
839 std::basic_string<CharT, Traits>
842 return std::basic_string<CharT, Traits>( begin(), end() );
856 template<
class CharT,
class Traits >
858 basic_string_view <CharT, Traits> lhs,
860 {
return lhs.compare( rhs ) == 0 ; }
862 template<
class CharT,
class Traits >
864 basic_string_view <CharT, Traits> lhs,
866 {
return lhs.compare( rhs ) != 0 ; }
868 template<
class CharT,
class Traits >
870 basic_string_view <CharT, Traits> lhs,
872 {
return lhs.compare( rhs ) < 0 ; }
874 template<
class CharT,
class Traits >
876 basic_string_view <CharT, Traits> lhs,
878 {
return lhs.compare( rhs ) <= 0 ; }
880 template<
class CharT,
class Traits >
882 basic_string_view <CharT, Traits> lhs,
884 {
return lhs.compare( rhs ) > 0 ; }
886 template<
class CharT,
class Traits >
888 basic_string_view <CharT, Traits> lhs,
890 {
return lhs.compare( rhs ) >= 0 ; }
899 #define nssv_BASIC_STRING_VIEW_I(T,U) typename std::decay< basic_string_view<T,U> >::type 902 # define nssv_MSVC_ORDER(x) , int=x 904 # define nssv_MSVC_ORDER(x) 909 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
911 basic_string_view <CharT, Traits> lhs,
913 {
return lhs.compare( rhs ) == 0; }
915 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
917 nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
919 {
return lhs.compare( rhs ) == 0; }
923 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
925 basic_string_view < CharT, Traits > lhs,
926 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs )
nssv_noexcept 927 {
return lhs.compare( rhs ) != 0 ; }
929 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
931 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
933 {
return lhs.compare( rhs ) != 0 ; }
937 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
939 basic_string_view < CharT, Traits > lhs,
940 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs )
nssv_noexcept 941 {
return lhs.compare( rhs ) < 0 ; }
943 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
945 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
947 {
return lhs.compare( rhs ) < 0 ; }
951 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
953 basic_string_view < CharT, Traits > lhs,
954 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs )
nssv_noexcept 955 {
return lhs.compare( rhs ) <= 0 ; }
957 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
959 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
961 {
return lhs.compare( rhs ) <= 0 ; }
965 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
967 basic_string_view < CharT, Traits > lhs,
968 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs )
nssv_noexcept 969 {
return lhs.compare( rhs ) > 0 ; }
971 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
973 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
975 {
return lhs.compare( rhs ) > 0 ; }
979 template<
class CharT,
class Traits nssv_MSVC_ORDER(1) >
981 basic_string_view < CharT, Traits > lhs,
982 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs )
nssv_noexcept 983 {
return lhs.compare( rhs ) >= 0 ; }
985 template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
987 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
989 {
return lhs.compare( rhs ) >= 0 ; }
991 #undef nssv_MSVC_ORDER 992 #undef nssv_BASIC_STRING_VIEW_I 1000 template<
class Stream >
1001 void write_padding( Stream & os, std::streamsize n )
1003 for ( std::streamsize i = 0; i < n; ++i )
1004 os.rdbuf()->sputc( os.fill() );
1007 template<
class Stream,
class View >
1008 Stream & write_to_stream( Stream & os, View
const & sv )
1010 typename Stream::sentry sentry( os );
1015 const std::streamsize length =
static_cast<std::streamsize>( sv.length() );
1018 const bool pad = ( length < os.width() );
1019 const bool left_pad = pad && ( os.flags() & std::ios_base::adjustfield ) == std::ios_base::right;
1022 write_padding( os, os.width() - length );
1025 os.rdbuf()->sputn( sv.begin(), length );
1027 if ( pad && !left_pad )
1028 write_padding( os, os.width() - length );
1038 template<
class CharT,
class Traits >
1039 std::basic_ostream<CharT, Traits> &
1041 std::basic_ostream<CharT, Traits>& os,
1042 basic_string_view <CharT, Traits> sv )
1049 typedef basic_string_view<
char> string_view;
1050 typedef basic_string_view<
wchar_t> wstring_view;
1051 #if nssv_HAVE_WCHAR16_T
1052 typedef basic_string_view<
char16_t> u16string_view;
1053 typedef basic_string_view<
char32_t> u32string_view;
1062 #if nssv_HAVE_USER_DEFINED_LITERALS
1070 nssv_constexpr nonstd::sv_lite::string_view operator
"" sv(
const char* str, size_t len ) nssv_noexcept
1072 return nonstd::sv_lite::string_view{ str, len };
1075 nssv_constexpr nonstd::sv_lite::u16string_view operator
"" sv(
const char16_t* str, size_t len ) nssv_noexcept
1077 return nonstd::sv_lite::u16string_view{ str, len };
1080 nssv_constexpr nonstd::sv_lite::u32string_view operator
"" sv(
const char32_t* str, size_t len ) nssv_noexcept
1082 return nonstd::sv_lite::u32string_view{ str, len };
1085 nssv_constexpr nonstd::sv_lite::wstring_view operator
"" sv(
const wchar_t* str, size_t len ) nssv_noexcept
1087 return nonstd::sv_lite::wstring_view{ str, len };
1096 return nonstd::sv_lite::string_view{ str, len };
1101 return nonstd::sv_lite::u16string_view{ str, len };
1106 return nonstd::sv_lite::u32string_view{ str, len };
1111 return nonstd::sv_lite::wstring_view{ str, len };
1133 template<
class CharT,
class Traits,
class Allocator = std::allocator<CharT> >
1134 std::basic_string<CharT, Traits, Allocator>
1135 to_string( basic_string_view<CharT, Traits> v, Allocator
const & a = Allocator() )
1167 using sv_lite::basic_string_view;
1171 #if nssv_HAVE_WCHAR16_T
1172 using sv_lite::u16string_view;
1174 #if nssv_HAVE_WCHAR32_T
1175 using sv_lite::u32string_view;
1191 using sv_lite::to_string_view;
1201 #if nssv_HAVE_STD_HASH
1203 #include <functional> 1208 struct hash< nonstd::string_view >
1211 std::size_t operator()( nonstd::string_view v )
const nssv_noexcept 1213 return std::hash<std::string>()( std::string( v.data(), v.size() ) );
1218 struct hash< nonstd::wstring_view >
1221 std::size_t operator()( nonstd::wstring_view v )
const nssv_noexcept 1223 return std::hash<std::wstring>()( std::wstring( v.data(), v.size() ) );
1228 struct hash< nonstd::u16string_view >
1231 std::size_t operator()( nonstd::u16string_view v )
const nssv_noexcept 1233 return std::hash<std::u16string>()( std::u16string( v.data(), v.size() ) );
1238 struct hash< nonstd::u32string_view >
1241 std::size_t operator()( nonstd::u32string_view v )
const nssv_noexcept 1243 return std::hash<std::u32string>()( std::u32string( v.data(), v.size() ) );
#define nssv_CPP14_OR_GREATER
#define nssv_BETWEEN(v, lo, hi)
#define nssv_CONFIG_STD_SV_OPERATOR
#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_COMPILER_VERSION(major, minor, patch)
#define nssv_HAS_INCLUDE(arg)
#define nssv_RESTORE_WARNINGS()
#define nssv_CPP17_OR_GREATER
#define nssv_CPP20_OR_GREATER
#define nssv_DISABLE_MSVC_WARNINGS(codes)
#define nssv_HAVE_STARTS_WITH
#define nssv_COMPILER_CLANG_VERSION
#define nssv_CONFIG_USR_SV_OPERATOR
#define nssv_CPP11_OR_GREATER
#define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
#define nssv_COMPILER_MSVC_VERSION
#define nssv_USES_STD_STRING_VIEW
std::basic_string< CharT, Traits > to_string(basic_string_view< CharT, Traits > v)