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
77 #define nssv_HAVE_STD_STRING_VIEW ( nssv_CPP17_OR_GREATER && nssv_HAS_INCLUDE(<string_view>) )
79 #ifndef nssv_USES_STD_STRING_VIEW
80 # define nssv_USES_STD_STRING_VIEW nssv_HAVE_STD_STRING_VIEW
83 #define nssv_HAVE_STARTS_WITH ( nssv_CPP20_OR_GREATER || !nssv_USES_STD_STRING_VIEW )
84 #define nssv_HAVE_ENDS_WITH nssv_HAVE_STARTS_WITH
90 #if 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 };
150 #endif // nssv_CONFIG_USR_SV_OPERATOR
154 #endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
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<<;
177 #else // nssv_HAVE_STD_STRING_VIEW
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 )
221 #if nssv_CPP11_OR_GREATER || nssv_COMPILER_MSVC_VERSION >= 100
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
229 #if nssv_CPP11_OR_GREATER || nssv_COMPILER_MSVC_VERSION >= 120
230 # define nssv_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG 1
231 # define nssv_HAVE_INITIALIZER_LIST 1
234 #if nssv_CPP11_OR_GREATER || nssv_COMPILER_MSVC_VERSION >= 140
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
246 # if ! ( ( nssv_CPP11 && nssv_COMPILER_CLANG_VERSION ) || nssv_BETWEEN( nssv_COMPILER_CLANG_VERSION, 300, 400 ) )
247 # define nssv_HAVE_STD_DEFINED_LITERALS 1
253 #if nssv_CPP14_OR_GREATER
254 # define nssv_HAVE_CONSTEXPR_14 1
259 #if nssv_CPP17_OR_GREATER
260 # define nssv_HAVE_NODISCARD 1
265 #if nssv_COMPILER_MSVC_VERSION >= 140
266 # undef nssv_CPP11_OR_GREATER
267 # define nssv_CPP11_OR_GREATER 1
272 #if nssv_CPP11_OR_GREATER || nssv_COMPILER_MSVC_VERSION >= 120
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
338 #if nssv_CPP11_OR_GREATER
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"
353 #if nssv_COMPILER_MSVC_VERSION >= 140
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()
384 namespace
nonstd {
namespace sv_lite {
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;
430 #if nssv_CPP11_OR_GREATER
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) )
451 #if nssv_CPP11_OR_GREATER
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;
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 );
779 #if nssv_CPP17_OR_GREATER
781 #elif nssv_CPP11_OR_GREATER
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 );
815 #if nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
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
831 #if nssv_CPP11_OR_GREATER
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() );
846 #endif // nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
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 ; }
897 #if nssv_CPP11_OR_GREATER && ! nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 100, 141 )
899 #define nssv_BASIC_STRING_VIEW_I(T,U) typename std::decay< basic_string_view<T,U> >::type
901 #if nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 140, 150 )
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
994 #endif // nssv_CPP11_OR_GREATER
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 )
1044 return detail::write_to_stream( os, 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
1068 #if nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS
1072 return nonstd::sv_lite::string_view{ str, len };
1077 return nonstd::sv_lite::u16string_view{ str, len };
1082 return nonstd::sv_lite::u32string_view{ str, len };
1087 return nonstd::sv_lite::wstring_view{ str, len };
1090 #endif // nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS
1092 #if nssv_CONFIG_USR_SV_OPERATOR
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 };
1114 #endif // nssv_CONFIG_USR_SV_OPERATOR
1124 #if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
1131 #if nssv_CPP11_OR_GREATER && nssv_COMPILER_MSVC_VERSION != 140
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() )
1137 return std::basic_string<CharT,Traits, Allocator>( v.begin(), v.end(), a );
1142 template<
class CharT,
class Traits >
1143 std::basic_string<CharT, Traits>
1146 return std::basic_string<CharT, Traits>( v.begin(), v.end() );
1148 #endif // nssv_CPP11_OR_GREATER
1150 template<
class CharT,
class Traits,
class Allocator >
1151 basic_string_view<CharT, Traits>
1154 return basic_string_view<CharT, Traits>( s.data(), s.size() );
1159 #endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
1167 using sv_lite::basic_string_view;
1168 using sv_lite::string_view;
1169 using sv_lite::wstring_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;
1180 using sv_lite::operator==;
1181 using sv_lite::operator!=;
1182 using sv_lite::operator<;
1183 using sv_lite::operator<=;
1184 using sv_lite::operator>;
1185 using sv_lite::operator>=;
1187 using sv_lite::operator<<;
1189 #if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
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() ) );
1249 #endif // nssv_HAVE_STD_HASH
1253 #endif // nssv_HAVE_STD_STRING_VIEW
1254 #endif // NONSTD_SV_LITE_H_INCLUDED