1 #ifndef BOOST_CORE_STRING_VIEW_HPP_INCLUDED
2 #define BOOST_CORE_STRING_VIEW_HPP_INCLUDED
4 // MS compatible compilers support #pragma once
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
10 // boost::core::basic_string_view<Ch>
12 // Copyright 2021 Peter Dimov
13 // Distributed under the Boost Software License, Version 1.0.
14 // https://www.boost.org/LICENSE_1_0.txt
16 #include <boost/core/enable_if.hpp>
17 #include <boost/core/is_same.hpp>
18 #include <boost/assert.hpp>
19 #include <boost/assert/source_location.hpp>
20 #include <boost/throw_exception.hpp>
21 #include <boost/config.hpp>
31 #if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
32 # include <string_view>
34 #if !defined(BOOST_NO_CXX20_HDR_CONCEPTS) // std::common_reference_with
35 # include <type_traits>
41 template<class Ch, class Tr> class basic_string_view;
48 template<class Ch> struct sv_to_uchar
53 template<> struct sv_to_uchar<char>
55 typedef unsigned char type;
58 #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ >= 406
59 # pragma GCC diagnostic push
60 # pragma GCC diagnostic ignored "-Wtype-limits"
63 template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_first_of( Ch const* p_, std::size_t n_, Ch const* s, std::size_t pos, std::size_t n ) BOOST_NOEXCEPT
65 typedef typename sv_to_uchar<Ch>::type UCh;
67 unsigned char table[ 256 ] = {};
69 bool use_table = true;
71 for( std::size_t j = 0; j < n; ++j )
75 if( ch >= 0 && ch < 256 )
88 for( std::size_t i = pos; i < n_; ++i )
91 if( ch >= 0 && ch < 256 && table[ ch ] ) return i;
96 for( std::size_t i = pos; i < n_; ++i )
99 if( std::char_traits<Ch>::find( s, n, ch ) != 0 ) return i;
104 for( std::size_t i = pos; i < n_; ++i )
108 for( std::size_t j = 0; j < n; ++j )
110 if( s[ j ] == ch ) return i;
115 return static_cast<std::size_t>( -1 );
118 template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_last_of( Ch const* p_, Ch const* s, std::size_t pos, std::size_t n ) BOOST_NOEXCEPT
120 typedef typename sv_to_uchar<Ch>::type UCh;
122 unsigned char table[ 256 ] = {};
124 bool use_table = true;
126 for( std::size_t j = 0; j < n; ++j )
130 if( ch >= 0 && ch < 256 )
141 std::size_t const npos = static_cast< std::size_t >( -1 );
151 if( ch >= 0 && ch < 256 && table[ ch ] ) return i;
163 if( std::char_traits<Ch>::find( s, n, ch ) != 0 ) return i;
175 for( std::size_t j = 0; j < n; ++j )
177 if( s[ j ] == ch ) return i;
188 template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_first_not_of( Ch const* p_, std::size_t n_, Ch const* s, std::size_t pos, std::size_t n ) BOOST_NOEXCEPT
190 typedef typename sv_to_uchar<Ch>::type UCh;
192 unsigned char table[ 256 ] = {};
194 bool use_table = true;
196 for( std::size_t j = 0; j < n; ++j )
200 if( ch >= 0 && ch < 256 )
213 for( std::size_t i = pos; i < n_; ++i )
216 if( !( ch >= 0 && ch < 256 && table[ ch ] ) ) return i;
221 for( std::size_t i = pos; i < n_; ++i )
224 if( std::char_traits<Ch>::find( s, n, ch ) == 0 ) return i;
229 for( std::size_t i = pos; i < n_; ++i )
235 for( std::size_t j = 0; j < n; ++j )
248 return static_cast<std::size_t>( -1 );
251 template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_last_not_of( Ch const* p_, Ch const* s, std::size_t pos, std::size_t n ) BOOST_NOEXCEPT
253 typedef typename sv_to_uchar<Ch>::type UCh;
255 unsigned char table[ 256 ] = {};
257 bool use_table = true;
259 for( std::size_t j = 0; j < n; ++j )
263 if( ch >= 0 && ch < 256 )
274 std::size_t const npos = static_cast< std::size_t >( -1 );
284 if( !( ch >= 0 && ch < 256 && table[ ch ] ) ) return i;
296 if( std::char_traits<Ch>::find( s, n, ch ) == 0 ) return i;
310 for( std::size_t j = 0; j < n; ++j )
329 #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ >= 406
330 # pragma GCC diagnostic pop
333 } // namespace detail
335 template<class Ch> class basic_string_view
346 typedef std::char_traits<Ch> traits_type;
347 typedef Ch value_type;
349 typedef Ch const* const_pointer;
350 typedef Ch& reference;
351 typedef Ch const& const_reference;
352 typedef Ch const* const_iterator;
353 typedef const_iterator iterator;
354 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
355 typedef const_reverse_iterator reverse_iterator;
356 typedef std::size_t size_type;
357 typedef std::ptrdiff_t difference_type;
361 BOOST_STATIC_CONSTEXPR size_type npos = static_cast<size_type>( -1 );
365 // construction and assignment
367 BOOST_CONSTEXPR basic_string_view() BOOST_NOEXCEPT: p_(), n_()
371 BOOST_CONSTEXPR basic_string_view( Ch const* str ) BOOST_NOEXCEPT: p_( str ), n_( traits_type::length( str ) )
375 BOOST_CONSTEXPR basic_string_view( Ch const* str, size_type len ) BOOST_NOEXCEPT: p_( str ), n_( len )
379 template<class End> BOOST_CXX14_CONSTEXPR basic_string_view( Ch const* begin, End end,
380 typename boost::enable_if<is_same<End, Ch const*> >::type* = 0 ) BOOST_NOEXCEPT: p_( begin ), n_( end - begin )
382 BOOST_ASSERT( end - begin >= 0 );
385 template<class A> basic_string_view( std::basic_string<Ch, std::char_traits<Ch>, A> const& str ) BOOST_NOEXCEPT: p_( str.data() ), n_( str.size() )
389 #if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
391 basic_string_view( std::basic_string_view<Ch, std::char_traits<Ch> > const& str ) BOOST_NOEXCEPT: p_( str.data() ), n_( str.size() )
397 template<class Ch2> basic_string_view( boost::basic_string_view<Ch2, std::char_traits<Ch2> > const& str,
398 typename boost::enable_if<is_same<Ch, Ch2> >::type* = 0 ) BOOST_NOEXCEPT: p_( str.data() ), n_( str.size() )
402 // BOOST_CONSTEXPR basic_string_view& operator=( basic_string_view const& ) BOOST_NOEXCEPT & = default;
406 template<class A> operator std::basic_string<Ch, std::char_traits<Ch>, A>() const
408 return std::basic_string<Ch, std::char_traits<Ch>, A>( data(), size() );
411 #if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
413 template<class Ch2, class En = typename boost::enable_if<is_same<Ch2, Ch> >::type>
414 operator std::basic_string_view<Ch2>() const BOOST_NOEXCEPT
416 return std::basic_string_view<Ch>( data(), size() );
421 template<class Ch2> operator boost::basic_string_view<Ch2,
422 typename boost::enable_if<boost::core::is_same<Ch2, Ch>, std::char_traits<Ch> >::type> () const BOOST_NOEXCEPT
424 return boost::basic_string_view< Ch, std::char_traits<Ch> >( data(), size() );
429 BOOST_CONSTEXPR const_iterator begin() const BOOST_NOEXCEPT
434 BOOST_CONSTEXPR const_iterator end() const BOOST_NOEXCEPT
439 BOOST_CONSTEXPR const_iterator cbegin() const BOOST_NOEXCEPT
444 BOOST_CONSTEXPR const_iterator cend() const BOOST_NOEXCEPT
449 BOOST_CONSTEXPR const_reverse_iterator rbegin() const BOOST_NOEXCEPT
451 return const_reverse_iterator( end() );
454 BOOST_CONSTEXPR const_reverse_iterator rend() const BOOST_NOEXCEPT
456 return const_reverse_iterator( begin() );
459 BOOST_CONSTEXPR const_reverse_iterator crbegin() const BOOST_NOEXCEPT
461 return const_reverse_iterator( end() );
464 BOOST_CONSTEXPR const_reverse_iterator crend() const BOOST_NOEXCEPT
466 return const_reverse_iterator( begin() );
471 BOOST_CONSTEXPR size_type size() const BOOST_NOEXCEPT
476 BOOST_CONSTEXPR size_type length() const BOOST_NOEXCEPT
481 BOOST_CONSTEXPR size_type max_size() const BOOST_NOEXCEPT
483 return npos / sizeof( Ch );
486 BOOST_CONSTEXPR bool empty() const BOOST_NOEXCEPT
493 BOOST_CXX14_CONSTEXPR const_reference operator[]( size_type pos ) const BOOST_NOEXCEPT
495 BOOST_ASSERT( pos < size() );
499 BOOST_CXX14_CONSTEXPR const_reference at( size_type pos ) const
503 boost::throw_exception( std::out_of_range( "basic_string_view::at" ), BOOST_CURRENT_LOCATION );
509 BOOST_CXX14_CONSTEXPR const_reference front() const BOOST_NOEXCEPT
511 BOOST_ASSERT( !empty() );
515 BOOST_CXX14_CONSTEXPR const_reference back() const BOOST_NOEXCEPT
517 BOOST_ASSERT( !empty() );
521 BOOST_CONSTEXPR const_pointer data() const BOOST_NOEXCEPT
528 BOOST_CXX14_CONSTEXPR void remove_prefix( size_type n ) BOOST_NOEXCEPT
530 BOOST_ASSERT( n <= size() );
536 BOOST_CXX14_CONSTEXPR void remove_suffix( size_type n ) BOOST_NOEXCEPT
538 BOOST_ASSERT( n <= size() );
543 BOOST_CXX14_CONSTEXPR void swap( basic_string_view& s ) BOOST_NOEXCEPT
545 std::swap( p_, s.p_ );
546 std::swap( n_, s.n_ );
551 BOOST_CXX14_CONSTEXPR size_type copy( Ch* s, size_type n, size_type pos = 0 ) const
555 boost::throw_exception( std::out_of_range( "basic_string_view::copy" ), BOOST_CURRENT_LOCATION );
558 std::size_t rlen = (std::min)( n, size() - pos );
560 traits_type::copy( s, data() + pos, rlen );
565 BOOST_CXX14_CONSTEXPR basic_string_view substr( size_type pos = 0, size_type n = npos ) const
569 boost::throw_exception( std::out_of_range( "basic_string_view::substr" ), BOOST_CURRENT_LOCATION );
572 std::size_t rlen = (std::min)( n, size() - pos );
574 return basic_string_view( data() + pos, rlen );
579 BOOST_CXX14_CONSTEXPR int compare( basic_string_view str ) const BOOST_NOEXCEPT
581 std::size_t rlen = (std::min)( size(), str.size() );
583 int cmp = traits_type::compare( data(), str.data(), rlen );
585 if( cmp != 0 ) return cmp;
587 if( size() == str.size() ) return 0;
589 return size() < str.size()? -1: +1;
592 BOOST_CONSTEXPR int compare( size_type pos1, size_type n1, basic_string_view str ) const
594 return substr( pos1, n1 ).compare( str );
597 BOOST_CONSTEXPR int compare( size_type pos1, size_type n1, basic_string_view str, size_type pos2, size_type n2 ) const
599 return substr( pos1, n1 ).compare( str.substr( pos2, n2 ) );
602 BOOST_CONSTEXPR int compare( Ch const* s ) const BOOST_NOEXCEPT
604 return compare( basic_string_view( s ) );
607 BOOST_CONSTEXPR int compare( size_type pos1, size_type n1, Ch const* s ) const
609 return substr( pos1, n1 ).compare( basic_string_view( s ) );
612 BOOST_CONSTEXPR int compare( size_type pos1, size_type n1, Ch const* s, size_type n2 ) const
614 return substr( pos1, n1 ).compare( basic_string_view( s, n2 ) );
619 BOOST_CONSTEXPR bool starts_with( basic_string_view x ) const BOOST_NOEXCEPT
621 return size() >= x.size() && traits_type::compare( data(), x.data(), x.size() ) == 0;
624 BOOST_CONSTEXPR bool starts_with( Ch x ) const BOOST_NOEXCEPT
626 return !empty() && front() == x;
629 BOOST_CONSTEXPR bool starts_with( Ch const* x ) const BOOST_NOEXCEPT
631 return starts_with( basic_string_view( x ) );
636 BOOST_CONSTEXPR bool ends_with( basic_string_view x ) const BOOST_NOEXCEPT
638 return size() >= x.size() && traits_type::compare( data() + size() - x.size(), x.data(), x.size() ) == 0;
641 BOOST_CONSTEXPR bool ends_with( Ch x ) const BOOST_NOEXCEPT
643 return !empty() && back() == x;
646 BOOST_CONSTEXPR bool ends_with( Ch const* x ) const BOOST_NOEXCEPT
648 return ends_with( basic_string_view( x ) );
653 BOOST_CONSTEXPR size_type find( basic_string_view str, size_type pos = 0 ) const BOOST_NOEXCEPT
655 return find( str.data(), pos, str.size() );
658 BOOST_CXX14_CONSTEXPR size_type find( Ch c, size_type pos = 0 ) const BOOST_NOEXCEPT
660 if( pos >= size() ) return npos;
662 Ch const* r = traits_type::find( data() + pos, size() - pos, c );
664 return r? r - data(): npos;
667 BOOST_CXX14_CONSTEXPR size_type find( Ch const* s, size_type pos, size_type n ) const BOOST_NOEXCEPT
669 if( n == 1 ) return find( s[0], pos );
671 if( pos + n > size() ) return npos;
672 if( n == 0 ) return pos;
674 Ch const* p = data() + pos;
675 Ch const* last = data() + size() - n + 1;
679 p = traits_type::find( p, last - p, s[0] );
683 if( traits_type::compare( p + 1, s + 1, n - 1 ) == 0 ) return p - data();
691 BOOST_CONSTEXPR size_type find( Ch const* s, size_type pos = 0 ) const BOOST_NOEXCEPT
693 return find( s, pos, traits_type::length( s ) );
698 BOOST_CONSTEXPR size_type rfind( basic_string_view str, size_type pos = npos ) const BOOST_NOEXCEPT
700 return rfind( str.data(), pos, str.size() );
703 BOOST_CXX14_CONSTEXPR size_type rfind( Ch c, size_type pos = npos ) const BOOST_NOEXCEPT
705 size_type n = size();
719 if( p_[ pos ] == c ) return pos;
722 while( pos != npos );
727 BOOST_CXX14_CONSTEXPR size_type rfind( Ch const* s, size_type pos, size_type n ) const BOOST_NOEXCEPT
729 if( n > size() ) return npos;
731 if( pos > size() - n )
736 if( n == 0 ) return pos;
740 size_type xpos = rfind( s[0], pos );
742 if( xpos == npos ) return npos;
744 if( traits_type::compare( data() + xpos, s, n ) == 0 ) return xpos;
746 if( xpos == 0 ) return npos;
752 BOOST_CONSTEXPR size_type rfind( Ch const* s, size_type pos = npos ) const BOOST_NOEXCEPT
754 return rfind( s, pos, traits_type::length( s ) );
759 BOOST_CXX14_CONSTEXPR size_type find_first_of( basic_string_view str, size_type pos = 0 ) const BOOST_NOEXCEPT
761 return find_first_of( str.data(), pos, str.size() );
764 BOOST_CONSTEXPR size_type find_first_of( Ch c, size_type pos = 0 ) const BOOST_NOEXCEPT
766 return find( c, pos );
769 BOOST_CXX14_CONSTEXPR size_type find_first_of( Ch const* s, size_type pos, size_type n ) const BOOST_NOEXCEPT
771 if( n == 0 || pos >= size() ) return npos;
772 if( n == 1 ) return find( s[0], pos );
774 return detail::find_first_of( data(), size(), s, pos, n );
777 BOOST_CXX14_CONSTEXPR size_type find_first_of( Ch const* s, size_type pos = 0 ) const BOOST_NOEXCEPT
779 return find_first_of( s, pos, traits_type::length( s ) );
784 BOOST_CXX14_CONSTEXPR size_type find_last_of( basic_string_view str, size_type pos = npos ) const BOOST_NOEXCEPT
786 return find_last_of( str.data(), pos, str.size() );
789 BOOST_CONSTEXPR size_type find_last_of( Ch c, size_type pos = npos ) const BOOST_NOEXCEPT
791 return rfind( c, pos );
794 BOOST_CXX14_CONSTEXPR size_type find_last_of( Ch const* s, size_type pos, size_type n ) const BOOST_NOEXCEPT
798 return rfind( s[0], pos );
801 size_type m = size();
813 return detail::find_last_of( data(), s, pos, n );
816 BOOST_CXX14_CONSTEXPR size_type find_last_of( Ch const* s, size_type pos = npos ) const BOOST_NOEXCEPT
818 return find_last_of( s, pos, traits_type::length( s ) );
823 BOOST_CXX14_CONSTEXPR size_type find_first_not_of( basic_string_view str, size_type pos = 0 ) const BOOST_NOEXCEPT
825 return find_first_not_of( str.data(), pos, str.size() );
828 BOOST_CXX14_CONSTEXPR size_type find_first_not_of( Ch c, size_type pos = 0 ) const BOOST_NOEXCEPT
830 for( std::size_t i = pos; i < n_; ++i )
832 if( p_[ i ] != c ) return i;
838 BOOST_CXX14_CONSTEXPR size_type find_first_not_of( Ch const* s, size_type pos, size_type n ) const BOOST_NOEXCEPT
840 if( pos >= size() ) return npos;
841 if( n == 1 ) return find_first_not_of( s[0], pos );
843 return detail::find_first_not_of( data(), size(), s, pos, n );
846 BOOST_CXX14_CONSTEXPR size_type find_first_not_of( Ch const* s, size_type pos = 0 ) const BOOST_NOEXCEPT
848 return find_first_not_of( s, pos, traits_type::length( s ) );
853 BOOST_CXX14_CONSTEXPR size_type find_last_not_of( basic_string_view str, size_type pos = npos ) const BOOST_NOEXCEPT
855 return find_last_not_of( str.data(), pos, str.size() );
858 BOOST_CXX14_CONSTEXPR size_type find_last_not_of( Ch c, size_type pos = npos ) const BOOST_NOEXCEPT
860 size_type m = size();
874 if( p_[ pos ] != c ) return pos;
877 while( pos != npos );
882 BOOST_CXX14_CONSTEXPR size_type find_last_not_of( Ch const* s, size_type pos, size_type n ) const BOOST_NOEXCEPT
886 return find_last_not_of( s[0], pos );
889 size_type m = size();
901 return detail::find_last_not_of( data(), s, pos, n );
904 BOOST_CXX14_CONSTEXPR size_type find_last_not_of( Ch const* s, size_type pos = npos ) const BOOST_NOEXCEPT
906 return find_last_not_of( s, pos, traits_type::length( s ) );
911 BOOST_CONSTEXPR bool contains( basic_string_view sv ) const BOOST_NOEXCEPT
913 return find( sv ) != npos;
916 BOOST_CXX14_CONSTEXPR bool contains( Ch c ) const BOOST_NOEXCEPT
918 Ch const* p = data();
919 size_type n = size();
923 return traits_type::find( p, n, c ) != 0;
927 for( size_type i = 0; i < n; ++i )
929 if( p[ i ] == c ) return true;
936 BOOST_CONSTEXPR bool contains( Ch const* s ) const BOOST_NOEXCEPT
938 return find( s ) != npos;
941 // relational operators
943 BOOST_CXX14_CONSTEXPR friend bool operator==( basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
945 return sv1.size() == sv2.size() && traits_type::compare( sv1.data(), sv2.data(), sv1.size() ) == 0;
948 BOOST_CXX14_CONSTEXPR friend bool operator!=( basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
950 return !( sv1 == sv2 );
953 BOOST_CXX14_CONSTEXPR friend bool operator<( basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
955 return sv1.compare( sv2 ) < 0;
958 BOOST_CXX14_CONSTEXPR friend bool operator<=( basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
960 return sv1.compare( sv2 ) <= 0;
963 BOOST_CXX14_CONSTEXPR friend bool operator>( basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
965 return sv1.compare( sv2 ) > 0;
968 BOOST_CXX14_CONSTEXPR friend bool operator>=( basic_string_view sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
970 return sv1.compare( sv2 ) >= 0;
973 #if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
975 // "sufficient number of additional overloads"
977 // against std::string_view
979 BOOST_CXX14_CONSTEXPR friend bool operator==( basic_string_view sv1, std::basic_string_view<Ch> sv2 ) BOOST_NOEXCEPT
981 return sv1.size() == sv2.size() && traits_type::compare( sv1.data(), sv2.data(), sv1.size() ) == 0;
984 BOOST_CXX14_CONSTEXPR friend bool operator==( std::basic_string_view<Ch> sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
986 return sv1.size() == sv2.size() && traits_type::compare( sv1.data(), sv2.data(), sv1.size() ) == 0;
989 BOOST_CXX14_CONSTEXPR friend bool operator!=( basic_string_view sv1, std::basic_string_view<Ch> sv2 ) BOOST_NOEXCEPT
991 return !( sv1 == sv2 );
994 BOOST_CXX14_CONSTEXPR friend bool operator!=( std::basic_string_view<Ch> sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
996 return !( sv1 == sv2 );
999 BOOST_CXX14_CONSTEXPR friend bool operator<( basic_string_view sv1, std::basic_string_view<Ch> sv2 ) BOOST_NOEXCEPT
1001 return sv1.compare( sv2 ) < 0;
1004 BOOST_CXX14_CONSTEXPR friend bool operator<( std::basic_string_view<Ch> sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1006 return sv1.compare( sv2 ) < 0;
1009 BOOST_CXX14_CONSTEXPR friend bool operator<=( basic_string_view sv1, std::basic_string_view<Ch> sv2 ) BOOST_NOEXCEPT
1011 return sv1.compare( sv2 ) <= 0;
1014 BOOST_CXX14_CONSTEXPR friend bool operator<=( std::basic_string_view<Ch> sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1016 return sv1.compare( sv2 ) <= 0;
1019 BOOST_CXX14_CONSTEXPR friend bool operator>( basic_string_view sv1, std::basic_string_view<Ch> sv2 ) BOOST_NOEXCEPT
1021 return sv1.compare( sv2 ) > 0;
1024 BOOST_CXX14_CONSTEXPR friend bool operator>( std::basic_string_view<Ch> sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1026 return sv1.compare( sv2 ) > 0;
1029 BOOST_CXX14_CONSTEXPR friend bool operator>=( basic_string_view sv1, std::basic_string_view<Ch> sv2 ) BOOST_NOEXCEPT
1031 return sv1.compare( sv2 ) >= 0;
1034 BOOST_CXX14_CONSTEXPR friend bool operator>=( std::basic_string_view<Ch> sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1036 return sv1.compare( sv2 ) >= 0;
1039 // against Ch const*
1041 BOOST_CXX14_CONSTEXPR friend bool operator==( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT
1043 return sv1 == basic_string_view( sv2 );
1046 BOOST_CXX14_CONSTEXPR friend bool operator==( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1048 return basic_string_view( sv1 ) == sv2;
1051 BOOST_CXX14_CONSTEXPR friend bool operator!=( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT
1053 return !( sv1 == sv2 );
1056 BOOST_CXX14_CONSTEXPR friend bool operator!=( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1058 return !( sv1 == sv2 );
1061 BOOST_CXX14_CONSTEXPR friend bool operator<( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT
1063 return sv1.compare( sv2 ) < 0;
1066 BOOST_CXX14_CONSTEXPR friend bool operator<( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1068 return sv2.compare( sv1 ) > 0;
1071 BOOST_CXX14_CONSTEXPR friend bool operator<=( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT
1073 return sv1.compare( sv2 ) <= 0;
1076 BOOST_CXX14_CONSTEXPR friend bool operator<=( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1078 return sv2.compare( sv1 ) >= 0;
1081 BOOST_CXX14_CONSTEXPR friend bool operator>( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT
1083 return sv1.compare( sv2 ) > 0;
1086 BOOST_CXX14_CONSTEXPR friend bool operator>( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1088 return sv2.compare( sv1 ) < 0;
1091 BOOST_CXX14_CONSTEXPR friend bool operator>=( basic_string_view sv1, Ch const* sv2 ) BOOST_NOEXCEPT
1093 return sv1.compare( sv2 ) >= 0;
1096 BOOST_CXX14_CONSTEXPR friend bool operator>=( Ch const* sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1098 return sv2.compare( sv1 ) <= 0;
1101 // against std::string
1103 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator==( basic_string_view sv1, std::basic_string<Ch, std::char_traits<Ch>, A> const& sv2 ) BOOST_NOEXCEPT
1105 return sv1.size() == sv2.size() && traits_type::compare( sv1.data(), sv2.data(), sv1.size() ) == 0;
1108 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator==( std::basic_string<Ch, std::char_traits<Ch>, A> const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1110 return sv1.size() == sv2.size() && traits_type::compare( sv1.data(), sv2.data(), sv1.size() ) == 0;
1113 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator!=( basic_string_view sv1, std::basic_string<Ch, std::char_traits<Ch>, A> const& sv2 ) BOOST_NOEXCEPT
1115 return !( sv1 == sv2 );
1118 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator!=( std::basic_string<Ch, std::char_traits<Ch>, A> const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1120 return !( sv1 == sv2 );
1123 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator<( basic_string_view sv1, std::basic_string<Ch, std::char_traits<Ch>, A> const& sv2 ) BOOST_NOEXCEPT
1125 return sv1.compare( sv2 ) < 0;
1128 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator<( std::basic_string<Ch, std::char_traits<Ch>, A> const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1130 return sv2.compare( sv1 ) > 0;
1133 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator<=( basic_string_view sv1, std::basic_string<Ch, std::char_traits<Ch>, A> const& sv2 ) BOOST_NOEXCEPT
1135 return sv1.compare( sv2 ) <= 0;
1138 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator<=( std::basic_string<Ch, std::char_traits<Ch>, A> const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1140 return sv2.compare( sv1 ) >= 0;
1143 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator>( basic_string_view sv1, std::basic_string<Ch, std::char_traits<Ch>, A> const& sv2 ) BOOST_NOEXCEPT
1145 return sv1.compare( sv2 ) > 0;
1148 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator>( std::basic_string<Ch, std::char_traits<Ch>, A> const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1150 return sv2.compare( sv1 ) < 0;
1153 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator>=( basic_string_view sv1, std::basic_string<Ch, std::char_traits<Ch>, A> const& sv2 ) BOOST_NOEXCEPT
1155 return sv1.compare( sv2 ) >= 0;
1158 template<class A> BOOST_CXX14_CONSTEXPR friend bool operator>=( std::basic_string<Ch, std::char_traits<Ch>, A> const& sv1, basic_string_view sv2 ) BOOST_NOEXCEPT
1160 return sv2.compare( sv1 ) <= 0;
1168 template<class Ch> std::basic_ostream<Ch>& operator<<( std::basic_ostream<Ch>& os, basic_string_view<Ch> str )
1170 Ch const* p = str.data();
1171 std::streamsize n = str.size();
1173 std::streamsize m = os.width();
1179 else if( ( os.flags() & std::ios_base::adjustfield ) == std::ios_base::left )
1198 #if defined(BOOST_NO_CXX17_INLINE_VARIABLES)
1199 template<class Ch> BOOST_CONSTEXPR_OR_CONST std::size_t basic_string_view<Ch>::npos;
1204 typedef basic_string_view<char> string_view;
1205 typedef basic_string_view<wchar_t> wstring_view;
1207 #if !defined(BOOST_NO_CXX11_CHAR16_T)
1208 typedef basic_string_view<char16_t> u16string_view;
1211 #if !defined(BOOST_NO_CXX11_CHAR32_T)
1212 typedef basic_string_view<char32_t> u32string_view;
1215 #if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L
1216 typedef basic_string_view<char8_t> u8string_view;
1220 } // namespace boost
1222 // std::common_reference support
1223 // needed for iterators that have reference=string_view and value_type=std::string
1225 #if !defined(BOOST_NO_CXX20_HDR_CONCEPTS)
1227 template<class Ch, class A, template<class> class Q1, template<class> class Q2>
1228 struct std::basic_common_reference<
1229 boost::core::basic_string_view<Ch>,
1230 std::basic_string<Ch, std::char_traits<Ch>, A>,
1233 using type = boost::core::basic_string_view<Ch>;
1236 template<class Ch, class A, template<class> class Q1, template<class> class Q2>
1237 struct std::basic_common_reference<
1238 std::basic_string<Ch, std::char_traits<Ch>, A>,
1239 boost::core::basic_string_view<Ch>,
1242 using type = boost::core::basic_string_view<Ch>;
1247 #endif // #ifndef BOOST_CORE_STRING_VIEW_HPP_INCLUDED