1 1.1 mrg // Debugging string implementation -*- C++ -*- 2 1.1 mrg 3 1.14 mrg // Copyright (C) 2003-2022 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 debug/string 26 1.1 mrg * This file is a GNU debug extension to the Standard C++ Library. 27 1.1 mrg */ 28 1.1 mrg 29 1.1 mrg #ifndef _GLIBCXX_DEBUG_STRING 30 1.1 mrg #define _GLIBCXX_DEBUG_STRING 1 31 1.1 mrg 32 1.10 mrg #pragma GCC system_header 33 1.10 mrg 34 1.1 mrg #include <string> 35 1.1 mrg #include <debug/safe_sequence.h> 36 1.5 mrg #include <debug/safe_container.h> 37 1.1 mrg #include <debug/safe_iterator.h> 38 1.1 mrg 39 1.12 mrg #define _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(_Cond,_File,_Line,_Func) \ 40 1.12 mrg if (! (_Cond)) \ 41 1.12 mrg __gnu_debug::_Error_formatter::_S_at(_File, _Line, _Func) \ 42 1.12 mrg ._M_message(#_Cond)._M_error() 43 1.12 mrg 44 1.14 mrg #if _GLIBCXX_USE_CXX11_ABI && __cplusplus >= 201103 45 1.14 mrg # define _GLIBCXX_INSERT_RETURNS_ITERATOR 1 46 1.14 mrg # define _GLIBCXX_INSERT_RETURNS_ITERATOR_ONLY(expr) expr 47 1.14 mrg #else 48 1.14 mrg # define _GLIBCXX_INSERT_RETURNS_ITERATOR 0 49 1.14 mrg # define _GLIBCXX_INSERT_RETURNS_ITERATOR_ONLY(expr) 50 1.14 mrg #endif 51 1.14 mrg 52 1.1 mrg namespace __gnu_debug 53 1.1 mrg { 54 1.12 mrg /** Checks that __s is non-NULL or __n == 0, and then returns __s. */ 55 1.12 mrg template<typename _CharT, typename _Integer> 56 1.12 mrg inline const _CharT* 57 1.12 mrg __check_string(const _CharT* __s, 58 1.12 mrg _Integer __n __attribute__((__unused__)), 59 1.12 mrg const char* __file __attribute__((__unused__)), 60 1.12 mrg unsigned int __line __attribute__((__unused__)), 61 1.12 mrg const char* __function __attribute__((__unused__))) 62 1.12 mrg { 63 1.12 mrg #ifdef _GLIBCXX_DEBUG_PEDANTIC 64 1.12 mrg _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(__s != 0 || __n == 0, 65 1.12 mrg __file, __line, __function); 66 1.12 mrg #endif 67 1.12 mrg return __s; 68 1.12 mrg } 69 1.12 mrg 70 1.12 mrg /** Checks that __s is non-NULL and then returns __s. */ 71 1.12 mrg template<typename _CharT> 72 1.12 mrg inline const _CharT* 73 1.12 mrg __check_string(const _CharT* __s, 74 1.12 mrg const char* __file __attribute__((__unused__)), 75 1.12 mrg unsigned int __line __attribute__((__unused__)), 76 1.12 mrg const char* __function __attribute__((__unused__))) 77 1.12 mrg { 78 1.12 mrg #ifdef _GLIBCXX_DEBUG_PEDANTIC 79 1.12 mrg _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(__s != 0, 80 1.12 mrg __file, __line, __function); 81 1.12 mrg #endif 82 1.12 mrg return __s; 83 1.12 mrg } 84 1.12 mrg 85 1.12 mrg #define __glibcxx_check_string_n_constructor(_Str, _Size) \ 86 1.12 mrg __check_string(_Str, _Size, __FILE__, __LINE__, __PRETTY_FUNCTION__) 87 1.12 mrg 88 1.12 mrg #define __glibcxx_check_string_constructor(_Str) \ 89 1.12 mrg __check_string(_Str, __FILE__, __LINE__, __PRETTY_FUNCTION__) 90 1.12 mrg 91 1.12 mrg /// Class std::basic_string with safety/checking/debug instrumentation. 92 1.12 mrg template<typename _CharT, typename _Traits = std::char_traits<_CharT>, 93 1.12 mrg typename _Allocator = std::allocator<_CharT> > 94 1.12 mrg class basic_string 95 1.12 mrg : public __gnu_debug::_Safe_container< 96 1.12 mrg basic_string<_CharT, _Traits, _Allocator>, 97 1.12 mrg _Allocator, _Safe_sequence, bool(_GLIBCXX_USE_CXX11_ABI)>, 98 1.12 mrg public std::basic_string<_CharT, _Traits, _Allocator> 99 1.12 mrg { 100 1.12 mrg typedef std::basic_string<_CharT, _Traits, _Allocator> _Base; 101 1.12 mrg typedef __gnu_debug::_Safe_container< 102 1.12 mrg basic_string, _Allocator, _Safe_sequence, bool(_GLIBCXX_USE_CXX11_ABI)> 103 1.6 mrg _Safe; 104 1.1 mrg 105 1.12 mrg template<typename _ItT, typename _SeqT, typename _CatT> 106 1.12 mrg friend class ::__gnu_debug::_Safe_iterator; 107 1.12 mrg 108 1.12 mrg // type used for positions in insert, erase etc. 109 1.12 mrg typedef __gnu_debug::_Safe_iterator< 110 1.12 mrg typename _Base::__const_iterator, basic_string> __const_iterator; 111 1.12 mrg 112 1.12 mrg public: 113 1.12 mrg // types: 114 1.12 mrg typedef _Traits traits_type; 115 1.12 mrg typedef typename _Traits::char_type value_type; 116 1.12 mrg typedef _Allocator allocator_type; 117 1.12 mrg typedef typename _Base::size_type size_type; 118 1.12 mrg typedef typename _Base::difference_type difference_type; 119 1.12 mrg typedef typename _Base::reference reference; 120 1.12 mrg typedef typename _Base::const_reference const_reference; 121 1.12 mrg typedef typename _Base::pointer pointer; 122 1.12 mrg typedef typename _Base::const_pointer const_pointer; 123 1.12 mrg 124 1.12 mrg typedef __gnu_debug::_Safe_iterator< 125 1.12 mrg typename _Base::iterator, basic_string> iterator; 126 1.12 mrg typedef __gnu_debug::_Safe_iterator< 127 1.12 mrg typename _Base::const_iterator, basic_string> const_iterator; 128 1.12 mrg 129 1.12 mrg typedef std::reverse_iterator<iterator> reverse_iterator; 130 1.12 mrg typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 131 1.12 mrg 132 1.12 mrg using _Base::npos; 133 1.12 mrg 134 1.14 mrg // 21.3.1 construct/copy/destroy: 135 1.12 mrg 136 1.12 mrg explicit 137 1.12 mrg basic_string(const _Allocator& __a) _GLIBCXX_NOEXCEPT 138 1.12 mrg : _Base(__a) { } 139 1.5 mrg 140 1.5 mrg #if __cplusplus < 201103L 141 1.14 mrg basic_string() : _Base() { } 142 1.14 mrg 143 1.12 mrg basic_string(const basic_string& __str) 144 1.12 mrg : _Base(__str) { } 145 1.5 mrg 146 1.12 mrg ~basic_string() { } 147 1.5 mrg #else 148 1.14 mrg basic_string() = default; 149 1.12 mrg basic_string(const basic_string&) = default; 150 1.12 mrg basic_string(basic_string&&) = default; 151 1.5 mrg 152 1.12 mrg basic_string(std::initializer_list<_CharT> __l, 153 1.12 mrg const _Allocator& __a = _Allocator()) 154 1.12 mrg : _Base(__l, __a) 155 1.12 mrg { } 156 1.1 mrg 157 1.12 mrg basic_string(const basic_string& __s, const _Allocator& __a) 158 1.12 mrg : _Base(__s, __a) { } 159 1.6 mrg 160 1.12 mrg basic_string(basic_string&& __s, const _Allocator& __a) 161 1.14 mrg noexcept( 162 1.14 mrg std::is_nothrow_constructible<_Base, _Base, const _Allocator&>::value ) 163 1.14 mrg : _Safe(std::move(__s), __a), 164 1.14 mrg _Base(std::move(__s), __a) 165 1.14 mrg { } 166 1.6 mrg 167 1.12 mrg ~basic_string() = default; 168 1.6 mrg 169 1.12 mrg // Provides conversion from a normal-mode string to a debug-mode string 170 1.12 mrg basic_string(_Base&& __base) noexcept 171 1.12 mrg : _Base(std::move(__base)) { } 172 1.5 mrg #endif // C++11 173 1.1 mrg 174 1.12 mrg // Provides conversion from a normal-mode string to a debug-mode string 175 1.12 mrg basic_string(const _Base& __base) 176 1.12 mrg : _Base(__base) { } 177 1.12 mrg 178 1.12 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 179 1.12 mrg // 42. string ctors specify wrong default allocator 180 1.12 mrg basic_string(const basic_string& __str, size_type __pos, 181 1.12 mrg size_type __n = _Base::npos, 182 1.12 mrg const _Allocator& __a = _Allocator()) 183 1.12 mrg : _Base(__str, __pos, __n, __a) { } 184 1.1 mrg 185 1.12 mrg basic_string(const _CharT* __s, size_type __n, 186 1.1 mrg const _Allocator& __a = _Allocator()) 187 1.12 mrg : _Base(__glibcxx_check_string_n_constructor(__s, __n), __n, __a) { } 188 1.1 mrg 189 1.12 mrg basic_string(const _CharT* __s, const _Allocator& __a = _Allocator()) 190 1.12 mrg : _Base(__glibcxx_check_string_constructor(__s), __a) 191 1.14 mrg { } 192 1.1 mrg 193 1.12 mrg basic_string(size_type __n, _CharT __c, 194 1.1 mrg const _Allocator& __a = _Allocator()) 195 1.12 mrg : _Base(__n, __c, __a) { } 196 1.1 mrg 197 1.12 mrg template<typename _InputIterator> 198 1.12 mrg basic_string(_InputIterator __begin, _InputIterator __end, 199 1.12 mrg const _Allocator& __a = _Allocator()) 200 1.12 mrg : _Base(__gnu_debug::__base( 201 1.12 mrg __glibcxx_check_valid_constructor_range(__begin, __end)), 202 1.12 mrg __gnu_debug::__base(__end), __a) { } 203 1.1 mrg 204 1.14 mrg #if __cplusplus >= 201103L 205 1.12 mrg basic_string& 206 1.12 mrg operator=(const basic_string&) = default; 207 1.5 mrg 208 1.12 mrg basic_string& 209 1.12 mrg operator=(basic_string&&) = default; 210 1.5 mrg #endif 211 1.1 mrg 212 1.12 mrg basic_string& 213 1.12 mrg operator=(const _CharT* __s) 214 1.12 mrg { 215 1.12 mrg __glibcxx_check_string(__s); 216 1.14 mrg _Base::operator=(__s); 217 1.12 mrg this->_M_invalidate_all(); 218 1.12 mrg return *this; 219 1.12 mrg } 220 1.1 mrg 221 1.12 mrg basic_string& 222 1.12 mrg operator=(_CharT __c) 223 1.12 mrg { 224 1.14 mrg _Base::operator=(__c); 225 1.12 mrg this->_M_invalidate_all(); 226 1.12 mrg return *this; 227 1.12 mrg } 228 1.1 mrg 229 1.3 mrg #if __cplusplus >= 201103L 230 1.12 mrg basic_string& 231 1.12 mrg operator=(std::initializer_list<_CharT> __l) 232 1.12 mrg { 233 1.14 mrg _Base::operator=(__l); 234 1.12 mrg this->_M_invalidate_all(); 235 1.12 mrg return *this; 236 1.12 mrg } 237 1.3 mrg #endif // C++11 238 1.1 mrg 239 1.12 mrg // 21.3.2 iterators: 240 1.12 mrg iterator 241 1.12 mrg begin() // _GLIBCXX_NOEXCEPT 242 1.12 mrg { return iterator(_Base::begin(), this); } 243 1.12 mrg 244 1.12 mrg const_iterator 245 1.12 mrg begin() const _GLIBCXX_NOEXCEPT 246 1.12 mrg { return const_iterator(_Base::begin(), this); } 247 1.12 mrg 248 1.12 mrg iterator 249 1.12 mrg end() // _GLIBCXX_NOEXCEPT 250 1.12 mrg { return iterator(_Base::end(), this); } 251 1.12 mrg 252 1.12 mrg const_iterator 253 1.12 mrg end() const _GLIBCXX_NOEXCEPT 254 1.12 mrg { return const_iterator(_Base::end(), this); } 255 1.12 mrg 256 1.12 mrg reverse_iterator 257 1.12 mrg rbegin() // _GLIBCXX_NOEXCEPT 258 1.12 mrg { return reverse_iterator(end()); } 259 1.12 mrg 260 1.12 mrg const_reverse_iterator 261 1.12 mrg rbegin() const _GLIBCXX_NOEXCEPT 262 1.12 mrg { return const_reverse_iterator(end()); } 263 1.12 mrg 264 1.12 mrg reverse_iterator 265 1.12 mrg rend() // _GLIBCXX_NOEXCEPT 266 1.12 mrg { return reverse_iterator(begin()); } 267 1.12 mrg 268 1.12 mrg const_reverse_iterator 269 1.12 mrg rend() const _GLIBCXX_NOEXCEPT 270 1.12 mrg { return const_reverse_iterator(begin()); } 271 1.1 mrg 272 1.3 mrg #if __cplusplus >= 201103L 273 1.12 mrg const_iterator 274 1.12 mrg cbegin() const noexcept 275 1.12 mrg { return const_iterator(_Base::begin(), this); } 276 1.12 mrg 277 1.12 mrg const_iterator 278 1.12 mrg cend() const noexcept 279 1.12 mrg { return const_iterator(_Base::end(), this); } 280 1.12 mrg 281 1.12 mrg const_reverse_iterator 282 1.12 mrg crbegin() const noexcept 283 1.12 mrg { return const_reverse_iterator(end()); } 284 1.12 mrg 285 1.12 mrg const_reverse_iterator 286 1.12 mrg crend() const noexcept 287 1.12 mrg { return const_reverse_iterator(begin()); } 288 1.3 mrg #endif 289 1.3 mrg 290 1.12 mrg // 21.3.3 capacity: 291 1.12 mrg using _Base::size; 292 1.12 mrg using _Base::length; 293 1.12 mrg using _Base::max_size; 294 1.1 mrg 295 1.12 mrg void 296 1.12 mrg resize(size_type __n, _CharT __c) 297 1.12 mrg { 298 1.12 mrg _Base::resize(__n, __c); 299 1.12 mrg this->_M_invalidate_all(); 300 1.12 mrg } 301 1.1 mrg 302 1.12 mrg void 303 1.12 mrg resize(size_type __n) 304 1.12 mrg { this->resize(__n, _CharT()); } 305 1.1 mrg 306 1.3 mrg #if __cplusplus >= 201103L 307 1.12 mrg void 308 1.12 mrg shrink_to_fit() noexcept 309 1.12 mrg { 310 1.12 mrg if (capacity() > size()) 311 1.12 mrg { 312 1.12 mrg __try 313 1.12 mrg { 314 1.12 mrg reserve(0); 315 1.12 mrg this->_M_invalidate_all(); 316 1.12 mrg } 317 1.12 mrg __catch(...) 318 1.12 mrg { } 319 1.12 mrg } 320 1.12 mrg } 321 1.1 mrg #endif 322 1.1 mrg 323 1.12 mrg using _Base::capacity; 324 1.12 mrg using _Base::reserve; 325 1.1 mrg 326 1.12 mrg void 327 1.12 mrg clear() // _GLIBCXX_NOEXCEPT 328 1.12 mrg { 329 1.12 mrg _Base::clear(); 330 1.12 mrg this->_M_invalidate_all(); 331 1.12 mrg } 332 1.1 mrg 333 1.12 mrg using _Base::empty; 334 1.1 mrg 335 1.12 mrg // 21.3.4 element access: 336 1.12 mrg const_reference 337 1.12 mrg operator[](size_type __pos) const _GLIBCXX_NOEXCEPT 338 1.12 mrg { 339 1.12 mrg _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(), 340 1.12 mrg _M_message(__gnu_debug::__msg_subscript_oob) 341 1.12 mrg ._M_sequence(*this, "this") 342 1.12 mrg ._M_integer(__pos, "__pos") 343 1.12 mrg ._M_integer(this->size(), "size")); 344 1.14 mrg return _Base::operator[](__pos); 345 1.12 mrg } 346 1.1 mrg 347 1.12 mrg reference 348 1.12 mrg operator[](size_type __pos) // _GLIBCXX_NOEXCEPT 349 1.12 mrg { 350 1.6 mrg #if __cplusplus < 201103L && defined(_GLIBCXX_DEBUG_PEDANTIC) 351 1.12 mrg __glibcxx_check_subscript(__pos); 352 1.1 mrg #else 353 1.12 mrg // as an extension v3 allows s[s.size()] when s is non-const. 354 1.12 mrg _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(), 355 1.12 mrg _M_message(__gnu_debug::__msg_subscript_oob) 356 1.12 mrg ._M_sequence(*this, "this") 357 1.12 mrg ._M_integer(__pos, "__pos") 358 1.12 mrg ._M_integer(this->size(), "size")); 359 1.1 mrg #endif 360 1.14 mrg return _Base::operator[](__pos); 361 1.12 mrg } 362 1.1 mrg 363 1.12 mrg using _Base::at; 364 1.1 mrg 365 1.3 mrg #if __cplusplus >= 201103L 366 1.12 mrg using _Base::front; 367 1.12 mrg using _Base::back; 368 1.3 mrg #endif 369 1.3 mrg 370 1.12 mrg // 21.3.5 modifiers: 371 1.12 mrg basic_string& 372 1.12 mrg operator+=(const basic_string& __str) 373 1.12 mrg { 374 1.14 mrg _Base::operator+=(__str); 375 1.12 mrg this->_M_invalidate_all(); 376 1.12 mrg return *this; 377 1.12 mrg } 378 1.1 mrg 379 1.12 mrg basic_string& 380 1.12 mrg operator+=(const _CharT* __s) 381 1.12 mrg { 382 1.12 mrg __glibcxx_check_string(__s); 383 1.14 mrg _Base::operator+=(__s); 384 1.12 mrg this->_M_invalidate_all(); 385 1.12 mrg return *this; 386 1.12 mrg } 387 1.1 mrg 388 1.12 mrg basic_string& 389 1.12 mrg operator+=(_CharT __c) 390 1.12 mrg { 391 1.14 mrg _Base::operator+=(__c); 392 1.12 mrg this->_M_invalidate_all(); 393 1.12 mrg return *this; 394 1.12 mrg } 395 1.1 mrg 396 1.3 mrg #if __cplusplus >= 201103L 397 1.12 mrg basic_string& 398 1.12 mrg operator+=(std::initializer_list<_CharT> __l) 399 1.12 mrg { 400 1.14 mrg _Base::operator+=(__l); 401 1.12 mrg this->_M_invalidate_all(); 402 1.12 mrg return *this; 403 1.12 mrg } 404 1.3 mrg #endif // C++11 405 1.1 mrg 406 1.12 mrg basic_string& 407 1.12 mrg append(const basic_string& __str) 408 1.12 mrg { 409 1.12 mrg _Base::append(__str); 410 1.12 mrg this->_M_invalidate_all(); 411 1.12 mrg return *this; 412 1.12 mrg } 413 1.1 mrg 414 1.12 mrg basic_string& 415 1.12 mrg append(const basic_string& __str, size_type __pos, size_type __n) 416 1.12 mrg { 417 1.12 mrg _Base::append(__str, __pos, __n); 418 1.12 mrg this->_M_invalidate_all(); 419 1.12 mrg return *this; 420 1.12 mrg } 421 1.1 mrg 422 1.12 mrg basic_string& 423 1.12 mrg append(const _CharT* __s, size_type __n) 424 1.12 mrg { 425 1.12 mrg __glibcxx_check_string_len(__s, __n); 426 1.12 mrg _Base::append(__s, __n); 427 1.12 mrg this->_M_invalidate_all(); 428 1.12 mrg return *this; 429 1.12 mrg } 430 1.1 mrg 431 1.12 mrg basic_string& 432 1.12 mrg append(const _CharT* __s) 433 1.12 mrg { 434 1.12 mrg __glibcxx_check_string(__s); 435 1.12 mrg _Base::append(__s); 436 1.12 mrg this->_M_invalidate_all(); 437 1.12 mrg return *this; 438 1.12 mrg } 439 1.1 mrg 440 1.1 mrg basic_string& 441 1.12 mrg append(size_type __n, _CharT __c) 442 1.1 mrg { 443 1.12 mrg _Base::append(__n, __c); 444 1.1 mrg this->_M_invalidate_all(); 445 1.1 mrg return *this; 446 1.1 mrg } 447 1.1 mrg 448 1.12 mrg template<typename _InputIterator> 449 1.12 mrg basic_string& 450 1.12 mrg append(_InputIterator __first, _InputIterator __last) 451 1.12 mrg { 452 1.12 mrg typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 453 1.12 mrg __glibcxx_check_valid_range2(__first, __last, __dist); 454 1.1 mrg 455 1.12 mrg if (__dist.second >= __dp_sign) 456 1.12 mrg _Base::append(__gnu_debug::__unsafe(__first), 457 1.12 mrg __gnu_debug::__unsafe(__last)); 458 1.12 mrg else 459 1.12 mrg _Base::append(__first, __last); 460 1.1 mrg 461 1.12 mrg this->_M_invalidate_all(); 462 1.12 mrg return *this; 463 1.12 mrg } 464 1.1 mrg 465 1.12 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 466 1.12 mrg // 7. string clause minor problems 467 1.12 mrg void 468 1.12 mrg push_back(_CharT __c) 469 1.12 mrg { 470 1.12 mrg _Base::push_back(__c); 471 1.12 mrg this->_M_invalidate_all(); 472 1.12 mrg } 473 1.1 mrg 474 1.12 mrg basic_string& 475 1.12 mrg assign(const basic_string& __x) 476 1.12 mrg { 477 1.12 mrg _Base::assign(__x); 478 1.12 mrg this->_M_invalidate_all(); 479 1.12 mrg return *this; 480 1.12 mrg } 481 1.1 mrg 482 1.12 mrg #if __cplusplus >= 201103L 483 1.12 mrg basic_string& 484 1.12 mrg assign(basic_string&& __x) 485 1.12 mrg noexcept(noexcept(std::declval<_Base&>().assign(std::move(__x)))) 486 1.12 mrg { 487 1.12 mrg _Base::assign(std::move(__x)); 488 1.12 mrg this->_M_invalidate_all(); 489 1.12 mrg return *this; 490 1.12 mrg } 491 1.12 mrg #endif // C++11 492 1.1 mrg 493 1.12 mrg basic_string& 494 1.12 mrg assign(const basic_string& __str, size_type __pos, size_type __n) 495 1.12 mrg { 496 1.12 mrg _Base::assign(__str, __pos, __n); 497 1.12 mrg this->_M_invalidate_all(); 498 1.12 mrg return *this; 499 1.12 mrg } 500 1.1 mrg 501 1.1 mrg basic_string& 502 1.12 mrg assign(const _CharT* __s, size_type __n) 503 1.1 mrg { 504 1.12 mrg __glibcxx_check_string_len(__s, __n); 505 1.12 mrg _Base::assign(__s, __n); 506 1.12 mrg this->_M_invalidate_all(); 507 1.12 mrg return *this; 508 1.12 mrg } 509 1.7 mrg 510 1.12 mrg basic_string& 511 1.12 mrg assign(const _CharT* __s) 512 1.12 mrg { 513 1.12 mrg __glibcxx_check_string(__s); 514 1.12 mrg _Base::assign(__s); 515 1.12 mrg this->_M_invalidate_all(); 516 1.12 mrg return *this; 517 1.12 mrg } 518 1.7 mrg 519 1.12 mrg basic_string& 520 1.12 mrg assign(size_type __n, _CharT __c) 521 1.12 mrg { 522 1.12 mrg _Base::assign(__n, __c); 523 1.1 mrg this->_M_invalidate_all(); 524 1.1 mrg return *this; 525 1.1 mrg } 526 1.1 mrg 527 1.12 mrg template<typename _InputIterator> 528 1.12 mrg basic_string& 529 1.12 mrg assign(_InputIterator __first, _InputIterator __last) 530 1.12 mrg { 531 1.12 mrg typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 532 1.12 mrg __glibcxx_check_valid_range2(__first, __last, __dist); 533 1.12 mrg 534 1.12 mrg if (__dist.second >= __dp_sign) 535 1.12 mrg _Base::assign(__gnu_debug::__unsafe(__first), 536 1.12 mrg __gnu_debug::__unsafe(__last)); 537 1.12 mrg else 538 1.12 mrg _Base::assign(__first, __last); 539 1.12 mrg 540 1.12 mrg this->_M_invalidate_all(); 541 1.12 mrg return *this; 542 1.12 mrg } 543 1.12 mrg 544 1.3 mrg #if __cplusplus >= 201103L 545 1.12 mrg basic_string& 546 1.12 mrg assign(std::initializer_list<_CharT> __l) 547 1.12 mrg { 548 1.12 mrg _Base::assign(__l); 549 1.12 mrg this->_M_invalidate_all(); 550 1.12 mrg return *this; 551 1.12 mrg } 552 1.3 mrg #endif // C++11 553 1.1 mrg 554 1.12 mrg basic_string& 555 1.12 mrg insert(size_type __pos1, const basic_string& __str) 556 1.12 mrg { 557 1.12 mrg _Base::insert(__pos1, __str); 558 1.12 mrg this->_M_invalidate_all(); 559 1.12 mrg return *this; 560 1.12 mrg } 561 1.1 mrg 562 1.12 mrg basic_string& 563 1.12 mrg insert(size_type __pos1, const basic_string& __str, 564 1.12 mrg size_type __pos2, size_type __n) 565 1.12 mrg { 566 1.12 mrg _Base::insert(__pos1, __str, __pos2, __n); 567 1.12 mrg this->_M_invalidate_all(); 568 1.12 mrg return *this; 569 1.12 mrg } 570 1.1 mrg 571 1.12 mrg basic_string& 572 1.12 mrg insert(size_type __pos, const _CharT* __s, size_type __n) 573 1.12 mrg { 574 1.12 mrg __glibcxx_check_string(__s); 575 1.12 mrg _Base::insert(__pos, __s, __n); 576 1.12 mrg this->_M_invalidate_all(); 577 1.12 mrg return *this; 578 1.12 mrg } 579 1.1 mrg 580 1.12 mrg basic_string& 581 1.12 mrg insert(size_type __pos, const _CharT* __s) 582 1.12 mrg { 583 1.12 mrg __glibcxx_check_string(__s); 584 1.12 mrg _Base::insert(__pos, __s); 585 1.12 mrg this->_M_invalidate_all(); 586 1.12 mrg return *this; 587 1.12 mrg } 588 1.1 mrg 589 1.12 mrg basic_string& 590 1.12 mrg insert(size_type __pos, size_type __n, _CharT __c) 591 1.12 mrg { 592 1.12 mrg _Base::insert(__pos, __n, __c); 593 1.12 mrg this->_M_invalidate_all(); 594 1.12 mrg return *this; 595 1.12 mrg } 596 1.1 mrg 597 1.12 mrg iterator 598 1.12 mrg insert(__const_iterator __p, _CharT __c) 599 1.12 mrg { 600 1.12 mrg __glibcxx_check_insert(__p); 601 1.12 mrg typename _Base::iterator __res = _Base::insert(__p.base(), __c); 602 1.12 mrg this->_M_invalidate_all(); 603 1.12 mrg return iterator(__res, this); 604 1.12 mrg } 605 1.1 mrg 606 1.12 mrg #if __cplusplus >= 201103L 607 1.12 mrg iterator 608 1.12 mrg insert(const_iterator __p, size_type __n, _CharT __c) 609 1.12 mrg { 610 1.12 mrg __glibcxx_check_insert(__p); 611 1.12 mrg #if _GLIBCXX_USE_CXX11_ABI 612 1.12 mrg typename _Base::iterator __res = _Base::insert(__p.base(), __n, __c); 613 1.12 mrg #else 614 1.12 mrg const size_type __offset = __p.base() - _Base::cbegin(); 615 1.12 mrg _Base::insert(_Base::begin() + __offset, __n, __c); 616 1.12 mrg typename _Base::iterator __res = _Base::begin() + __offset; 617 1.12 mrg #endif 618 1.12 mrg this->_M_invalidate_all(); 619 1.12 mrg return iterator(__res, this); 620 1.12 mrg } 621 1.12 mrg #else 622 1.1 mrg void 623 1.12 mrg insert(iterator __p, size_type __n, _CharT __c) 624 1.1 mrg { 625 1.12 mrg __glibcxx_check_insert(__p); 626 1.12 mrg _Base::insert(__p.base(), __n, __c); 627 1.12 mrg this->_M_invalidate_all(); 628 1.12 mrg } 629 1.12 mrg #endif 630 1.7 mrg 631 1.12 mrg template<typename _InputIterator> 632 1.12 mrg iterator 633 1.12 mrg insert(__const_iterator __p, 634 1.12 mrg _InputIterator __first, _InputIterator __last) 635 1.12 mrg { 636 1.12 mrg typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 637 1.12 mrg __glibcxx_check_insert_range(__p, __first, __last, __dist); 638 1.12 mrg 639 1.12 mrg typename _Base::iterator __res; 640 1.14 mrg #if ! _GLIBCXX_INSERT_RETURNS_ITERATOR 641 1.14 mrg const size_type __offset = __p.base() - _Base::begin(); 642 1.14 mrg #endif 643 1.12 mrg if (__dist.second >= __dp_sign) 644 1.14 mrg { 645 1.14 mrg _GLIBCXX_INSERT_RETURNS_ITERATOR_ONLY(__res =) 646 1.14 mrg _Base::insert(__p.base(), __gnu_debug::__unsafe(__first), 647 1.14 mrg __gnu_debug::__unsafe(__last)); 648 1.14 mrg } 649 1.12 mrg else 650 1.14 mrg { 651 1.14 mrg _GLIBCXX_INSERT_RETURNS_ITERATOR_ONLY(__res =) 652 1.14 mrg _Base::insert(__p.base(), __first, __last); 653 1.14 mrg } 654 1.14 mrg 655 1.14 mrg #if ! _GLIBCXX_INSERT_RETURNS_ITERATOR 656 1.12 mrg __res = _Base::begin() + __offset; 657 1.12 mrg #endif 658 1.12 mrg this->_M_invalidate_all(); 659 1.12 mrg return iterator(__res, this); 660 1.12 mrg } 661 1.7 mrg 662 1.12 mrg #if __cplusplus >= 201103L 663 1.12 mrg iterator 664 1.12 mrg insert(const_iterator __p, std::initializer_list<_CharT> __l) 665 1.12 mrg { 666 1.12 mrg __glibcxx_check_insert(__p); 667 1.12 mrg #if _GLIBCXX_USE_CXX11_ABI 668 1.12 mrg const auto __res = _Base::insert(__p.base(), __l); 669 1.12 mrg #else 670 1.12 mrg const size_type __offset = __p.base() - _Base::cbegin(); 671 1.12 mrg _Base::insert(_Base::begin() + __offset, __l); 672 1.12 mrg auto __res = _Base::begin() + __offset; 673 1.12 mrg #endif 674 1.1 mrg this->_M_invalidate_all(); 675 1.12 mrg return iterator(__res, this); 676 1.1 mrg } 677 1.3 mrg #endif // C++11 678 1.1 mrg 679 1.12 mrg basic_string& 680 1.12 mrg erase(size_type __pos = 0, size_type __n = _Base::npos) 681 1.12 mrg { 682 1.12 mrg _Base::erase(__pos, __n); 683 1.12 mrg this->_M_invalidate_all(); 684 1.12 mrg return *this; 685 1.12 mrg } 686 1.1 mrg 687 1.12 mrg iterator 688 1.14 mrg erase(__const_iterator __position) 689 1.12 mrg { 690 1.12 mrg __glibcxx_check_erase(__position); 691 1.12 mrg typename _Base::iterator __res = _Base::erase(__position.base()); 692 1.12 mrg this->_M_invalidate_all(); 693 1.12 mrg return iterator(__res, this); 694 1.12 mrg } 695 1.1 mrg 696 1.12 mrg iterator 697 1.14 mrg erase(__const_iterator __first, __const_iterator __last) 698 1.12 mrg { 699 1.12 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 700 1.12 mrg // 151. can't currently clear() empty container 701 1.12 mrg __glibcxx_check_erase_range(__first, __last); 702 1.12 mrg typename _Base::iterator __res = _Base::erase(__first.base(), 703 1.12 mrg __last.base()); 704 1.12 mrg this->_M_invalidate_all(); 705 1.12 mrg return iterator(__res, this); 706 1.12 mrg } 707 1.1 mrg 708 1.3 mrg #if __cplusplus >= 201103L 709 1.12 mrg void 710 1.12 mrg pop_back() // noexcept 711 1.12 mrg { 712 1.12 mrg __glibcxx_check_nonempty(); 713 1.12 mrg _Base::pop_back(); 714 1.12 mrg this->_M_invalidate_all(); 715 1.12 mrg } 716 1.3 mrg #endif // C++11 717 1.3 mrg 718 1.12 mrg basic_string& 719 1.12 mrg replace(size_type __pos1, size_type __n1, const basic_string& __str) 720 1.12 mrg { 721 1.12 mrg _Base::replace(__pos1, __n1, __str); 722 1.12 mrg this->_M_invalidate_all(); 723 1.12 mrg return *this; 724 1.12 mrg } 725 1.1 mrg 726 1.12 mrg basic_string& 727 1.12 mrg replace(size_type __pos1, size_type __n1, const basic_string& __str, 728 1.12 mrg size_type __pos2, size_type __n2) 729 1.12 mrg { 730 1.12 mrg _Base::replace(__pos1, __n1, __str, __pos2, __n2); 731 1.12 mrg this->_M_invalidate_all(); 732 1.12 mrg return *this; 733 1.12 mrg } 734 1.1 mrg 735 1.12 mrg basic_string& 736 1.12 mrg replace(size_type __pos, size_type __n1, const _CharT* __s, 737 1.12 mrg size_type __n2) 738 1.12 mrg { 739 1.12 mrg __glibcxx_check_string_len(__s, __n2); 740 1.12 mrg _Base::replace(__pos, __n1, __s, __n2); 741 1.12 mrg this->_M_invalidate_all(); 742 1.12 mrg return *this; 743 1.12 mrg } 744 1.1 mrg 745 1.12 mrg basic_string& 746 1.12 mrg replace(size_type __pos, size_type __n1, const _CharT* __s) 747 1.12 mrg { 748 1.12 mrg __glibcxx_check_string(__s); 749 1.12 mrg _Base::replace(__pos, __n1, __s); 750 1.12 mrg this->_M_invalidate_all(); 751 1.12 mrg return *this; 752 1.12 mrg } 753 1.1 mrg 754 1.12 mrg basic_string& 755 1.12 mrg replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) 756 1.12 mrg { 757 1.12 mrg _Base::replace(__pos, __n1, __n2, __c); 758 1.12 mrg this->_M_invalidate_all(); 759 1.12 mrg return *this; 760 1.12 mrg } 761 1.1 mrg 762 1.12 mrg basic_string& 763 1.12 mrg replace(__const_iterator __i1, __const_iterator __i2, 764 1.12 mrg const basic_string& __str) 765 1.12 mrg { 766 1.12 mrg __glibcxx_check_erase_range(__i1, __i2); 767 1.12 mrg _Base::replace(__i1.base(), __i2.base(), __str); 768 1.12 mrg this->_M_invalidate_all(); 769 1.12 mrg return *this; 770 1.12 mrg } 771 1.1 mrg 772 1.12 mrg basic_string& 773 1.12 mrg replace(__const_iterator __i1, __const_iterator __i2, 774 1.12 mrg const _CharT* __s, size_type __n) 775 1.12 mrg { 776 1.12 mrg __glibcxx_check_erase_range(__i1, __i2); 777 1.12 mrg __glibcxx_check_string_len(__s, __n); 778 1.12 mrg _Base::replace(__i1.base(), __i2.base(), __s, __n); 779 1.12 mrg this->_M_invalidate_all(); 780 1.12 mrg return *this; 781 1.12 mrg } 782 1.1 mrg 783 1.12 mrg basic_string& 784 1.12 mrg replace(__const_iterator __i1, __const_iterator __i2, 785 1.12 mrg const _CharT* __s) 786 1.12 mrg { 787 1.12 mrg __glibcxx_check_erase_range(__i1, __i2); 788 1.12 mrg __glibcxx_check_string(__s); 789 1.12 mrg _Base::replace(__i1.base(), __i2.base(), __s); 790 1.12 mrg this->_M_invalidate_all(); 791 1.12 mrg return *this; 792 1.12 mrg } 793 1.1 mrg 794 1.1 mrg basic_string& 795 1.12 mrg replace(__const_iterator __i1, __const_iterator __i2, 796 1.12 mrg size_type __n, _CharT __c) 797 1.1 mrg { 798 1.1 mrg __glibcxx_check_erase_range(__i1, __i2); 799 1.12 mrg _Base::replace(__i1.base(), __i2.base(), __n, __c); 800 1.12 mrg this->_M_invalidate_all(); 801 1.12 mrg return *this; 802 1.12 mrg } 803 1.12 mrg 804 1.12 mrg template<typename _InputIterator> 805 1.12 mrg basic_string& 806 1.12 mrg replace(__const_iterator __i1, __const_iterator __i2, 807 1.12 mrg _InputIterator __j1, _InputIterator __j2) 808 1.12 mrg { 809 1.12 mrg __glibcxx_check_erase_range(__i1, __i2); 810 1.7 mrg 811 1.12 mrg typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 812 1.12 mrg __glibcxx_check_valid_range2(__j1, __j2, __dist); 813 1.7 mrg 814 1.12 mrg if (__dist.second >= __dp_sign) 815 1.12 mrg _Base::replace(__i1.base(), __i2.base(), 816 1.12 mrg __gnu_debug::__unsafe(__j1), 817 1.12 mrg __gnu_debug::__unsafe(__j2)); 818 1.12 mrg else 819 1.12 mrg _Base::replace(__i1.base(), __i2.base(), __j1, __j2); 820 1.7 mrg 821 1.12 mrg this->_M_invalidate_all(); 822 1.12 mrg return *this; 823 1.12 mrg } 824 1.1 mrg 825 1.3 mrg #if __cplusplus >= 201103L 826 1.12 mrg basic_string& 827 1.12 mrg replace(__const_iterator __i1, __const_iterator __i2, 828 1.12 mrg std::initializer_list<_CharT> __l) 829 1.1 mrg { 830 1.1 mrg __glibcxx_check_erase_range(__i1, __i2); 831 1.1 mrg _Base::replace(__i1.base(), __i2.base(), __l); 832 1.1 mrg this->_M_invalidate_all(); 833 1.1 mrg return *this; 834 1.1 mrg } 835 1.3 mrg #endif // C++11 836 1.1 mrg 837 1.12 mrg size_type 838 1.12 mrg copy(_CharT* __s, size_type __n, size_type __pos = 0) const 839 1.12 mrg { 840 1.12 mrg __glibcxx_check_string_len(__s, __n); 841 1.12 mrg return _Base::copy(__s, __n, __pos); 842 1.12 mrg } 843 1.1 mrg 844 1.12 mrg void 845 1.12 mrg swap(basic_string& __x) 846 1.12 mrg _GLIBCXX_NOEXCEPT_IF(std::__is_nothrow_swappable<_Base>::value) 847 1.12 mrg { 848 1.12 mrg _Safe::_M_swap(__x); 849 1.12 mrg _Base::swap(__x); 850 1.12 mrg } 851 1.1 mrg 852 1.12 mrg // 21.3.6 string operations: 853 1.12 mrg const _CharT* 854 1.12 mrg c_str() const _GLIBCXX_NOEXCEPT 855 1.12 mrg { 856 1.12 mrg const _CharT* __res = _Base::c_str(); 857 1.12 mrg this->_M_invalidate_all(); 858 1.12 mrg return __res; 859 1.12 mrg } 860 1.1 mrg 861 1.12 mrg const _CharT* 862 1.12 mrg data() const _GLIBCXX_NOEXCEPT 863 1.12 mrg { 864 1.12 mrg const _CharT* __res = _Base::data(); 865 1.12 mrg this->_M_invalidate_all(); 866 1.12 mrg return __res; 867 1.12 mrg } 868 1.1 mrg 869 1.12 mrg using _Base::get_allocator; 870 1.1 mrg 871 1.12 mrg size_type 872 1.12 mrg find(const basic_string& __str, size_type __pos = 0) const 873 1.12 mrg _GLIBCXX_NOEXCEPT 874 1.12 mrg { return _Base::find(__str, __pos); } 875 1.1 mrg 876 1.12 mrg size_type 877 1.12 mrg find(const _CharT* __s, size_type __pos, size_type __n) const 878 1.12 mrg { 879 1.12 mrg __glibcxx_check_string(__s); 880 1.12 mrg return _Base::find(__s, __pos, __n); 881 1.12 mrg } 882 1.1 mrg 883 1.12 mrg size_type 884 1.12 mrg find(const _CharT* __s, size_type __pos = 0) const 885 1.12 mrg { 886 1.12 mrg __glibcxx_check_string(__s); 887 1.12 mrg return _Base::find(__s, __pos); 888 1.12 mrg } 889 1.1 mrg 890 1.12 mrg size_type 891 1.12 mrg find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT 892 1.12 mrg { return _Base::find(__c, __pos); } 893 1.12 mrg 894 1.12 mrg size_type 895 1.12 mrg rfind(const basic_string& __str, size_type __pos = _Base::npos) const 896 1.12 mrg _GLIBCXX_NOEXCEPT 897 1.12 mrg { return _Base::rfind(__str, __pos); } 898 1.1 mrg 899 1.12 mrg size_type 900 1.12 mrg rfind(const _CharT* __s, size_type __pos, size_type __n) const 901 1.12 mrg { 902 1.12 mrg __glibcxx_check_string_len(__s, __n); 903 1.12 mrg return _Base::rfind(__s, __pos, __n); 904 1.12 mrg } 905 1.1 mrg 906 1.12 mrg size_type 907 1.12 mrg rfind(const _CharT* __s, size_type __pos = _Base::npos) const 908 1.12 mrg { 909 1.12 mrg __glibcxx_check_string(__s); 910 1.12 mrg return _Base::rfind(__s, __pos); 911 1.12 mrg } 912 1.1 mrg 913 1.12 mrg size_type 914 1.12 mrg rfind(_CharT __c, size_type __pos = _Base::npos) const _GLIBCXX_NOEXCEPT 915 1.12 mrg { return _Base::rfind(__c, __pos); } 916 1.12 mrg 917 1.12 mrg size_type 918 1.12 mrg find_first_of(const basic_string& __str, size_type __pos = 0) const 919 1.12 mrg _GLIBCXX_NOEXCEPT 920 1.12 mrg { return _Base::find_first_of(__str, __pos); } 921 1.1 mrg 922 1.12 mrg size_type 923 1.12 mrg find_first_of(const _CharT* __s, size_type __pos, size_type __n) const 924 1.12 mrg { 925 1.12 mrg __glibcxx_check_string(__s); 926 1.12 mrg return _Base::find_first_of(__s, __pos, __n); 927 1.12 mrg } 928 1.1 mrg 929 1.12 mrg size_type 930 1.12 mrg find_first_of(const _CharT* __s, size_type __pos = 0) const 931 1.12 mrg { 932 1.12 mrg __glibcxx_check_string(__s); 933 1.12 mrg return _Base::find_first_of(__s, __pos); 934 1.12 mrg } 935 1.1 mrg 936 1.12 mrg size_type 937 1.12 mrg find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT 938 1.12 mrg { return _Base::find_first_of(__c, __pos); } 939 1.12 mrg 940 1.12 mrg size_type 941 1.12 mrg find_last_of(const basic_string& __str, 942 1.12 mrg size_type __pos = _Base::npos) const _GLIBCXX_NOEXCEPT 943 1.12 mrg { return _Base::find_last_of(__str, __pos); } 944 1.1 mrg 945 1.12 mrg size_type 946 1.12 mrg find_last_of(const _CharT* __s, size_type __pos, size_type __n) const 947 1.12 mrg { 948 1.12 mrg __glibcxx_check_string(__s); 949 1.12 mrg return _Base::find_last_of(__s, __pos, __n); 950 1.12 mrg } 951 1.1 mrg 952 1.12 mrg size_type 953 1.12 mrg find_last_of(const _CharT* __s, size_type __pos = _Base::npos) const 954 1.12 mrg { 955 1.12 mrg __glibcxx_check_string(__s); 956 1.12 mrg return _Base::find_last_of(__s, __pos); 957 1.12 mrg } 958 1.1 mrg 959 1.12 mrg size_type 960 1.12 mrg find_last_of(_CharT __c, size_type __pos = _Base::npos) const 961 1.12 mrg _GLIBCXX_NOEXCEPT 962 1.12 mrg { return _Base::find_last_of(__c, __pos); } 963 1.12 mrg 964 1.12 mrg size_type 965 1.12 mrg find_first_not_of(const basic_string& __str, size_type __pos = 0) const 966 1.12 mrg _GLIBCXX_NOEXCEPT 967 1.12 mrg { return _Base::find_first_not_of(__str, __pos); } 968 1.1 mrg 969 1.12 mrg size_type 970 1.12 mrg find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const 971 1.12 mrg { 972 1.12 mrg __glibcxx_check_string_len(__s, __n); 973 1.12 mrg return _Base::find_first_not_of(__s, __pos, __n); 974 1.12 mrg } 975 1.1 mrg 976 1.12 mrg size_type 977 1.12 mrg find_first_not_of(const _CharT* __s, size_type __pos = 0) const 978 1.12 mrg { 979 1.12 mrg __glibcxx_check_string(__s); 980 1.12 mrg return _Base::find_first_not_of(__s, __pos); 981 1.12 mrg } 982 1.1 mrg 983 1.12 mrg size_type 984 1.12 mrg find_first_not_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT 985 1.12 mrg { return _Base::find_first_not_of(__c, __pos); } 986 1.12 mrg 987 1.12 mrg size_type 988 1.12 mrg find_last_not_of(const basic_string& __str, 989 1.12 mrg size_type __pos = _Base::npos) const 990 1.12 mrg _GLIBCXX_NOEXCEPT 991 1.12 mrg { return _Base::find_last_not_of(__str, __pos); } 992 1.1 mrg 993 1.12 mrg size_type 994 1.12 mrg find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const 995 1.12 mrg { 996 1.12 mrg __glibcxx_check_string(__s); 997 1.12 mrg return _Base::find_last_not_of(__s, __pos, __n); 998 1.12 mrg } 999 1.1 mrg 1000 1.12 mrg size_type 1001 1.12 mrg find_last_not_of(const _CharT* __s, size_type __pos = _Base::npos) const 1002 1.12 mrg { 1003 1.12 mrg __glibcxx_check_string(__s); 1004 1.12 mrg return _Base::find_last_not_of(__s, __pos); 1005 1.12 mrg } 1006 1.1 mrg 1007 1.12 mrg size_type 1008 1.12 mrg find_last_not_of(_CharT __c, size_type __pos = _Base::npos) const 1009 1.12 mrg _GLIBCXX_NOEXCEPT 1010 1.12 mrg { return _Base::find_last_not_of(__c, __pos); } 1011 1.12 mrg 1012 1.12 mrg basic_string 1013 1.12 mrg substr(size_type __pos = 0, size_type __n = _Base::npos) const 1014 1.12 mrg { return basic_string(_Base::substr(__pos, __n)); } 1015 1.12 mrg 1016 1.12 mrg int 1017 1.12 mrg compare(const basic_string& __str) const 1018 1.12 mrg { return _Base::compare(__str); } 1019 1.12 mrg 1020 1.12 mrg int 1021 1.12 mrg compare(size_type __pos1, size_type __n1, 1022 1.12 mrg const basic_string& __str) const 1023 1.12 mrg { return _Base::compare(__pos1, __n1, __str); } 1024 1.1 mrg 1025 1.12 mrg int 1026 1.12 mrg compare(size_type __pos1, size_type __n1, const basic_string& __str, 1027 1.1 mrg size_type __pos2, size_type __n2) const 1028 1.12 mrg { return _Base::compare(__pos1, __n1, __str, __pos2, __n2); } 1029 1.1 mrg 1030 1.12 mrg int 1031 1.12 mrg compare(const _CharT* __s) const 1032 1.12 mrg { 1033 1.12 mrg __glibcxx_check_string(__s); 1034 1.12 mrg return _Base::compare(__s); 1035 1.12 mrg } 1036 1.1 mrg 1037 1.12 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1038 1.12 mrg // 5. string::compare specification questionable 1039 1.12 mrg int 1040 1.12 mrg compare(size_type __pos1, size_type __n1, const _CharT* __s) const 1041 1.12 mrg { 1042 1.12 mrg __glibcxx_check_string(__s); 1043 1.12 mrg return _Base::compare(__pos1, __n1, __s); 1044 1.12 mrg } 1045 1.1 mrg 1046 1.12 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1047 1.12 mrg // 5. string::compare specification questionable 1048 1.12 mrg int 1049 1.12 mrg compare(size_type __pos1, size_type __n1,const _CharT* __s, 1050 1.12 mrg size_type __n2) const 1051 1.12 mrg { 1052 1.12 mrg __glibcxx_check_string_len(__s, __n2); 1053 1.12 mrg return _Base::compare(__pos1, __n1, __s, __n2); 1054 1.12 mrg } 1055 1.1 mrg 1056 1.12 mrg _Base& 1057 1.12 mrg _M_base() _GLIBCXX_NOEXCEPT { return *this; } 1058 1.1 mrg 1059 1.12 mrg const _Base& 1060 1.12 mrg _M_base() const _GLIBCXX_NOEXCEPT { return *this; } 1061 1.1 mrg 1062 1.12 mrg using _Safe::_M_invalidate_all; 1063 1.12 mrg }; 1064 1.1 mrg 1065 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1066 1.1 mrg inline basic_string<_CharT,_Traits,_Allocator> 1067 1.1 mrg operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1068 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1069 1.1 mrg { return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; } 1070 1.1 mrg 1071 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1072 1.1 mrg inline basic_string<_CharT,_Traits,_Allocator> 1073 1.1 mrg operator+(const _CharT* __lhs, 1074 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1075 1.1 mrg { 1076 1.1 mrg __glibcxx_check_string(__lhs); 1077 1.1 mrg return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; 1078 1.1 mrg } 1079 1.1 mrg 1080 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1081 1.1 mrg inline basic_string<_CharT,_Traits,_Allocator> 1082 1.1 mrg operator+(_CharT __lhs, 1083 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1084 1.1 mrg { return basic_string<_CharT,_Traits,_Allocator>(1, __lhs) += __rhs; } 1085 1.1 mrg 1086 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1087 1.1 mrg inline basic_string<_CharT,_Traits,_Allocator> 1088 1.1 mrg operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1089 1.1 mrg const _CharT* __rhs) 1090 1.1 mrg { 1091 1.1 mrg __glibcxx_check_string(__rhs); 1092 1.1 mrg return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; 1093 1.1 mrg } 1094 1.1 mrg 1095 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1096 1.1 mrg inline basic_string<_CharT,_Traits,_Allocator> 1097 1.1 mrg operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1098 1.1 mrg _CharT __rhs) 1099 1.1 mrg { return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; } 1100 1.1 mrg 1101 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1102 1.1 mrg inline bool 1103 1.1 mrg operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1104 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1105 1.1 mrg { return __lhs._M_base() == __rhs._M_base(); } 1106 1.1 mrg 1107 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1108 1.1 mrg inline bool 1109 1.1 mrg operator==(const _CharT* __lhs, 1110 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1111 1.1 mrg { 1112 1.1 mrg __glibcxx_check_string(__lhs); 1113 1.1 mrg return __lhs == __rhs._M_base(); 1114 1.1 mrg } 1115 1.1 mrg 1116 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1117 1.1 mrg inline bool 1118 1.1 mrg operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1119 1.1 mrg const _CharT* __rhs) 1120 1.1 mrg { 1121 1.1 mrg __glibcxx_check_string(__rhs); 1122 1.1 mrg return __lhs._M_base() == __rhs; 1123 1.1 mrg } 1124 1.1 mrg 1125 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1126 1.1 mrg inline bool 1127 1.1 mrg operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1128 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1129 1.1 mrg { return __lhs._M_base() != __rhs._M_base(); } 1130 1.1 mrg 1131 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1132 1.1 mrg inline bool 1133 1.1 mrg operator!=(const _CharT* __lhs, 1134 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1135 1.1 mrg { 1136 1.1 mrg __glibcxx_check_string(__lhs); 1137 1.1 mrg return __lhs != __rhs._M_base(); 1138 1.1 mrg } 1139 1.1 mrg 1140 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1141 1.1 mrg inline bool 1142 1.1 mrg operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1143 1.1 mrg const _CharT* __rhs) 1144 1.1 mrg { 1145 1.1 mrg __glibcxx_check_string(__rhs); 1146 1.1 mrg return __lhs._M_base() != __rhs; 1147 1.1 mrg } 1148 1.1 mrg 1149 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1150 1.1 mrg inline bool 1151 1.1 mrg operator<(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1152 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1153 1.1 mrg { return __lhs._M_base() < __rhs._M_base(); } 1154 1.1 mrg 1155 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1156 1.1 mrg inline bool 1157 1.1 mrg operator<(const _CharT* __lhs, 1158 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1159 1.1 mrg { 1160 1.1 mrg __glibcxx_check_string(__lhs); 1161 1.1 mrg return __lhs < __rhs._M_base(); 1162 1.1 mrg } 1163 1.1 mrg 1164 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1165 1.1 mrg inline bool 1166 1.1 mrg operator<(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1167 1.1 mrg const _CharT* __rhs) 1168 1.1 mrg { 1169 1.1 mrg __glibcxx_check_string(__rhs); 1170 1.1 mrg return __lhs._M_base() < __rhs; 1171 1.1 mrg } 1172 1.1 mrg 1173 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1174 1.1 mrg inline bool 1175 1.1 mrg operator<=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1176 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1177 1.1 mrg { return __lhs._M_base() <= __rhs._M_base(); } 1178 1.1 mrg 1179 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1180 1.1 mrg inline bool 1181 1.1 mrg operator<=(const _CharT* __lhs, 1182 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1183 1.1 mrg { 1184 1.1 mrg __glibcxx_check_string(__lhs); 1185 1.1 mrg return __lhs <= __rhs._M_base(); 1186 1.1 mrg } 1187 1.1 mrg 1188 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1189 1.1 mrg inline bool 1190 1.1 mrg operator<=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1191 1.1 mrg const _CharT* __rhs) 1192 1.1 mrg { 1193 1.1 mrg __glibcxx_check_string(__rhs); 1194 1.1 mrg return __lhs._M_base() <= __rhs; 1195 1.1 mrg } 1196 1.1 mrg 1197 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1198 1.1 mrg inline bool 1199 1.1 mrg operator>=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1200 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1201 1.1 mrg { return __lhs._M_base() >= __rhs._M_base(); } 1202 1.1 mrg 1203 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1204 1.1 mrg inline bool 1205 1.1 mrg operator>=(const _CharT* __lhs, 1206 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1207 1.1 mrg { 1208 1.1 mrg __glibcxx_check_string(__lhs); 1209 1.1 mrg return __lhs >= __rhs._M_base(); 1210 1.1 mrg } 1211 1.1 mrg 1212 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1213 1.1 mrg inline bool 1214 1.1 mrg operator>=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1215 1.1 mrg const _CharT* __rhs) 1216 1.1 mrg { 1217 1.1 mrg __glibcxx_check_string(__rhs); 1218 1.1 mrg return __lhs._M_base() >= __rhs; 1219 1.1 mrg } 1220 1.1 mrg 1221 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1222 1.1 mrg inline bool 1223 1.1 mrg operator>(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1224 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1225 1.1 mrg { return __lhs._M_base() > __rhs._M_base(); } 1226 1.1 mrg 1227 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1228 1.1 mrg inline bool 1229 1.1 mrg operator>(const _CharT* __lhs, 1230 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1231 1.1 mrg { 1232 1.1 mrg __glibcxx_check_string(__lhs); 1233 1.1 mrg return __lhs > __rhs._M_base(); 1234 1.1 mrg } 1235 1.1 mrg 1236 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1237 1.1 mrg inline bool 1238 1.1 mrg operator>(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1239 1.1 mrg const _CharT* __rhs) 1240 1.1 mrg { 1241 1.1 mrg __glibcxx_check_string(__rhs); 1242 1.1 mrg return __lhs._M_base() > __rhs; 1243 1.1 mrg } 1244 1.1 mrg 1245 1.1 mrg // 21.3.7.8: 1246 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1247 1.1 mrg inline void 1248 1.1 mrg swap(basic_string<_CharT,_Traits,_Allocator>& __lhs, 1249 1.1 mrg basic_string<_CharT,_Traits,_Allocator>& __rhs) 1250 1.1 mrg { __lhs.swap(__rhs); } 1251 1.1 mrg 1252 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1253 1.1 mrg std::basic_ostream<_CharT, _Traits>& 1254 1.1 mrg operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1255 1.1 mrg const basic_string<_CharT, _Traits, _Allocator>& __str) 1256 1.1 mrg { return __os << __str._M_base(); } 1257 1.1 mrg 1258 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1259 1.1 mrg std::basic_istream<_CharT,_Traits>& 1260 1.1 mrg operator>>(std::basic_istream<_CharT,_Traits>& __is, 1261 1.1 mrg basic_string<_CharT,_Traits,_Allocator>& __str) 1262 1.1 mrg { 1263 1.1 mrg std::basic_istream<_CharT,_Traits>& __res = __is >> __str._M_base(); 1264 1.1 mrg __str._M_invalidate_all(); 1265 1.1 mrg return __res; 1266 1.1 mrg } 1267 1.1 mrg 1268 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1269 1.1 mrg std::basic_istream<_CharT,_Traits>& 1270 1.1 mrg getline(std::basic_istream<_CharT,_Traits>& __is, 1271 1.1 mrg basic_string<_CharT,_Traits,_Allocator>& __str, _CharT __delim) 1272 1.1 mrg { 1273 1.1 mrg std::basic_istream<_CharT,_Traits>& __res = getline(__is, 1274 1.1 mrg __str._M_base(), 1275 1.1 mrg __delim); 1276 1.1 mrg __str._M_invalidate_all(); 1277 1.1 mrg return __res; 1278 1.1 mrg } 1279 1.1 mrg 1280 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1281 1.1 mrg std::basic_istream<_CharT,_Traits>& 1282 1.1 mrg getline(std::basic_istream<_CharT,_Traits>& __is, 1283 1.1 mrg basic_string<_CharT,_Traits,_Allocator>& __str) 1284 1.1 mrg { 1285 1.1 mrg std::basic_istream<_CharT,_Traits>& __res = getline(__is, 1286 1.1 mrg __str._M_base()); 1287 1.1 mrg __str._M_invalidate_all(); 1288 1.1 mrg return __res; 1289 1.1 mrg } 1290 1.1 mrg 1291 1.1 mrg typedef basic_string<char> string; 1292 1.1 mrg 1293 1.1 mrg typedef basic_string<wchar_t> wstring; 1294 1.14 mrg 1295 1.14 mrg #ifdef _GLIBCXX_USE_CHAR8_T 1296 1.14 mrg /// A string of @c char8_t 1297 1.14 mrg typedef basic_string<char8_t> u8string; 1298 1.14 mrg #endif 1299 1.14 mrg 1300 1.14 mrg #if __cplusplus >= 201103L 1301 1.14 mrg /// A string of @c char16_t 1302 1.14 mrg typedef basic_string<char16_t> u16string; 1303 1.14 mrg 1304 1.14 mrg /// A string of @c char32_t 1305 1.14 mrg typedef basic_string<char32_t> u32string; 1306 1.1 mrg #endif 1307 1.1 mrg 1308 1.5 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1309 1.5 mrg struct _Insert_range_from_self_is_safe< 1310 1.5 mrg __gnu_debug::basic_string<_CharT, _Traits, _Allocator> > 1311 1.5 mrg { enum { __value = 1 }; }; 1312 1.5 mrg 1313 1.1 mrg } // namespace __gnu_debug 1314 1.1 mrg 1315 1.14 mrg #if __cplusplus >= 201103L 1316 1.14 mrg namespace std _GLIBCXX_VISIBILITY(default) 1317 1.14 mrg { 1318 1.14 mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION 1319 1.14 mrg 1320 1.14 mrg /// std::hash specialization for __gnu_debug::basic_string. 1321 1.14 mrg template<typename _CharT> 1322 1.14 mrg struct hash<__gnu_debug::basic_string<_CharT>> 1323 1.14 mrg : public hash<std::basic_string<_CharT>> 1324 1.14 mrg { }; 1325 1.14 mrg 1326 1.14 mrg template<typename _CharT> 1327 1.14 mrg struct __is_fast_hash<hash<__gnu_debug::basic_string<_CharT>>> 1328 1.14 mrg : __is_fast_hash<hash<std::basic_string<_CharT>>> 1329 1.14 mrg { }; 1330 1.14 mrg 1331 1.14 mrg _GLIBCXX_END_NAMESPACE_VERSION 1332 1.14 mrg } 1333 1.14 mrg #endif /* C++11 */ 1334 1.14 mrg 1335 1.14 mrg #undef _GLIBCXX_INSERT_RETURNS_ITERATOR 1336 1.14 mrg #undef _GLIBCXX_INSERT_RETURNS_ITERATOR_ONLY 1337 1.14 mrg 1338 1.1 mrg #endif 1339