1 1.1 mrg // Versatile string -*- C++ -*- 2 1.1 mrg 3 1.1.1.12 mrg // Copyright (C) 2005-2024 Free Software Foundation, Inc. 4 1.1 mrg // 5 1.1 mrg // This file is part of the GNU ISO C++ Library. This library is free 6 1.1 mrg // software; you can redistribute it and/or modify it under the 7 1.1 mrg // terms of the GNU General Public License as published by the 8 1.1 mrg // Free Software Foundation; either version 3, or (at your option) 9 1.1 mrg // any later version. 10 1.1 mrg 11 1.1 mrg // This library is distributed in the hope that it will be useful, 12 1.1 mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 mrg // GNU General Public License for more details. 15 1.1 mrg 16 1.1 mrg // Under Section 7 of GPL version 3, you are granted additional 17 1.1 mrg // permissions described in the GCC Runtime Library Exception, version 18 1.1 mrg // 3.1, as published by the Free Software Foundation. 19 1.1 mrg 20 1.1 mrg // You should have received a copy of the GNU General Public License and 21 1.1 mrg // a copy of the GCC Runtime Library Exception along with this program; 22 1.1 mrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 1.1 mrg // <http://www.gnu.org/licenses/>. 24 1.1 mrg 25 1.1 mrg /** @file ext/vstring.tcc 26 1.1 mrg * This is an internal header file, included by other library headers. 27 1.1.1.2 mrg * Do not attempt to use it directly. @headername{ext/vstring.h} 28 1.1 mrg */ 29 1.1 mrg 30 1.1 mrg #ifndef _VSTRING_TCC 31 1.1 mrg #define _VSTRING_TCC 1 32 1.1 mrg 33 1.1 mrg #pragma GCC system_header 34 1.1 mrg 35 1.1.1.12 mrg #include <bits/requires_hosted.h> // GNU extensions are currently omitted 36 1.1.1.12 mrg 37 1.1.1.2 mrg #include <bits/cxxabi_forced.h> 38 1.1 mrg 39 1.1.1.2 mrg namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 40 1.1.1.2 mrg { 41 1.1.1.2 mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION 42 1.1 mrg 43 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 44 1.1 mrg template <typename, typename, typename> class _Base> 45 1.1 mrg const typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 46 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>::npos; 47 1.1 mrg 48 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 49 1.1 mrg template <typename, typename, typename> class _Base> 50 1.1 mrg void 51 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 52 1.1 mrg resize(size_type __n, _CharT __c) 53 1.1 mrg { 54 1.1 mrg const size_type __size = this->size(); 55 1.1 mrg if (__size < __n) 56 1.1 mrg this->append(__n - __size, __c); 57 1.1 mrg else if (__n < __size) 58 1.1 mrg this->_M_erase(__n, __size - __n); 59 1.1 mrg } 60 1.1 mrg 61 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 62 1.1 mrg template <typename, typename, typename> class _Base> 63 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>& 64 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 65 1.1 mrg _M_append(const _CharT* __s, size_type __n) 66 1.1 mrg { 67 1.1 mrg const size_type __len = __n + this->size(); 68 1.1 mrg 69 1.1 mrg if (__len <= this->capacity() && !this->_M_is_shared()) 70 1.1 mrg { 71 1.1 mrg if (__n) 72 1.1 mrg this->_S_copy(this->_M_data() + this->size(), __s, __n); 73 1.1 mrg } 74 1.1 mrg else 75 1.1 mrg this->_M_mutate(this->size(), size_type(0), __s, __n); 76 1.1 mrg 77 1.1 mrg this->_M_set_length(__len); 78 1.1 mrg return *this; 79 1.1 mrg } 80 1.1 mrg 81 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 82 1.1 mrg template <typename, typename, typename> class _Base> 83 1.1 mrg template<typename _InputIterator> 84 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>& 85 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 86 1.1.1.3 mrg _M_replace_dispatch(const_iterator __i1, const_iterator __i2, 87 1.1.1.3 mrg _InputIterator __k1, _InputIterator __k2, 88 1.1.1.3 mrg std::__false_type) 89 1.1 mrg { 90 1.1 mrg const __versa_string __s(__k1, __k2); 91 1.1 mrg const size_type __n1 = __i2 - __i1; 92 1.1 mrg return _M_replace(__i1 - _M_ibegin(), __n1, __s._M_data(), 93 1.1 mrg __s.size()); 94 1.1 mrg } 95 1.1 mrg 96 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 97 1.1 mrg template <typename, typename, typename> class _Base> 98 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>& 99 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 100 1.1 mrg _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2, 101 1.1 mrg _CharT __c) 102 1.1 mrg { 103 1.1 mrg _M_check_length(__n1, __n2, "__versa_string::_M_replace_aux"); 104 1.1 mrg 105 1.1 mrg const size_type __old_size = this->size(); 106 1.1 mrg const size_type __new_size = __old_size + __n2 - __n1; 107 1.1 mrg 108 1.1 mrg if (__new_size <= this->capacity() && !this->_M_is_shared()) 109 1.1 mrg { 110 1.1 mrg _CharT* __p = this->_M_data() + __pos1; 111 1.1 mrg 112 1.1 mrg const size_type __how_much = __old_size - __pos1 - __n1; 113 1.1 mrg if (__how_much && __n1 != __n2) 114 1.1 mrg this->_S_move(__p + __n2, __p + __n1, __how_much); 115 1.1 mrg } 116 1.1 mrg else 117 1.1 mrg this->_M_mutate(__pos1, __n1, 0, __n2); 118 1.1 mrg 119 1.1 mrg if (__n2) 120 1.1 mrg this->_S_assign(this->_M_data() + __pos1, __n2, __c); 121 1.1 mrg 122 1.1 mrg this->_M_set_length(__new_size); 123 1.1 mrg return *this; 124 1.1 mrg } 125 1.1 mrg 126 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 127 1.1 mrg template <typename, typename, typename> class _Base> 128 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>& 129 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 130 1.1 mrg _M_replace(size_type __pos, size_type __len1, const _CharT* __s, 131 1.1 mrg const size_type __len2) 132 1.1 mrg { 133 1.1 mrg _M_check_length(__len1, __len2, "__versa_string::_M_replace"); 134 1.1 mrg 135 1.1 mrg const size_type __old_size = this->size(); 136 1.1 mrg const size_type __new_size = __old_size + __len2 - __len1; 137 1.1 mrg 138 1.1 mrg if (__new_size <= this->capacity() && !this->_M_is_shared()) 139 1.1 mrg { 140 1.1 mrg _CharT* __p = this->_M_data() + __pos; 141 1.1 mrg 142 1.1 mrg const size_type __how_much = __old_size - __pos - __len1; 143 1.1 mrg if (_M_disjunct(__s)) 144 1.1 mrg { 145 1.1 mrg if (__how_much && __len1 != __len2) 146 1.1 mrg this->_S_move(__p + __len2, __p + __len1, __how_much); 147 1.1 mrg if (__len2) 148 1.1 mrg this->_S_copy(__p, __s, __len2); 149 1.1 mrg } 150 1.1 mrg else 151 1.1 mrg { 152 1.1 mrg // Work in-place. 153 1.1 mrg if (__len2 && __len2 <= __len1) 154 1.1 mrg this->_S_move(__p, __s, __len2); 155 1.1 mrg if (__how_much && __len1 != __len2) 156 1.1 mrg this->_S_move(__p + __len2, __p + __len1, __how_much); 157 1.1 mrg if (__len2 > __len1) 158 1.1 mrg { 159 1.1 mrg if (__s + __len2 <= __p + __len1) 160 1.1 mrg this->_S_move(__p, __s, __len2); 161 1.1 mrg else if (__s >= __p + __len1) 162 1.1 mrg this->_S_copy(__p, __s + __len2 - __len1, __len2); 163 1.1 mrg else 164 1.1 mrg { 165 1.1 mrg const size_type __nleft = (__p + __len1) - __s; 166 1.1 mrg this->_S_move(__p, __s, __nleft); 167 1.1 mrg this->_S_copy(__p + __nleft, __p + __len2, 168 1.1 mrg __len2 - __nleft); 169 1.1 mrg } 170 1.1 mrg } 171 1.1 mrg } 172 1.1 mrg } 173 1.1 mrg else 174 1.1 mrg this->_M_mutate(__pos, __len1, __s, __len2); 175 1.1 mrg 176 1.1 mrg this->_M_set_length(__new_size); 177 1.1 mrg return *this; 178 1.1 mrg } 179 1.1 mrg 180 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 181 1.1 mrg template <typename, typename, typename> class _Base> 182 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base> 183 1.1 mrg operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 184 1.1 mrg const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 185 1.1 mrg { 186 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base> __str; 187 1.1 mrg __str.reserve(__lhs.size() + __rhs.size()); 188 1.1 mrg __str.append(__lhs); 189 1.1 mrg __str.append(__rhs); 190 1.1 mrg return __str; 191 1.1 mrg } 192 1.1 mrg 193 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 194 1.1 mrg template <typename, typename, typename> class _Base> 195 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base> 196 1.1 mrg operator+(const _CharT* __lhs, 197 1.1 mrg const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 198 1.1 mrg { 199 1.1 mrg __glibcxx_requires_string(__lhs); 200 1.1 mrg typedef __versa_string<_CharT, _Traits, _Alloc, _Base> __string_type; 201 1.1 mrg typedef typename __string_type::size_type __size_type; 202 1.1 mrg const __size_type __len = _Traits::length(__lhs); 203 1.1 mrg __string_type __str; 204 1.1 mrg __str.reserve(__len + __rhs.size()); 205 1.1 mrg __str.append(__lhs, __len); 206 1.1 mrg __str.append(__rhs); 207 1.1 mrg return __str; 208 1.1 mrg } 209 1.1 mrg 210 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 211 1.1 mrg template <typename, typename, typename> class _Base> 212 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base> 213 1.1 mrg operator+(_CharT __lhs, 214 1.1 mrg const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 215 1.1 mrg { 216 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base> __str; 217 1.1 mrg __str.reserve(__rhs.size() + 1); 218 1.1 mrg __str.push_back(__lhs); 219 1.1 mrg __str.append(__rhs); 220 1.1 mrg return __str; 221 1.1 mrg } 222 1.1 mrg 223 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 224 1.1 mrg template <typename, typename, typename> class _Base> 225 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base> 226 1.1 mrg operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 227 1.1 mrg const _CharT* __rhs) 228 1.1 mrg { 229 1.1 mrg __glibcxx_requires_string(__rhs); 230 1.1 mrg typedef __versa_string<_CharT, _Traits, _Alloc, _Base> __string_type; 231 1.1 mrg typedef typename __string_type::size_type __size_type; 232 1.1 mrg const __size_type __len = _Traits::length(__rhs); 233 1.1 mrg __string_type __str; 234 1.1 mrg __str.reserve(__lhs.size() + __len); 235 1.1 mrg __str.append(__lhs); 236 1.1 mrg __str.append(__rhs, __len); 237 1.1 mrg return __str; 238 1.1 mrg } 239 1.1 mrg 240 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 241 1.1 mrg template <typename, typename, typename> class _Base> 242 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base> 243 1.1 mrg operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 244 1.1 mrg _CharT __rhs) 245 1.1 mrg { 246 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base> __str; 247 1.1 mrg __str.reserve(__lhs.size() + 1); 248 1.1 mrg __str.append(__lhs); 249 1.1 mrg __str.push_back(__rhs); 250 1.1 mrg return __str; 251 1.1 mrg } 252 1.1 mrg 253 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 254 1.1 mrg template <typename, typename, typename> class _Base> 255 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 256 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 257 1.1 mrg copy(_CharT* __s, size_type __n, size_type __pos) const 258 1.1 mrg { 259 1.1 mrg _M_check(__pos, "__versa_string::copy"); 260 1.1 mrg __n = _M_limit(__pos, __n); 261 1.1 mrg __glibcxx_requires_string_len(__s, __n); 262 1.1 mrg if (__n) 263 1.1 mrg this->_S_copy(__s, this->_M_data() + __pos, __n); 264 1.1 mrg // 21.3.5.7 par 3: do not append null. (good.) 265 1.1 mrg return __n; 266 1.1 mrg } 267 1.1 mrg 268 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 269 1.1 mrg template <typename, typename, typename> class _Base> 270 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 271 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 272 1.1 mrg find(const _CharT* __s, size_type __pos, size_type __n) const 273 1.1 mrg { 274 1.1 mrg __glibcxx_requires_string_len(__s, __n); 275 1.1 mrg const size_type __size = this->size(); 276 1.1 mrg const _CharT* __data = this->_M_data(); 277 1.1 mrg 278 1.1 mrg if (__n == 0) 279 1.1 mrg return __pos <= __size ? __pos : npos; 280 1.1 mrg 281 1.1 mrg if (__n <= __size) 282 1.1 mrg { 283 1.1 mrg for (; __pos <= __size - __n; ++__pos) 284 1.1 mrg if (traits_type::eq(__data[__pos], __s[0]) 285 1.1 mrg && traits_type::compare(__data + __pos + 1, 286 1.1 mrg __s + 1, __n - 1) == 0) 287 1.1 mrg return __pos; 288 1.1 mrg } 289 1.1 mrg return npos; 290 1.1 mrg } 291 1.1 mrg 292 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 293 1.1 mrg template <typename, typename, typename> class _Base> 294 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 295 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 296 1.1.1.2 mrg find(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT 297 1.1 mrg { 298 1.1 mrg size_type __ret = npos; 299 1.1 mrg const size_type __size = this->size(); 300 1.1 mrg if (__pos < __size) 301 1.1 mrg { 302 1.1 mrg const _CharT* __data = this->_M_data(); 303 1.1 mrg const size_type __n = __size - __pos; 304 1.1 mrg const _CharT* __p = traits_type::find(__data + __pos, __n, __c); 305 1.1 mrg if (__p) 306 1.1 mrg __ret = __p - __data; 307 1.1 mrg } 308 1.1 mrg return __ret; 309 1.1 mrg } 310 1.1 mrg 311 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 312 1.1 mrg template <typename, typename, typename> class _Base> 313 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 314 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 315 1.1 mrg rfind(const _CharT* __s, size_type __pos, size_type __n) const 316 1.1 mrg { 317 1.1 mrg __glibcxx_requires_string_len(__s, __n); 318 1.1 mrg const size_type __size = this->size(); 319 1.1 mrg if (__n <= __size) 320 1.1 mrg { 321 1.1 mrg __pos = std::min(size_type(__size - __n), __pos); 322 1.1 mrg const _CharT* __data = this->_M_data(); 323 1.1 mrg do 324 1.1 mrg { 325 1.1 mrg if (traits_type::compare(__data + __pos, __s, __n) == 0) 326 1.1 mrg return __pos; 327 1.1 mrg } 328 1.1 mrg while (__pos-- > 0); 329 1.1 mrg } 330 1.1 mrg return npos; 331 1.1 mrg } 332 1.1 mrg 333 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 334 1.1 mrg template <typename, typename, typename> class _Base> 335 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 336 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 337 1.1.1.2 mrg rfind(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT 338 1.1 mrg { 339 1.1 mrg size_type __size = this->size(); 340 1.1 mrg if (__size) 341 1.1 mrg { 342 1.1 mrg if (--__size > __pos) 343 1.1 mrg __size = __pos; 344 1.1 mrg for (++__size; __size-- > 0; ) 345 1.1 mrg if (traits_type::eq(this->_M_data()[__size], __c)) 346 1.1 mrg return __size; 347 1.1 mrg } 348 1.1 mrg return npos; 349 1.1 mrg } 350 1.1 mrg 351 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 352 1.1 mrg template <typename, typename, typename> class _Base> 353 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 354 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 355 1.1 mrg find_first_of(const _CharT* __s, size_type __pos, size_type __n) const 356 1.1 mrg { 357 1.1 mrg __glibcxx_requires_string_len(__s, __n); 358 1.1 mrg for (; __n && __pos < this->size(); ++__pos) 359 1.1 mrg { 360 1.1 mrg const _CharT* __p = traits_type::find(__s, __n, 361 1.1 mrg this->_M_data()[__pos]); 362 1.1 mrg if (__p) 363 1.1 mrg return __pos; 364 1.1 mrg } 365 1.1 mrg return npos; 366 1.1 mrg } 367 1.1 mrg 368 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 369 1.1 mrg template <typename, typename, typename> class _Base> 370 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 371 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 372 1.1 mrg find_last_of(const _CharT* __s, size_type __pos, size_type __n) const 373 1.1 mrg { 374 1.1 mrg __glibcxx_requires_string_len(__s, __n); 375 1.1 mrg size_type __size = this->size(); 376 1.1 mrg if (__size && __n) 377 1.1 mrg { 378 1.1 mrg if (--__size > __pos) 379 1.1 mrg __size = __pos; 380 1.1 mrg do 381 1.1 mrg { 382 1.1 mrg if (traits_type::find(__s, __n, this->_M_data()[__size])) 383 1.1 mrg return __size; 384 1.1 mrg } 385 1.1 mrg while (__size-- != 0); 386 1.1 mrg } 387 1.1 mrg return npos; 388 1.1 mrg } 389 1.1 mrg 390 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 391 1.1 mrg template <typename, typename, typename> class _Base> 392 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 393 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 394 1.1 mrg find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const 395 1.1 mrg { 396 1.1 mrg __glibcxx_requires_string_len(__s, __n); 397 1.1 mrg for (; __pos < this->size(); ++__pos) 398 1.1 mrg if (!traits_type::find(__s, __n, this->_M_data()[__pos])) 399 1.1 mrg return __pos; 400 1.1 mrg return npos; 401 1.1 mrg } 402 1.1 mrg 403 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 404 1.1 mrg template <typename, typename, typename> class _Base> 405 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 406 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 407 1.1.1.2 mrg find_first_not_of(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT 408 1.1 mrg { 409 1.1 mrg for (; __pos < this->size(); ++__pos) 410 1.1 mrg if (!traits_type::eq(this->_M_data()[__pos], __c)) 411 1.1 mrg return __pos; 412 1.1 mrg return npos; 413 1.1 mrg } 414 1.1 mrg 415 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 416 1.1 mrg template <typename, typename, typename> class _Base> 417 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 418 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 419 1.1 mrg find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const 420 1.1 mrg { 421 1.1 mrg __glibcxx_requires_string_len(__s, __n); 422 1.1 mrg size_type __size = this->size(); 423 1.1 mrg if (__size) 424 1.1 mrg { 425 1.1 mrg if (--__size > __pos) 426 1.1 mrg __size = __pos; 427 1.1 mrg do 428 1.1 mrg { 429 1.1 mrg if (!traits_type::find(__s, __n, this->_M_data()[__size])) 430 1.1 mrg return __size; 431 1.1 mrg } 432 1.1 mrg while (__size--); 433 1.1 mrg } 434 1.1 mrg return npos; 435 1.1 mrg } 436 1.1 mrg 437 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 438 1.1 mrg template <typename, typename, typename> class _Base> 439 1.1 mrg typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 440 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 441 1.1.1.2 mrg find_last_not_of(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT 442 1.1 mrg { 443 1.1 mrg size_type __size = this->size(); 444 1.1 mrg if (__size) 445 1.1 mrg { 446 1.1 mrg if (--__size > __pos) 447 1.1 mrg __size = __pos; 448 1.1 mrg do 449 1.1 mrg { 450 1.1 mrg if (!traits_type::eq(this->_M_data()[__size], __c)) 451 1.1 mrg return __size; 452 1.1 mrg } 453 1.1 mrg while (__size--); 454 1.1 mrg } 455 1.1 mrg return npos; 456 1.1 mrg } 457 1.1 mrg 458 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 459 1.1 mrg template <typename, typename, typename> class _Base> 460 1.1 mrg int 461 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 462 1.1 mrg compare(size_type __pos, size_type __n, const __versa_string& __str) const 463 1.1 mrg { 464 1.1 mrg _M_check(__pos, "__versa_string::compare"); 465 1.1 mrg __n = _M_limit(__pos, __n); 466 1.1 mrg const size_type __osize = __str.size(); 467 1.1 mrg const size_type __len = std::min(__n, __osize); 468 1.1 mrg int __r = traits_type::compare(this->_M_data() + __pos, 469 1.1 mrg __str.data(), __len); 470 1.1 mrg if (!__r) 471 1.1.1.2 mrg __r = this->_S_compare(__n, __osize); 472 1.1 mrg return __r; 473 1.1 mrg } 474 1.1 mrg 475 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 476 1.1 mrg template <typename, typename, typename> class _Base> 477 1.1 mrg int 478 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 479 1.1 mrg compare(size_type __pos1, size_type __n1, const __versa_string& __str, 480 1.1 mrg size_type __pos2, size_type __n2) const 481 1.1 mrg { 482 1.1 mrg _M_check(__pos1, "__versa_string::compare"); 483 1.1 mrg __str._M_check(__pos2, "__versa_string::compare"); 484 1.1 mrg __n1 = _M_limit(__pos1, __n1); 485 1.1 mrg __n2 = __str._M_limit(__pos2, __n2); 486 1.1 mrg const size_type __len = std::min(__n1, __n2); 487 1.1 mrg int __r = traits_type::compare(this->_M_data() + __pos1, 488 1.1 mrg __str.data() + __pos2, __len); 489 1.1 mrg if (!__r) 490 1.1.1.2 mrg __r = this->_S_compare(__n1, __n2); 491 1.1 mrg return __r; 492 1.1 mrg } 493 1.1 mrg 494 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 495 1.1 mrg template <typename, typename, typename> class _Base> 496 1.1 mrg int 497 1.1 mrg __versa_string<_CharT, _Traits, _Alloc, _Base>:: 498 1.1 mrg compare(const _CharT* __s) const 499 1.1 mrg { 500 1.1 mrg __glibcxx_requires_string(__s); 501 1.1 mrg const size_type __size = this->size(); 502 1.1 mrg const size_type __osize = traits_type::length(__s); 503 1.1 mrg const size_type __len = std::min(__size, __osize); 504 1.1 mrg int __r = traits_type::compare(this->_M_data(), __s, __len); 505 1.1 mrg if (!__r) 506 1.1.1.2 mrg __r = this->_S_compare(__size, __osize); 507 1.1 mrg return __r; 508 1.1 mrg } 509 1.1 mrg 510 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 511 1.1 mrg template <typename, typename, typename> class _Base> 512 1.1 mrg int 513 1.1 mrg __versa_string <_CharT, _Traits, _Alloc, _Base>:: 514 1.1 mrg compare(size_type __pos, size_type __n1, const _CharT* __s) const 515 1.1 mrg { 516 1.1 mrg __glibcxx_requires_string(__s); 517 1.1 mrg _M_check(__pos, "__versa_string::compare"); 518 1.1 mrg __n1 = _M_limit(__pos, __n1); 519 1.1 mrg const size_type __osize = traits_type::length(__s); 520 1.1 mrg const size_type __len = std::min(__n1, __osize); 521 1.1 mrg int __r = traits_type::compare(this->_M_data() + __pos, __s, __len); 522 1.1 mrg if (!__r) 523 1.1.1.2 mrg __r = this->_S_compare(__n1, __osize); 524 1.1 mrg return __r; 525 1.1 mrg } 526 1.1 mrg 527 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 528 1.1 mrg template <typename, typename, typename> class _Base> 529 1.1 mrg int 530 1.1 mrg __versa_string <_CharT, _Traits, _Alloc, _Base>:: 531 1.1 mrg compare(size_type __pos, size_type __n1, const _CharT* __s, 532 1.1 mrg size_type __n2) const 533 1.1 mrg { 534 1.1 mrg __glibcxx_requires_string_len(__s, __n2); 535 1.1 mrg _M_check(__pos, "__versa_string::compare"); 536 1.1 mrg __n1 = _M_limit(__pos, __n1); 537 1.1 mrg const size_type __len = std::min(__n1, __n2); 538 1.1 mrg int __r = traits_type::compare(this->_M_data() + __pos, __s, __len); 539 1.1 mrg if (!__r) 540 1.1.1.2 mrg __r = this->_S_compare(__n1, __n2); 541 1.1 mrg return __r; 542 1.1 mrg } 543 1.1 mrg 544 1.1.1.2 mrg _GLIBCXX_END_NAMESPACE_VERSION 545 1.1.1.2 mrg } // namespace 546 1.1 mrg 547 1.1.1.2 mrg namespace std _GLIBCXX_VISIBILITY(default) 548 1.1.1.2 mrg { 549 1.1.1.2 mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION 550 1.1 mrg 551 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 552 1.1 mrg template <typename, typename, typename> class _Base> 553 1.1 mrg basic_istream<_CharT, _Traits>& 554 1.1 mrg operator>>(basic_istream<_CharT, _Traits>& __in, 555 1.1 mrg __gnu_cxx::__versa_string<_CharT, _Traits, 556 1.1 mrg _Alloc, _Base>& __str) 557 1.1 mrg { 558 1.1 mrg typedef basic_istream<_CharT, _Traits> __istream_type; 559 1.1 mrg typedef typename __istream_type::ios_base __ios_base; 560 1.1 mrg typedef __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base> 561 1.1 mrg __string_type; 562 1.1 mrg typedef typename __istream_type::int_type __int_type; 563 1.1 mrg typedef typename __string_type::size_type __size_type; 564 1.1 mrg typedef ctype<_CharT> __ctype_type; 565 1.1 mrg typedef typename __ctype_type::ctype_base __ctype_base; 566 1.1 mrg 567 1.1 mrg __size_type __extracted = 0; 568 1.1 mrg typename __ios_base::iostate __err = __ios_base::goodbit; 569 1.1 mrg typename __istream_type::sentry __cerb(__in, false); 570 1.1 mrg if (__cerb) 571 1.1 mrg { 572 1.1 mrg __try 573 1.1 mrg { 574 1.1 mrg // Avoid reallocation for common case. 575 1.1 mrg __str.erase(); 576 1.1 mrg _CharT __buf[128]; 577 1.1 mrg __size_type __len = 0; 578 1.1 mrg const streamsize __w = __in.width(); 579 1.1 mrg const __size_type __n = __w > 0 ? static_cast<__size_type>(__w) 580 1.1 mrg : __str.max_size(); 581 1.1 mrg const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc()); 582 1.1 mrg const __int_type __eof = _Traits::eof(); 583 1.1 mrg __int_type __c = __in.rdbuf()->sgetc(); 584 1.1 mrg 585 1.1 mrg while (__extracted < __n 586 1.1 mrg && !_Traits::eq_int_type(__c, __eof) 587 1.1 mrg && !__ct.is(__ctype_base::space, 588 1.1 mrg _Traits::to_char_type(__c))) 589 1.1 mrg { 590 1.1 mrg if (__len == sizeof(__buf) / sizeof(_CharT)) 591 1.1 mrg { 592 1.1 mrg __str.append(__buf, sizeof(__buf) / sizeof(_CharT)); 593 1.1 mrg __len = 0; 594 1.1 mrg } 595 1.1 mrg __buf[__len++] = _Traits::to_char_type(__c); 596 1.1 mrg ++__extracted; 597 1.1 mrg __c = __in.rdbuf()->snextc(); 598 1.1 mrg } 599 1.1 mrg __str.append(__buf, __len); 600 1.1 mrg 601 1.1 mrg if (_Traits::eq_int_type(__c, __eof)) 602 1.1 mrg __err |= __ios_base::eofbit; 603 1.1 mrg __in.width(0); 604 1.1 mrg } 605 1.1 mrg __catch(__cxxabiv1::__forced_unwind&) 606 1.1 mrg { 607 1.1 mrg __in._M_setstate(__ios_base::badbit); 608 1.1 mrg __throw_exception_again; 609 1.1 mrg } 610 1.1 mrg __catch(...) 611 1.1 mrg { 612 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 613 1.1 mrg // 91. Description of operator>> and getline() for string<> 614 1.1 mrg // might cause endless loop 615 1.1 mrg __in._M_setstate(__ios_base::badbit); 616 1.1 mrg } 617 1.1 mrg } 618 1.1 mrg // 211. operator>>(istream&, string&) doesn't set failbit 619 1.1 mrg if (!__extracted) 620 1.1 mrg __err |= __ios_base::failbit; 621 1.1 mrg if (__err) 622 1.1 mrg __in.setstate(__err); 623 1.1 mrg return __in; 624 1.1 mrg } 625 1.1 mrg 626 1.1 mrg template<typename _CharT, typename _Traits, typename _Alloc, 627 1.1 mrg template <typename, typename, typename> class _Base> 628 1.1 mrg basic_istream<_CharT, _Traits>& 629 1.1 mrg getline(basic_istream<_CharT, _Traits>& __in, 630 1.1 mrg __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str, 631 1.1 mrg _CharT __delim) 632 1.1 mrg { 633 1.1 mrg typedef basic_istream<_CharT, _Traits> __istream_type; 634 1.1 mrg typedef typename __istream_type::ios_base __ios_base; 635 1.1 mrg typedef __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base> 636 1.1 mrg __string_type; 637 1.1 mrg typedef typename __istream_type::int_type __int_type; 638 1.1 mrg typedef typename __string_type::size_type __size_type; 639 1.1 mrg 640 1.1 mrg __size_type __extracted = 0; 641 1.1 mrg const __size_type __n = __str.max_size(); 642 1.1 mrg typename __ios_base::iostate __err = __ios_base::goodbit; 643 1.1 mrg typename __istream_type::sentry __cerb(__in, true); 644 1.1 mrg if (__cerb) 645 1.1 mrg { 646 1.1 mrg __try 647 1.1 mrg { 648 1.1 mrg // Avoid reallocation for common case. 649 1.1 mrg __str.erase(); 650 1.1 mrg _CharT __buf[128]; 651 1.1 mrg __size_type __len = 0; 652 1.1 mrg const __int_type __idelim = _Traits::to_int_type(__delim); 653 1.1 mrg const __int_type __eof = _Traits::eof(); 654 1.1 mrg __int_type __c = __in.rdbuf()->sgetc(); 655 1.1 mrg 656 1.1 mrg while (__extracted < __n 657 1.1 mrg && !_Traits::eq_int_type(__c, __eof) 658 1.1 mrg && !_Traits::eq_int_type(__c, __idelim)) 659 1.1 mrg { 660 1.1 mrg if (__len == sizeof(__buf) / sizeof(_CharT)) 661 1.1 mrg { 662 1.1 mrg __str.append(__buf, sizeof(__buf) / sizeof(_CharT)); 663 1.1 mrg __len = 0; 664 1.1 mrg } 665 1.1 mrg __buf[__len++] = _Traits::to_char_type(__c); 666 1.1 mrg ++__extracted; 667 1.1 mrg __c = __in.rdbuf()->snextc(); 668 1.1 mrg } 669 1.1 mrg __str.append(__buf, __len); 670 1.1 mrg 671 1.1 mrg if (_Traits::eq_int_type(__c, __eof)) 672 1.1 mrg __err |= __ios_base::eofbit; 673 1.1 mrg else if (_Traits::eq_int_type(__c, __idelim)) 674 1.1 mrg { 675 1.1 mrg ++__extracted; 676 1.1 mrg __in.rdbuf()->sbumpc(); 677 1.1 mrg } 678 1.1 mrg else 679 1.1 mrg __err |= __ios_base::failbit; 680 1.1 mrg } 681 1.1 mrg __catch(__cxxabiv1::__forced_unwind&) 682 1.1 mrg { 683 1.1 mrg __in._M_setstate(__ios_base::badbit); 684 1.1 mrg __throw_exception_again; 685 1.1 mrg } 686 1.1 mrg __catch(...) 687 1.1 mrg { 688 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 689 1.1 mrg // 91. Description of operator>> and getline() for string<> 690 1.1 mrg // might cause endless loop 691 1.1 mrg __in._M_setstate(__ios_base::badbit); 692 1.1 mrg } 693 1.1 mrg } 694 1.1 mrg if (!__extracted) 695 1.1 mrg __err |= __ios_base::failbit; 696 1.1 mrg if (__err) 697 1.1 mrg __in.setstate(__err); 698 1.1 mrg return __in; 699 1.1 mrg } 700 1.1 mrg 701 1.1.1.2 mrg _GLIBCXX_END_NAMESPACE_VERSION 702 1.1.1.2 mrg } // namespace 703 1.1 mrg 704 1.1 mrg #endif // _VSTRING_TCC 705