28 namespace StringViewImp
30 template <
typename Tsv>
31 bool sv_imatch( Tsv a , Tsv b )
noexcept
33 if( a.empty() || b.empty() )
return a.empty() && b.empty() ;
34 if( a.size() != b.size() )
return false ;
35 const char *
const end = a.data() + a.size() ;
36 const char * q = b.data() ;
37 for(
const char * p = a.data() ; p != end ; ++p , ++q )
41 if( c1 >=
'A' && c1 <=
'Z' ) c1 +=
'\x20' ;
42 if( c2 >=
'A' && c2 <=
'Z' ) c2 +=
'\x20' ;
43 if( c1 != c2 )
return false ;
47 template <
typename Tsv>
48 Tsv sv_substr( Tsv sv , std::size_t pos , std::size_t count )
noexcept
50 if( pos >= sv.size() )
51 return { sv.data() , std::size_t(0U) } ;
53 return { sv.data() + pos , std::min(sv.size()-pos,count) } ;
58#if GCONFIG_HAVE_CXX_STRING_VIEW
60bool G::sv_imatch( std::string_view a , std::string_view b )
noexcept
62 return StringViewImp::sv_imatch<std::string_view>( a , b ) ;
65std::string_view G::sv_substr_noexcept( std::string_view a , std::size_t pos , std::size_t count )
noexcept
67 return StringViewImp::sv_substr<std::string_view>( a , pos , count ) ;
74 return StringViewImp::sv_imatch<G::string_view>( a , b ) ;
79 return StringViewImp::sv_substr<G::string_view>( a , pos , count ) ;
82G::string_view G::string_view::substr( std::size_t pos , std::size_t count )
const
84 if( (empty() && pos!=0U) || pos > m_n )
85 throw std::out_of_range(
"string_view::substr" ) ;
87 return { m_p , std::size_t(0U) } ;
89 return { m_p + pos , std::min(m_n-pos,count) } ;
92std::size_t G::string_view::find(
char c , std::size_t pos )
const noexcept
94 if( empty() || pos >= m_n )
return std::string::npos ;
95 const char * p = m_p + pos ;
96 std::size_t n = m_n - pos ;
97 for( ; n ; p++ , n-- , pos++ )
102 return std::string::npos ;
105std::size_t G::string_view::find(
const char * substr_p , std::size_t pos , std::size_t substr_n )
const
107 return find( string_view(substr_p,substr_n) , pos ) ;
110std::size_t G::string_view::find( string_view substr , std::size_t pos )
const
112 if( empty() || pos >= m_n )
return std::string::npos ;
113 if( substr.empty() )
return pos ;
114 auto const end = m_p + m_n ;
115 auto p = std::search( m_p+pos , end , substr.m_p , substr.m_p+substr.m_n ) ;
116 return p == end ? std::string::npos : std::distance(m_p,p) ;
119std::size_t G::string_view::find_first_of(
const char * chars , std::size_t pos , std::size_t chars_size )
const noexcept
121 return find_first_of( string_view(chars,chars_size) , pos ) ;
124std::size_t G::string_view::find_first_of( string_view chars , std::size_t pos )
const noexcept
126 if( empty() || pos >= m_n || chars.empty() )
return std::string::npos ;
127 const char * p = m_p + pos ;
128 std::size_t n = m_n - pos ;
129 for( ; n ; p++ , n-- , pos++ )
131 const std::size_t i_end = chars.size() ;
132 for( std::size_t i = 0U ; i < i_end ; i++ )
138 return std::string::npos ;
141std::size_t G::string_view::find_first_not_of(
char c , std::size_t pos )
const noexcept
143 if( empty() || pos >= m_n )
return std::string::npos ;
144 const char * p = m_p + pos ;
145 std::size_t n = m_n - pos ;
146 for( ; n ; p++ , n-- , pos++ )
151 return std::string::npos ;
154std::size_t G::string_view::find_first_not_of(
const char * chars , std::size_t pos , std::size_t chars_size )
const noexcept
156 return find_first_not_of( string_view(chars,chars_size) , pos ) ;
159std::size_t G::string_view::find_first_not_of( string_view chars , std::size_t pos )
const noexcept
161 if( empty() || pos >= m_n )
return std::string::npos ;
162 const char * p = m_p + pos ;
163 std::size_t n = m_n - pos ;
164 for( ; n ; p++ , n-- , pos++ )
167 const std::size_t i_end = chars.size() ;
168 for( std::size_t i = 0U ; !match && i < i_end ; i++ )
176 return std::string::npos ;
179std::size_t G::string_view::find_last_of(
const char * chars , std::size_t pos , std::size_t chars_size )
const noexcept
181 return find_last_of( string_view(chars,chars_size) , pos ) ;
184std::size_t G::string_view::find_last_of( string_view chars , std::size_t pos )
const noexcept
186 if( empty() )
return std::string::npos ;
187 if( pos >= m_n ) pos = m_n - 1U ;
188 const char * p = data() + pos ;
189 std::size_t count = pos ;
190 for( std::size_t n = 0U ; n <= count ; n++ , p-- , pos-- )
193 const std::size_t i_end = chars.size() ;
194 for( std::size_t i = 0U ; !match && i < i_end ; i++ )
202 return std::string::npos ;
205std::size_t G::string_view::find_last_not_of(
const char * chars , std::size_t pos , std::size_t chars_size )
const noexcept
207 return find_last_not_of( string_view(chars,chars_size) , pos ) ;
210std::size_t G::string_view::find_last_not_of( string_view chars , std::size_t pos )
const noexcept
212 if( empty() )
return std::string::npos ;
213 if( pos >= m_n ) pos = m_n - 1U ;
214 const char * p = data() + pos ;
215 std::size_t count = pos ;
216 for( std::size_t n = 0U ; n <= count ; n++ , p-- , pos-- )
219 const std::size_t i_end = chars.size() ;
220 for( std::size_t i = 0U ; !match && i < i_end ; i++ )
228 return std::string::npos ;
231std::size_t G::string_view::rfind(
char c , std::size_t pos )
const noexcept
233 if( empty() || pos == 0U )
return std::string::npos ;
234 if( pos == std::string::npos || pos > m_n ) pos = m_n ;
235 const char * p = m_p + pos - 1U ;
236 std::size_t n = pos - 1U ;
237 for( ; n ; n-- , p-- )
242 return std::string::npos ;
A class like c++17's std::string_view.