24bool G::sv_imatch( string_view a , string_view b )
noexcept
26 if( a.empty() || b.empty() )
return a.empty() && b.empty() ;
27 if( a.size() != b.size() )
return false ;
28 const char *
const end = a.data() + a.size() ;
29 const char * q = b.data() ;
30 for(
const char * p = a.data() ; p != end ; ++p , ++q )
34 if( c1 >=
'A' && c1 <=
'Z' ) c1 +=
'\x20' ;
35 if( c2 >=
'A' && c2 <=
'Z' ) c2 +=
'\x20' ;
36 if( c1 != c2 )
return false ;
41G::string_view G::sv_substr( string_view sv , std::size_t pos , std::size_t count )
noexcept
43 if( pos >= sv.size() )
44 return { sv.data() , std::size_t(0U) } ;
46 return { sv.data() + pos , std::min(sv.size()-pos,count) } ;
51int G::string_view::compare(
const string_view & other )
const noexcept
53 int rc = ( empty() || other.empty() ) ? 0 : std::char_traits<char>::compare( m_p , other.m_p , std::min(m_n,other.m_n) ) ;
54 return rc == 0 ? ( m_n < other.m_n ? -1 : (m_n==other.m_n?0:1) ) : rc ;
57G::string_view G::string_view::substr( std::size_t pos , std::size_t count )
const
59 if( (empty() && pos!=0U) || pos > m_n )
60 throw std::out_of_range(
"string_view::substr" ) ;
62 return { m_p , std::size_t(0U) } ;
64 return { m_p + pos , std::min(m_n-pos,count) } ;
67std::size_t G::string_view::find(
char c , std::size_t pos )
const noexcept
69 if( empty() || pos >= m_n )
return std::string::npos ;
70 const char * p = m_p + pos ;
71 std::size_t n = m_n - pos ;
72 for( ; n ; p++ , n-- , pos++ )
77 return std::string::npos ;
80std::size_t G::string_view::find(
const char * substr_p , std::size_t pos , std::size_t substr_n )
const
82 return find( string_view(substr_p,substr_n) , pos ) ;
85std::size_t G::string_view::find( string_view substr , std::size_t pos )
const
87 if( empty() || pos >= m_n )
return std::string::npos ;
88 if( substr.empty() )
return pos ;
89 auto const end = m_p + m_n ;
90 auto p = std::search( m_p+pos , end , substr.m_p , substr.m_p+substr.m_n ) ;
91 return p == end ? std::string::npos : std::distance(m_p,p) ;
94std::size_t G::string_view::find_first_of(
const char * chars , std::size_t pos , std::size_t chars_size )
const noexcept
96 return find_first_of( string_view(chars,chars_size) , pos ) ;
99std::size_t G::string_view::find_first_of( string_view chars , std::size_t pos )
const noexcept
101 if( empty() || pos >= m_n || chars.empty() )
return std::string::npos ;
102 const char * p = m_p + pos ;
103 std::size_t n = m_n - pos ;
104 for( ; n ; p++ , n-- , pos++ )
106 const std::size_t i_end = chars.size() ;
107 for( std::size_t i = 0U ; i < i_end ; i++ )
113 return std::string::npos ;
116std::size_t G::string_view::find_first_not_of(
char c , std::size_t pos )
const noexcept
118 if( empty() || pos >= m_n )
return std::string::npos ;
119 const char * p = m_p + pos ;
120 std::size_t n = m_n - pos ;
121 for( ; n ; p++ , n-- , pos++ )
126 return std::string::npos ;
129std::size_t G::string_view::find_first_not_of(
const char * chars , std::size_t pos , std::size_t chars_size )
const noexcept
131 return find_first_not_of( string_view(chars,chars_size) , pos ) ;
134std::size_t G::string_view::find_first_not_of( string_view chars , std::size_t pos )
const noexcept
136 if( empty() || pos >= m_n )
return std::string::npos ;
137 const char * p = m_p + pos ;
138 std::size_t n = m_n - pos ;
139 for( ; n ; p++ , n-- , pos++ )
142 const std::size_t i_end = chars.size() ;
143 for( std::size_t i = 0U ; !match && i < i_end ; i++ )
151 return std::string::npos ;
155std::size_t G::string_view::find_last_of(
const char * chars , std::size_t pos , std::size_t chars_size )
const noexcept
157 return find_last_of( string_view(chars,chars_size) , pos ) ;
161std::size_t G::string_view::find_last_of( string_view chars , std::size_t pos )
const noexcept
163 if( empty() )
return std::string::npos ;
164 if( pos >= m_n ) pos = m_n - 1U ;
165 const char * p = data() + pos ;
166 std::size_t count = pos ;
167 for( std::size_t n = 0U ; n <= count ; n++ , p-- , pos-- )
170 const std::size_t i_end = chars.size() ;
171 for( std::size_t i = 0U ; !match && i < i_end ; i++ )
179 return std::string::npos ;
183std::size_t G::string_view::find_last_not_of(
const char * chars , std::size_t pos , std::size_t chars_size )
const noexcept
185 return find_last_not_of( string_view(chars,chars_size) , pos ) ;
189std::size_t G::string_view::find_last_not_of( string_view chars , std::size_t pos )
const noexcept
191 if( empty() )
return std::string::npos ;
192 if( pos >= m_n ) pos = m_n - 1U ;
193 const char * p = data() + pos ;
194 std::size_t count = pos ;
195 for( std::size_t n = 0U ; n <= count ; n++ , p-- , pos-- )
198 const std::size_t i_end = chars.size() ;
199 for( std::size_t i = 0U ; !match && i < i_end ; i++ )
207 return std::string::npos ;
210std::size_t G::string_view::rfind(
char c , std::size_t pos )
const noexcept
212 if( empty() || pos == 0U )
return std::string::npos ;
213 if( pos == std::string::npos || pos > m_n ) pos = m_n ;
214 const char * p = m_p + pos - 1U ;
215 std::size_t n = pos - 1U ;
216 for( ; n ; n-- , p-- )
221 return std::string::npos ;
A class like c++17's std::string_view.