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