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
18#define string_view_lite_VERSION nssv_STRINGIFY(string_view_lite_MAJOR) "." nssv_STRINGIFY(string_view_lite_MINOR) "." nssv_STRINGIFY(string_view_lite_PATCH)
20#define nssv_STRINGIFY( x ) nssv_STRINGIFY_( x )
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 )
44# define nssv_CONFIG_SELECT_STRING_VIEW ( nssv_HAVE_STD_STRING_VIEW ? nssv_STRING_VIEW_STD : nssv_STRING_VIEW_NONSTD )
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
86# if defined(_MSVC_LANG ) && !defined(__clang__)
87# define nssv_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG )
89# define nssv_CPLUSPLUS __cplusplus
93#define nssv_CPP98_OR_GREATER ( nssv_CPLUSPLUS >= 199711L )
94#define nssv_CPP11_OR_GREATER ( nssv_CPLUSPLUS >= 201103L )
95#define nssv_CPP11_OR_GREATER_ ( nssv_CPLUSPLUS >= 201103L )
96#define nssv_CPP14_OR_GREATER ( nssv_CPLUSPLUS >= 201402L )
97#define nssv_CPP17_OR_GREATER ( nssv_CPLUSPLUS >= 201703L )
98#define nssv_CPP20_OR_GREATER ( nssv_CPLUSPLUS >= 202000L )
102#if nssv_CPP17_OR_GREATER && defined(__has_include )
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
112#define nssv_USES_STD_STRING_VIEW ( (nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_STD) || ((nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_DEFAULT) && nssv_HAVE_STD_STRING_VIEW) )
114#define nssv_HAVE_STARTS_WITH ( nssv_CPP20_OR_GREATER || !nssv_USES_STD_STRING_VIEW )
115#define nssv_HAVE_ENDS_WITH nssv_HAVE_STARTS_WITH
121#if nssv_USES_STD_STRING_VIEW
123#include <string_view>
127#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
131template<
class CharT,
class Traits,
class Allocator = std::allocator<CharT> >
132std::basic_string<CharT, Traits, Allocator>
133to_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 );
138template<
class CharT,
class Traits,
class Allocator >
139std::basic_string_view<CharT, Traits>
140to_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
149using namespace std::literals::string_view_literals;
153#if nssv_CONFIG_USR_SV_OPERATOR
155inline namespace literals {
156inline namespace string_view_literals {
159constexpr std::string_view
operator "" _sv(
const char* str,
size_t len )
noexcept
161 return std::string_view{ str, len };
164constexpr std::u16string_view
operator "" _sv(
const char16_t* str,
size_t len )
noexcept
166 return std::u16string_view{ str, len };
169constexpr std::u32string_view
operator "" _sv(
const char32_t* str,
size_t len )
noexcept
171 return std::u32string_view{ str, len };
174constexpr std::wstring_view
operator "" _sv(
const wchar_t* str,
size_t len )
noexcept
176 return std::wstring_view{ str, len };
189using std::string_view;
190using std::wstring_view;
191using std::u16string_view;
192using std::u32string_view;
193using std::basic_string_view;
197using std::operator==;
198using std::operator!=;
200using std::operator<=;
202using std::operator>=;
204using 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
268#if nssv_COMPILER_MSVC_VER >= 1900
269# undef nssv_CPP11_OR_GREATER
270# define nssv_CPP11_OR_GREATER 1
273#define nssv_CPP11_90 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1500)
274#define nssv_CPP11_100 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1600)
275#define nssv_CPP11_110 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1700)
276#define nssv_CPP11_120 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1800)
277#define nssv_CPP11_140 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1900)
278#define nssv_CPP11_141 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1910)
280#define nssv_CPP14_000 (nssv_CPP14_OR_GREATER)
281#define nssv_CPP17_000 (nssv_CPP17_OR_GREATER)
285#define nssv_HAVE_CONSTEXPR_11 nssv_CPP11_140
286#define nssv_HAVE_EXPLICIT_CONVERSION nssv_CPP11_140
287#define nssv_HAVE_INLINE_NAMESPACE nssv_CPP11_140
288#define nssv_HAVE_NOEXCEPT nssv_CPP11_140
289#define nssv_HAVE_NULLPTR nssv_CPP11_100
290#define nssv_HAVE_REF_QUALIFIER nssv_CPP11_140
291#define nssv_HAVE_UNICODE_LITERALS nssv_CPP11_140
292#define nssv_HAVE_USER_DEFINED_LITERALS nssv_CPP11_140
293#define nssv_HAVE_WCHAR16_T nssv_CPP11_100
294#define nssv_HAVE_WCHAR32_T nssv_CPP11_100
296#if ! ( ( nssv_CPP11_OR_GREATER && nssv_COMPILER_CLANG_VERSION ) || nssv_BETWEEN( nssv_COMPILER_CLANG_VERSION, 300, 400 ) )
297# define nssv_HAVE_STD_DEFINED_LITERALS nssv_CPP11_140
299# define nssv_HAVE_STD_DEFINED_LITERALS 0
304#define nssv_HAVE_CONSTEXPR_14 nssv_CPP14_000
308#define nssv_HAVE_NODISCARD nssv_CPP17_000
312#define nssv_HAVE_STD_HASH nssv_CPP11_120
329#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 )
330#define nssv_HAVE_BUILTIN_CE ( nssv_HAVE_BUILTIN_VER )
332#define nssv_HAVE_BUILTIN_MEMCMP ( (nssv_HAVE_CONSTEXPR_14 && nssv_HAVE_BUILTIN_CE) || !nssv_HAVE_CONSTEXPR_14 )
333#define nssv_HAVE_BUILTIN_STRLEN ( (nssv_HAVE_CONSTEXPR_11 && nssv_HAVE_BUILTIN_CE) || !nssv_HAVE_CONSTEXPR_11 )
336# define nssv_HAVE_BUILTIN( x ) __has_builtin( x )
338# define nssv_HAVE_BUILTIN( x ) 0
341#if nssv_HAVE_BUILTIN(__builtin_memcmp) || nssv_HAVE_BUILTIN_VER
342# define nssv_BUILTIN_MEMCMP __builtin_memcmp
344# define nssv_BUILTIN_MEMCMP memcmp
347#if nssv_HAVE_BUILTIN(__builtin_strlen) || nssv_HAVE_BUILTIN_VER
348# define nssv_BUILTIN_STRLEN __builtin_strlen
350# define nssv_BUILTIN_STRLEN strlen
355#if nssv_HAVE_CONSTEXPR_11
356# define nssv_constexpr constexpr
358# define nssv_constexpr
361#if nssv_HAVE_CONSTEXPR_14
362# define nssv_constexpr14 constexpr
364# define nssv_constexpr14
367#if nssv_HAVE_EXPLICIT_CONVERSION
368# define nssv_explicit explicit
370# define nssv_explicit
373#if nssv_HAVE_INLINE_NAMESPACE
374# define nssv_inline_ns inline
376# define nssv_inline_ns
379#if nssv_HAVE_NOEXCEPT
380# define nssv_noexcept noexcept
382# define nssv_noexcept
394# define nssv_nullptr nullptr
396# define nssv_nullptr NULL
399#if nssv_HAVE_NODISCARD
400# define nssv_nodiscard [[nodiscard]]
402# define nssv_nodiscard
414#if ! nssv_CONFIG_NO_EXCEPTIONS
418#if nssv_CPP11_OR_GREATER
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"
433#if nssv_COMPILER_MSVC_VERSION >= 140
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()
464namespace
nonstd {
namespace sv_lite {
471template<
typename CharT >
472inline 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;
483#if nssv_HAVE_BUILTIN_MEMCMP
487inline nssv_constexpr14 int compare(
char const * s1,
char const * s2, std::size_t count )
494#if nssv_HAVE_BUILTIN_STRLEN
505#if defined(__OPTIMIZE__)
510template<
typename CharT >
511inline nssv_constexpr std::size_t length( CharT * s, std::size_t result = 0 )
513 return *s ==
'\0' ? result : length( s + 1, result + 1 );
520template<
typename CharT >
523 std::size_t result = 0;
524 while ( *s++ !=
'\0' )
538 class Traits = std::char_traits<CharT>
540class basic_string_view;
551class 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;
579#if nssv_CPP11_OR_GREATER
583 : data_( other.data_)
584 , size_( other.size_)
595#if nssv_CPP17_OR_GREATER
596 , size_( Traits::length(s) )
597#elif nssv_CPP11_OR_GREATER
598 , size_( detail::length(s) )
600 , size_( Traits::length(s) )
606#if nssv_CPP11_OR_GREATER
647 return data_at( pos );
652#if nssv_CONFIG_NO_EXCEPTIONS
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
694#if nssv_CONFIG_NO_EXCEPTIONS
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
711#if nssv_CONFIG_NO_EXCEPTIONS
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 ) );
726#if nssv_CPP17_OR_GREATER
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;
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 );
961#if nssv_CPP17_OR_GREATER
963#elif nssv_CPP11_OR_GREATER
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 );
994#if nssv_BETWEEN( nssv_COMPILER_GNUC_VERSION, 1, 500 )
997 return assert( pos < size() ), data_[pos];
1002 const_pointer data_;
1006#if nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
1008 template<
class Allocator >
1009 basic_string_view( std::basic_string<CharT, Traits, Allocator>
const & s )
nssv_noexcept
1014#if nssv_HAVE_EXPLICIT_CONVERSION
1016 template<
class Allocator >
1017 explicit operator std::basic_string<CharT, Traits, Allocator>()
const
1024#if nssv_CPP11_OR_GREATER
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>
1045 return std::basic_string<CharT, Traits, Allocator>( begin(), end(), a );
1060template<
class CharT,
class Traits >
1062 basic_string_view <CharT, Traits> lhs,
1064{
return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
1066template<
class CharT,
class Traits >
1068 basic_string_view <CharT, Traits> lhs,
1070{
return !( lhs == rhs ); }
1072template<
class CharT,
class Traits >
1074 basic_string_view <CharT, Traits> lhs,
1076{
return lhs.compare( rhs ) < 0; }
1078template<
class CharT,
class Traits >
1080 basic_string_view <CharT, Traits> lhs,
1082{
return lhs.compare( rhs ) <= 0; }
1084template<
class CharT,
class Traits >
1086 basic_string_view <CharT, Traits> lhs,
1088{
return lhs.compare( rhs ) > 0; }
1090template<
class CharT,
class Traits >
1092 basic_string_view <CharT, Traits> lhs,
1094{
return lhs.compare( rhs ) >= 0; }
1101#if ! nssv_CPP11_OR_GREATER || nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 100, 141 )
1107template<
class CharT,
class Traits>
1109 basic_string_view<CharT, Traits> lhs,
1111{
return lhs.size() == detail::length( rhs ) && lhs.compare( rhs ) == 0; }
1113template<
class CharT,
class Traits>
1117{
return detail::length( lhs ) == rhs.size() && rhs.compare( lhs ) == 0; }
1119template<
class CharT,
class Traits>
1121 basic_string_view<CharT, Traits> lhs,
1123{
return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
1125template<
class CharT,
class Traits>
1127 std::basic_string<CharT, Traits> rhs,
1129{
return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
1133template<
class CharT,
class Traits>
1135 basic_string_view<CharT, Traits> lhs,
1137{
return !( lhs == rhs ); }
1139template<
class CharT,
class Traits>
1143{
return !( lhs == rhs ); }
1145template<
class CharT,
class Traits>
1147 basic_string_view<CharT, Traits> lhs,
1149{
return !( lhs == rhs ); }
1151template<
class CharT,
class Traits>
1153 std::basic_string<CharT, Traits> rhs,
1155{
return !( lhs == rhs ); }
1159template<
class CharT,
class Traits>
1161 basic_string_view<CharT, Traits> lhs,
1163{
return lhs.compare( rhs ) < 0; }
1165template<
class CharT,
class Traits>
1169{
return rhs.compare( lhs ) > 0; }
1171template<
class CharT,
class Traits>
1173 basic_string_view<CharT, Traits> lhs,
1175{
return lhs.compare( rhs ) < 0; }
1177template<
class CharT,
class Traits>
1179 std::basic_string<CharT, Traits> rhs,
1181{
return rhs.compare( lhs ) > 0; }
1185template<
class CharT,
class Traits>
1187 basic_string_view<CharT, Traits> lhs,
1189{
return lhs.compare( rhs ) <= 0; }
1191template<
class CharT,
class Traits>
1195{
return rhs.compare( lhs ) >= 0; }
1197template<
class CharT,
class Traits>
1199 basic_string_view<CharT, Traits> lhs,
1201{
return lhs.compare( rhs ) <= 0; }
1203template<
class CharT,
class Traits>
1205 std::basic_string<CharT, Traits> rhs,
1207{
return rhs.compare( lhs ) >= 0; }
1211template<
class CharT,
class Traits>
1213 basic_string_view<CharT, Traits> lhs,
1215{
return lhs.compare( rhs ) > 0; }
1217template<
class CharT,
class Traits>
1221{
return rhs.compare( lhs ) < 0; }
1223template<
class CharT,
class Traits>
1225 basic_string_view<CharT, Traits> lhs,
1227{
return lhs.compare( rhs ) > 0; }
1229template<
class CharT,
class Traits>
1231 std::basic_string<CharT, Traits> rhs,
1233{
return rhs.compare( lhs ) < 0; }
1237template<
class CharT,
class Traits>
1239 basic_string_view<CharT, Traits> lhs,
1241{
return lhs.compare( rhs ) >= 0; }
1243template<
class CharT,
class Traits>
1247{
return rhs.compare( lhs ) <= 0; }
1249template<
class CharT,
class Traits>
1251 basic_string_view<CharT, Traits> lhs,
1253{
return lhs.compare( rhs ) >= 0; }
1255template<
class CharT,
class Traits>
1257 std::basic_string<CharT, Traits> rhs,
1259{
return rhs.compare( lhs ) <= 0; }
1263#define nssv_BASIC_STRING_VIEW_I(T,U) typename std::decay< basic_string_view<T,U> >::type
1265#if nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 140, 150 )
1266# define nssv_MSVC_ORDER(x) , int=x
1268# define nssv_MSVC_ORDER(x)
1273template<
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; }
1279template<
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; }
1287template<
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 ); }
1293template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
1295 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
1297{
return !( lhs == rhs ); }
1301template<
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; }
1307template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
1309 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
1311{
return lhs.compare( rhs ) < 0; }
1315template<
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; }
1321template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
1323 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
1325{
return lhs.compare( rhs ) <= 0; }
1329template<
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; }
1335template<
class CharT,
class Traits nssv_MSVC_ORDER(2) >
1337 nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
1339{
return lhs.compare( rhs ) > 0; }
1343template<
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; }
1349template<
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
1364template<
class Stream >
1365void write_padding( Stream & os, std::streamsize n )
1367 for ( std::streamsize i = 0; i < n; ++i )
1368 os.rdbuf()->sputc( os.fill() );
1371template<
class Stream,
class View >
1372Stream & 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 );
1402template<
class CharT,
class Traits >
1403std::basic_ostream<CharT, Traits> &
1405 std::basic_ostream<CharT, Traits>& os,
1406 basic_string_view <CharT, Traits> sv )
1408 return detail::write_to_stream( os, sv );
1413typedef basic_string_view<char> string_view;
1414typedef basic_string_view<wchar_t> wstring_view;
1415#if nssv_HAVE_WCHAR16_T
1416typedef basic_string_view<char16_t> u16string_view;
1417typedef basic_string_view<char32_t> u32string_view;
1426#if nssv_HAVE_USER_DEFINED_LITERALS
1432#if nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS
1436 return nonstd::sv_lite::string_view{ str, len };
1441 return nonstd::sv_lite::u16string_view{ str, len };
1446 return nonstd::sv_lite::u32string_view{ str, len };
1451 return nonstd::sv_lite::wstring_view{ str, len };
1456#if nssv_CONFIG_USR_SV_OPERATOR
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 };
1488#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
1495#if nssv_CPP11_OR_GREATER && nssv_COMPILER_MSVC_VERSION != 140
1497template<
class CharT,
class Traits,
class Allocator = std::allocator<CharT> >
1498std::basic_string<CharT, Traits, Allocator>
1499to_string( basic_string_view<CharT, Traits> v, Allocator
const & a = Allocator() )
1501 return std::basic_string<CharT,Traits, Allocator>( v.begin(), v.end(), a );
1506template<
class CharT,
class Traits >
1507std::basic_string<CharT, Traits>
1510 return std::basic_string<CharT, Traits>( v.begin(), v.end() );
1513template<
class CharT,
class Traits,
class Allocator >
1514std::basic_string<CharT, Traits, Allocator>
1515to_string( basic_string_view<CharT, Traits> v, Allocator
const & a )
1517 return std::basic_string<CharT, Traits, Allocator>( v.begin(), v.end(), a );
1522template<
class CharT,
class Traits,
class Allocator >
1523basic_string_view<CharT, Traits>
1526 return basic_string_view<CharT, Traits>( s.data(), s.size() );
1539using sv_lite::basic_string_view;
1540using sv_lite::string_view;
1541using sv_lite::wstring_view;
1543#if nssv_HAVE_WCHAR16_T
1544using sv_lite::u16string_view;
1546#if nssv_HAVE_WCHAR32_T
1547using sv_lite::u32string_view;
1552using sv_lite::operator==;
1553using sv_lite::operator!=;
1554using sv_lite::operator<;
1555using sv_lite::operator<=;
1556using sv_lite::operator>;
1557using sv_lite::operator>=;
1559using sv_lite::operator<<;
1561#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
1573#if nssv_HAVE_STD_HASH
1575#include <functional>
1580struct 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() ) );
1590struct hash<
nonstd::wstring_view >
1593 std::size_t operator()( nonstd::wstring_view v )
const nssv_noexcept
1595 return std::hash<std::wstring>()( std::wstring(
v.data(),
v.size() ) );
1600struct hash<
nonstd::u16string_view >
1603 std::size_t operator()( nonstd::u16string_view v )
const nssv_noexcept
1605 return std::hash<std::u16string>()( std::u16string(
v.data(),
v.size() ) );
1610struct hash<
nonstd::u32string_view >
1613 std::size_t operator()( nonstd::u32string_view v )
const nssv_noexcept
1615 return std::hash<std::u32string>()( std::u32string(
v.data(),
v.size() ) );
optional_constexpr bool operator>(optional< T > const &x, optional< U > const &y)
void swap(optional< T > &x, optional< T > &y)
optional_constexpr bool operator>=(optional< T > const &x, optional< U > const &y)
std::basic_string< CharT, Traits, Allocator > to_string(basic_string_view< CharT, Traits > v, Allocator const &a)
basic_string_view< CharT, Traits > to_string_view(std::basic_string< CharT, Traits, Allocator > const &s)
std::basic_string< CharT, Traits > to_string(basic_string_view< CharT, Traits > v)
RESTINIO_NODISCARD bool operator==(const character_t &a, const character_t &b) noexcept
RESTINIO_NODISCARD bool operator!=(const character_t &a, const character_t &b) noexcept
RESTINIO_NODISCARD bool operator<(const qvalue_t &a, const qvalue_t &b) noexcept
RESTINIO_NODISCARD bool operator<=(const qvalue_t &a, const qvalue_t &b) noexcept
RESTINIO_NODISCARD bool ends_with(const string_view_t &where, const string_view_t &what) noexcept
RESTINIO_NODISCARD bool starts_with(const string_view_t &where, const string_view_t &what) noexcept
std::ostream & operator<<(std::ostream &o, response_parts_attr_t attr)
#define nssv_RESTORE_WARNINGS()
#define nssv_DISABLE_MSVC_WARNINGS(codes)
#define nssv_BUILTIN_STRLEN
#define nssv_BUILTIN_MEMCMP