Where Online Learning is simpler!
The C and C++ Include Header Files
/usr/include/c++/11/ext/vstring.h
$ cat -n /usr/include/c++/11/ext/vstring.h 1 // Versatile string -*- C++ -*- 2 3 // Copyright (C) 2005-2021 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 ext/vstring.h 26 * This file is a GNU extension to the Standard C++ Library. 27 */ 28 29 #ifndef _VSTRING_H 30 #define _VSTRING_H 1 31 32 #pragma GCC system_header 33 34 #if __cplusplus >= 201103L 35 #include
36 #endif 37 38 #include
39 #include
40 #include
41 42 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 43 { 44 _GLIBCXX_BEGIN_NAMESPACE_VERSION 45 46 /** 47 * @class __versa_string vstring.h 48 * @brief Template class __versa_string. 49 * @ingroup extensions 50 * 51 * Data structure managing sequences of characters and 52 * character-like objects. 53 */ 54 template
class _Base> 56 class __versa_string 57 : private _Base<_CharT, _Traits, _Alloc> 58 { 59 typedef _Base<_CharT, _Traits, _Alloc> __vstring_base; 60 typedef typename __vstring_base::_CharT_alloc_type _CharT_alloc_type; 61 typedef __alloc_traits<_CharT_alloc_type> _CharT_alloc_traits; 62 63 // Types: 64 public: 65 typedef _Traits traits_type; 66 typedef typename _Traits::char_type value_type; 67 typedef _Alloc allocator_type; 68 typedef typename _CharT_alloc_type::size_type size_type; 69 typedef typename _CharT_alloc_type::difference_type difference_type; 70 typedef value_type& reference; 71 typedef const value_type& const_reference; 72 typedef typename _CharT_alloc_traits::pointer pointer; 73 typedef typename _CharT_alloc_traits::const_pointer const_pointer; 74 typedef __gnu_cxx::__normal_iterator
iterator; 75 typedef __gnu_cxx::__normal_iterator
76 const_iterator; 77 typedef std::reverse_iterator
const_reverse_iterator; 78 typedef std::reverse_iterator
reverse_iterator; 79 80 // Data Member (public): 81 /// Value returned by various member functions when they fail. 82 static const size_type npos = static_cast
(-1); 83 84 private: 85 size_type 86 _M_check(size_type __pos, const char* __s) const 87 { 88 if (__pos > this->size()) 89 std::__throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > " 90 "this->size() (which is %zu)"), 91 __s, __pos, this->size()); 92 return __pos; 93 } 94 95 void 96 _M_check_length(size_type __n1, size_type __n2, const char* __s) const 97 { 98 if (this->max_size() - (this->size() - __n1) < __n2) 99 std::__throw_length_error(__N(__s)); 100 } 101 102 // NB: _M_limit doesn't check for a bad __pos value. 103 size_type 104 _M_limit(size_type __pos, size_type __off) const _GLIBCXX_NOEXCEPT 105 { 106 const bool __testoff = __off < this->size() - __pos; 107 return __testoff ? __off : this->size() - __pos; 108 } 109 110 // True if _Rep and source do not overlap. 111 bool 112 _M_disjunct(const _CharT* __s) const _GLIBCXX_NOEXCEPT 113 { 114 return (std::less
()(__s, this->_M_data()) 115 || std::less
()(this->_M_data() 116 + this->size(), __s)); 117 } 118 119 // For the internal use we have functions similar to `begin'/`end' 120 // but they do not call _M_leak. 121 iterator 122 _M_ibegin() const _GLIBCXX_NOEXCEPT 123 { return iterator(this->_M_data()); } 124 125 iterator 126 _M_iend() const _GLIBCXX_NOEXCEPT 127 { return iterator(this->_M_data() + this->_M_length()); } 128 129 public: 130 // Construct/copy/destroy: 131 // NB: We overload ctors in some cases instead of using default 132 // arguments, per 17.4.4.4 para. 2 item 2. 133 134 /** 135 * @brief Construct an empty string using allocator @a a. 136 */ 137 explicit 138 __versa_string(const _Alloc& __a = _Alloc()) _GLIBCXX_NOEXCEPT 139 : __vstring_base(__a) { } 140 141 // NB: per LWG issue 42, semantics different from IS: 142 /** 143 * @brief Construct string with copy of value of @a __str. 144 * @param __str Source string. 145 */ 146 __versa_string(const __versa_string& __str) 147 : __vstring_base(__str) { } 148 149 #if __cplusplus >= 201103L 150 /** 151 * @brief String move constructor. 152 * @param __str Source string. 153 * 154 * The newly-constructed %string contains the exact contents of 155 * @a __str. The contents of @a __str are a valid, but unspecified 156 * string. 157 */ 158 __versa_string(__versa_string&& __str) noexcept 159 : __vstring_base(std::move(__str)) { } 160 161 /** 162 * @brief Construct string from an initializer list. 163 * @param __l std::initializer_list of characters. 164 * @param __a Allocator to use (default is default allocator). 165 */ 166 __versa_string(std::initializer_list<_CharT> __l, 167 const _Alloc& __a = _Alloc()) 168 : __vstring_base(__l.begin(), __l.end(), __a) { } 169 #endif 170 171 /** 172 * @brief Construct string as copy of a substring. 173 * @param __str Source string. 174 * @param __pos Index of first character to copy from. 175 * @param __n Number of characters to copy (default remainder). 176 */ 177 __versa_string(const __versa_string& __str, size_type __pos, 178 size_type __n = npos) 179 : __vstring_base(__str._M_data() 180 + __str._M_check(__pos, 181 "__versa_string::__versa_string"), 182 __str._M_data() + __str._M_limit(__pos, __n) 183 + __pos, _Alloc()) { } 184 185 /** 186 * @brief Construct string as copy of a substring. 187 * @param __str Source string. 188 * @param __pos Index of first character to copy from. 189 * @param __n Number of characters to copy. 190 * @param __a Allocator to use. 191 */ 192 __versa_string(const __versa_string& __str, size_type __pos, 193 size_type __n, const _Alloc& __a) 194 : __vstring_base(__str._M_data() 195 + __str._M_check(__pos, 196 "__versa_string::__versa_string"), 197 __str._M_data() + __str._M_limit(__pos, __n) 198 + __pos, __a) { } 199 200 /** 201 * @brief Construct string initialized by a character array. 202 * @param __s Source character array. 203 * @param __n Number of characters to copy. 204 * @param __a Allocator to use (default is default allocator). 205 * 206 * NB: @a __s must have at least @a __n characters, '\\0' has no special 207 * meaning. 208 */ 209 __versa_string(const _CharT* __s, size_type __n, 210 const _Alloc& __a = _Alloc()) 211 : __vstring_base(__s, __s + __n, __a) { } 212 213 /** 214 * @brief Construct string as copy of a C string. 215 * @param __s Source C string. 216 * @param __a Allocator to use (default is default allocator). 217 */ 218 __versa_string(const _CharT* __s, const _Alloc& __a = _Alloc()) 219 : __vstring_base(__s, __s ? __s + traits_type::length(__s) : 220 __s + npos, __a) { } 221 222 /** 223 * @brief Construct string as multiple characters. 224 * @param __n Number of characters. 225 * @param __c Character to use. 226 * @param __a Allocator to use (default is default allocator). 227 */ 228 __versa_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc()) 229 : __vstring_base(__n, __c, __a) { } 230 231 /** 232 * @brief Construct string as copy of a range. 233 * @param __beg Start of range. 234 * @param __end End of range. 235 * @param __a Allocator to use (default is default allocator). 236 */ 237 #if __cplusplus >= 201103L 238 template
> 240 #else 241 template
242 #endif 243 __versa_string(_InputIterator __beg, _InputIterator __end, 244 const _Alloc& __a = _Alloc()) 245 : __vstring_base(__beg, __end, __a) { } 246 247 /** 248 * @brief Destroy the string instance. 249 */ 250 ~__versa_string() _GLIBCXX_NOEXCEPT { } 251 252 /** 253 * @brief Assign the value of @a str to this string. 254 * @param __str Source string. 255 */ 256 __versa_string& 257 operator=(const __versa_string& __str) 258 { return this->assign(__str); } 259 260 #if __cplusplus >= 201103L 261 /** 262 * @brief String move assignment operator. 263 * @param __str Source string. 264 * 265 * The contents of @a __str are moved into this string (without 266 * copying). @a __str is a valid, but unspecified string. 267 */ 268 __versa_string& 269 operator=(__versa_string&& __str) noexcept 270 { 271 // NB: DR 1204. 272 this->swap(__str); 273 return *this; 274 } 275 276 /** 277 * @brief Set value to string constructed from initializer list. 278 * @param __l std::initializer_list. 279 */ 280 __versa_string& 281 operator=(std::initializer_list<_CharT> __l) 282 { 283 this->assign(__l.begin(), __l.end()); 284 return *this; 285 } 286 #endif 287 288 /** 289 * @brief Copy contents of @a __s into this string. 290 * @param __s Source null-terminated string. 291 */ 292 __versa_string& 293 operator=(const _CharT* __s) 294 { return this->assign(__s); } 295 296 /** 297 * @brief Set value to string of length 1. 298 * @param __c Source character. 299 * 300 * Assigning to a character makes this string length 1 and 301 * (*this)[0] == @a __c. 302 */ 303 __versa_string& 304 operator=(_CharT __c) 305 { 306 this->assign(1, __c); 307 return *this; 308 } 309 310 // Iterators: 311 /** 312 * Returns a read/write iterator that points to the first character in 313 * the %string. Unshares the string. 314 */ 315 iterator 316 begin() _GLIBCXX_NOEXCEPT 317 { 318 this->_M_leak(); 319 return iterator(this->_M_data()); 320 } 321 322 /** 323 * Returns a read-only (constant) iterator that points to the first 324 * character in the %string. 325 */ 326 const_iterator 327 begin() const _GLIBCXX_NOEXCEPT 328 { return const_iterator(this->_M_data()); } 329 330 /** 331 * Returns a read/write iterator that points one past the last 332 * character in the %string. Unshares the string. 333 */ 334 iterator 335 end() _GLIBCXX_NOEXCEPT 336 { 337 this->_M_leak(); 338 return iterator(this->_M_data() + this->size()); 339 } 340 341 /** 342 * Returns a read-only (constant) iterator that points one past the 343 * last character in the %string. 344 */ 345 const_iterator 346 end() const _GLIBCXX_NOEXCEPT 347 { return const_iterator(this->_M_data() + this->size()); } 348 349 /** 350 * Returns a read/write reverse iterator that points to the last 351 * character in the %string. Iteration is done in reverse element 352 * order. Unshares the string. 353 */ 354 reverse_iterator 355 rbegin() _GLIBCXX_NOEXCEPT 356 { return reverse_iterator(this->end()); } 357 358 /** 359 * Returns a read-only (constant) reverse iterator that points 360 * to the last character in the %string. Iteration is done in 361 * reverse element order. 362 */ 363 const_reverse_iterator 364 rbegin() const _GLIBCXX_NOEXCEPT 365 { return const_reverse_iterator(this->end()); } 366 367 /** 368 * Returns a read/write reverse iterator that points to one before the 369 * first character in the %string. Iteration is done in reverse 370 * element order. Unshares the string. 371 */ 372 reverse_iterator 373 rend() _GLIBCXX_NOEXCEPT 374 { return reverse_iterator(this->begin()); } 375 376 /** 377 * Returns a read-only (constant) reverse iterator that points 378 * to one before the first character in the %string. Iteration 379 * is done in reverse element order. 380 */ 381 const_reverse_iterator 382 rend() const _GLIBCXX_NOEXCEPT 383 { return const_reverse_iterator(this->begin()); } 384 385 #if __cplusplus >= 201103L 386 /** 387 * Returns a read-only (constant) iterator that points to the first 388 * character in the %string. 389 */ 390 const_iterator 391 cbegin() const noexcept 392 { return const_iterator(this->_M_data()); } 393 394 /** 395 * Returns a read-only (constant) iterator that points one past the 396 * last character in the %string. 397 */ 398 const_iterator 399 cend() const noexcept 400 { return const_iterator(this->_M_data() + this->size()); } 401 402 /** 403 * Returns a read-only (constant) reverse iterator that points 404 * to the last character in the %string. Iteration is done in 405 * reverse element order. 406 */ 407 const_reverse_iterator 408 crbegin() const noexcept 409 { return const_reverse_iterator(this->end()); } 410 411 /** 412 * Returns a read-only (constant) reverse iterator that points 413 * to one before the first character in the %string. Iteration 414 * is done in reverse element order. 415 */ 416 const_reverse_iterator 417 crend() const noexcept 418 { return const_reverse_iterator(this->begin()); } 419 #endif 420 421 public: 422 // Capacity: 423 /// Returns the number of characters in the string, not including any 424 /// null-termination. 425 size_type 426 size() const _GLIBCXX_NOEXCEPT 427 { return this->_M_length(); } 428 429 /// Returns the number of characters in the string, not including any 430 /// null-termination. 431 size_type 432 length() const _GLIBCXX_NOEXCEPT 433 { return this->_M_length(); } 434 435 /// Returns the size() of the largest possible %string. 436 size_type 437 max_size() const _GLIBCXX_NOEXCEPT 438 { return this->_M_max_size(); } 439 440 /** 441 * @brief Resizes the %string to the specified number of characters. 442 * @param __n Number of characters the %string should contain. 443 * @param __c Character to fill any new elements. 444 * 445 * This function will %resize the %string to the specified 446 * number of characters. If the number is smaller than the 447 * %string's current size the %string is truncated, otherwise 448 * the %string is extended and new elements are set to @a __c. 449 */ 450 void 451 resize(size_type __n, _CharT __c); 452 453 /** 454 * @brief Resizes the %string to the specified number of characters. 455 * @param __n Number of characters the %string should contain. 456 * 457 * This function will resize the %string to the specified 458 * length. If the new size is smaller than the %string's 459 * current size the %string is truncated, otherwise the %string 460 * is extended and new characters are default-constructed. For 461 * basic types such as char, this means setting them to 0. 462 */ 463 void 464 resize(size_type __n) 465 { this->resize(__n, _CharT()); } 466 467 #if __cplusplus >= 201103L 468 /// A non-binding request to reduce capacity() to size(). 469 void 470 shrink_to_fit() noexcept 471 { 472 if (capacity() > size()) 473 { 474 __try 475 { this->reserve(0); } 476 __catch(...) 477 { } 478 } 479 } 480 #endif 481 482 /** 483 * Returns the total number of characters that the %string can 484 * hold before needing to allocate more memory. 485 */ 486 size_type 487 capacity() const _GLIBCXX_NOEXCEPT 488 { return this->_M_capacity(); } 489 490 /** 491 * @brief Attempt to preallocate enough memory for specified number of 492 * characters. 493 * @param __res_arg Number of characters required. 494 * @throw std::length_error If @a __res_arg exceeds @c max_size(). 495 * 496 * This function attempts to reserve enough memory for the 497 * %string to hold the specified number of characters. If the 498 * number requested is more than max_size(), length_error is 499 * thrown. 500 * 501 * The advantage of this function is that if optimal code is a 502 * necessity and the user can determine the string length that 503 * will be required, the user can reserve the memory in 504 * %advance, and thus prevent a possible reallocation of memory 505 * and copying of %string data. 506 */ 507 void 508 reserve(size_type __res_arg = 0) 509 { this->_M_reserve(__res_arg); } 510 511 /** 512 * Erases the string, making it empty. 513 */ 514 void 515 clear() _GLIBCXX_NOEXCEPT 516 { this->_M_clear(); } 517 518 /** 519 * Returns true if the %string is empty. Equivalent to 520 *
*this == ""
. 521 */ 522 _GLIBCXX_NODISCARD bool 523 empty() const _GLIBCXX_NOEXCEPT 524 { return this->size() == 0; } 525 526 // Element access: 527 /** 528 * @brief Subscript access to the data contained in the %string. 529 * @param __pos The index of the character to access. 530 * @return Read-only (constant) reference to the character. 531 * 532 * This operator allows for easy, array-style, data access. 533 * Note that data access with this operator is unchecked and 534 * out_of_range lookups are not defined. (For checked lookups 535 * see at().) 536 */ 537 const_reference 538 operator[] (size_type __pos) const _GLIBCXX_NOEXCEPT 539 { 540 __glibcxx_assert(__pos <= this->size()); 541 return this->_M_data()[__pos]; 542 } 543 544 /** 545 * @brief Subscript access to the data contained in the %string. 546 * @param __pos The index of the character to access. 547 * @return Read/write reference to the character. 548 * 549 * This operator allows for easy, array-style, data access. 550 * Note that data access with this operator is unchecked and 551 * out_of_range lookups are not defined. (For checked lookups 552 * see at().) Unshares the string. 553 */ 554 reference 555 operator[](size_type __pos) _GLIBCXX_NOEXCEPT 556 { 557 // Allow pos == size() both in C++98 mode, as v3 extension, 558 // and in C++11 mode. 559 __glibcxx_assert(__pos <= this->size()); 560 // In pedantic mode be strict in C++98 mode. 561 _GLIBCXX_DEBUG_PEDASSERT(__cplusplus >= 201103L 562 || __pos < this->size()); 563 this->_M_leak(); 564 return this->_M_data()[__pos]; 565 } 566 567 /** 568 * @brief Provides access to the data contained in the %string. 569 * @param __n The index of the character to access. 570 * @return Read-only (const) reference to the character. 571 * @throw std::out_of_range If @a __n is an invalid index. 572 * 573 * This function provides for safer data access. The parameter 574 * is first checked that it is in the range of the string. The 575 * function throws out_of_range if the check fails. 576 */ 577 const_reference 578 at(size_type __n) const 579 { 580 if (__n >= this->size()) 581 std::__throw_out_of_range_fmt(__N("__versa_string::at: __n " 582 "(which is %zu) >= this->size() " 583 "(which is %zu)"), 584 __n, this->size()); 585 return this->_M_data()[__n]; 586 } 587 588 /** 589 * @brief Provides access to the data contained in the %string. 590 * @param __n The index of the character to access. 591 * @return Read/write reference to the character. 592 * @throw std::out_of_range If @a __n is an invalid index. 593 * 594 * This function provides for safer data access. The parameter 595 * is first checked that it is in the range of the string. The 596 * function throws out_of_range if the check fails. Success 597 * results in unsharing the string. 598 */ 599 reference 600 at(size_type __n) 601 { 602 if (__n >= this->size()) 603 std::__throw_out_of_range_fmt(__N("__versa_string::at: __n " 604 "(which is %zu) >= this->size() " 605 "(which is %zu)"), 606 __n, this->size()); 607 this->_M_leak(); 608 return this->_M_data()[__n]; 609 } 610 611 #if __cplusplus >= 201103L 612 /** 613 * Returns a read/write reference to the data at the first 614 * element of the %string. 615 */ 616 reference 617 front() noexcept 618 { return operator[](0); } 619 620 /** 621 * Returns a read-only (constant) reference to the data at the first 622 * element of the %string. 623 */ 624 const_reference 625 front() const noexcept 626 { return operator[](0); } 627 628 /** 629 * Returns a read/write reference to the data at the last 630 * element of the %string. 631 */ 632 reference 633 back() noexcept 634 { return operator[](this->size() - 1); } 635 636 /** 637 * Returns a read-only (constant) reference to the data at the 638 * last element of the %string. 639 */ 640 const_reference 641 back() const noexcept 642 { return operator[](this->size() - 1); } 643 #endif 644 645 // Modifiers: 646 /** 647 * @brief Append a string to this string. 648 * @param __str The string to append. 649 * @return Reference to this string. 650 */ 651 __versa_string& 652 operator+=(const __versa_string& __str) 653 { return this->append(__str); } 654 655 /** 656 * @brief Append a C string. 657 * @param __s The C string to append. 658 * @return Reference to this string. 659 */ 660 __versa_string& 661 operator+=(const _CharT* __s) 662 { return this->append(__s); } 663 664 /** 665 * @brief Append a character. 666 * @param __c The character to append. 667 * @return Reference to this string. 668 */ 669 __versa_string& 670 operator+=(_CharT __c) 671 { 672 this->push_back(__c); 673 return *this; 674 } 675 676 #if __cplusplus >= 201103L 677 /** 678 * @brief Append an initializer_list of characters. 679 * @param __l The initializer_list of characters to be appended. 680 * @return Reference to this string. 681 */ 682 __versa_string& 683 operator+=(std::initializer_list<_CharT> __l) 684 { return this->append(__l.begin(), __l.end()); } 685 #endif // C++11 686 687 /** 688 * @brief Append a string to this string. 689 * @param __str The string to append. 690 * @return Reference to this string. 691 */ 692 __versa_string& 693 append(const __versa_string& __str) 694 { return _M_append(__str._M_data(), __str.size()); } 695 696 /** 697 * @brief Append a substring. 698 * @param __str The string to append. 699 * @param __pos Index of the first character of str to append. 700 * @param __n The number of characters to append. 701 * @return Reference to this string. 702 * @throw std::out_of_range if @a pos is not a valid index. 703 * 704 * This function appends @a __n characters from @a __str 705 * starting at @a __pos to this string. If @a __n is is larger 706 * than the number of available characters in @a __str, the 707 * remainder of @a __str is appended. 708 */ 709 __versa_string& 710 append(const __versa_string& __str, size_type __pos, size_type __n) 711 { return _M_append(__str._M_data() 712 + __str._M_check(__pos, "__versa_string::append"), 713 __str._M_limit(__pos, __n)); } 714 715 /** 716 * @brief Append a C substring. 717 * @param __s The C string to append. 718 * @param __n The number of characters to append. 719 * @return Reference to this string. 720 */ 721 __versa_string& 722 append(const _CharT* __s, size_type __n) 723 { 724 __glibcxx_requires_string_len(__s, __n); 725 _M_check_length(size_type(0), __n, "__versa_string::append"); 726 return _M_append(__s, __n); 727 } 728 729 /** 730 * @brief Append a C string. 731 * @param __s The C string to append. 732 * @return Reference to this string. 733 */ 734 __versa_string& 735 append(const _CharT* __s) 736 { 737 __glibcxx_requires_string(__s); 738 const size_type __n = traits_type::length(__s); 739 _M_check_length(size_type(0), __n, "__versa_string::append"); 740 return _M_append(__s, __n); 741 } 742 743 /** 744 * @brief Append multiple characters. 745 * @param __n The number of characters to append. 746 * @param __c The character to use. 747 * @return Reference to this string. 748 * 749 * Appends n copies of c to this string. 750 */ 751 __versa_string& 752 append(size_type __n, _CharT __c) 753 { return _M_replace_aux(this->size(), size_type(0), __n, __c); } 754 755 #if __cplusplus >= 201103L 756 /** 757 * @brief Append an initializer_list of characters. 758 * @param __l The initializer_list of characters to append. 759 * @return Reference to this string. 760 */ 761 __versa_string& 762 append(std::initializer_list<_CharT> __l) 763 { return this->append(__l.begin(), __l.end()); } 764 #endif // C++11 765 766 /** 767 * @brief Append a range of characters. 768 * @param __first Iterator referencing the first character to append. 769 * @param __last Iterator marking the end of the range. 770 * @return Reference to this string. 771 * 772 * Appends characters in the range [first,last) to this string. 773 */ 774 #if __cplusplus >= 201103L 775 template
> 777 #else 778 template
779 #endif 780 __versa_string& 781 append(_InputIterator __first, _InputIterator __last) 782 { return this->replace(_M_iend(), _M_iend(), __first, __last); } 783 784 /** 785 * @brief Append a single character. 786 * @param __c Character to append. 787 */ 788 void 789 push_back(_CharT __c) 790 { 791 const size_type __size = this->size(); 792 if (__size + 1 > this->capacity() || this->_M_is_shared()) 793 this->_M_mutate(__size, size_type(0), 0, size_type(1)); 794 traits_type::assign(this->_M_data()[__size], __c); 795 this->_M_set_length(__size + 1); 796 } 797 798 /** 799 * @brief Set value to contents of another string. 800 * @param __str Source string to use. 801 * @return Reference to this string. 802 */ 803 __versa_string& 804 assign(const __versa_string& __str) 805 { 806 this->_M_assign(__str); 807 return *this; 808 } 809 810 #if __cplusplus >= 201103L 811 /** 812 * @brief Set value to contents of another string. 813 * @param __str Source string to use. 814 * @return Reference to this string. 815 * 816 * This function sets this string to the exact contents of @a __str. 817 * @a __str is a valid, but unspecified string. 818 */ 819 __versa_string& 820 assign(__versa_string&& __str) noexcept 821 { 822 this->swap(__str); 823 return *this; 824 } 825 #endif // C++11 826 827 /** 828 * @brief Set value to a substring of a string. 829 * @param __str The string to use. 830 * @param __pos Index of the first character of str. 831 * @param __n Number of characters to use. 832 * @return Reference to this string. 833 * @throw std::out_of_range if @a __pos is not a valid index. 834 * 835 * This function sets this string to the substring of @a __str 836 * consisting of @a __n characters at @a __pos. If @a __n is 837 * is larger than the number of available characters in @a 838 * __str, the remainder of @a __str is used. 839 */ 840 __versa_string& 841 assign(const __versa_string& __str, size_type __pos, size_type __n) 842 { return _M_replace(size_type(0), this->size(), __str._M_data() 843 + __str._M_check(__pos, "__versa_string::assign"), 844 __str._M_limit(__pos, __n)); } 845 846 /** 847 * @brief Set value to a C substring. 848 * @param __s The C string to use. 849 * @param __n Number of characters to use. 850 * @return Reference to this string. 851 * 852 * This function sets the value of this string to the first @a 853 * __n characters of @a __s. If @a __n is is larger than the 854 * number of available characters in @a __s, the remainder of 855 * @a __s is used. 856 */ 857 __versa_string& 858 assign(const _CharT* __s, size_type __n) 859 { 860 __glibcxx_requires_string_len(__s, __n); 861 return _M_replace(size_type(0), this->size(), __s, __n); 862 } 863 864 /** 865 * @brief Set value to contents of a C string. 866 * @param __s The C string to use. 867 * @return Reference to this string. 868 * 869 * This function sets the value of this string to the value of 870 * @a __s. The data is copied, so there is no dependence on @a 871 * __s once the function returns. 872 */ 873 __versa_string& 874 assign(const _CharT* __s) 875 { 876 __glibcxx_requires_string(__s); 877 return _M_replace(size_type(0), this->size(), __s, 878 traits_type::length(__s)); 879 } 880 881 /** 882 * @brief Set value to multiple characters. 883 * @param __n Length of the resulting string. 884 * @param __c The character to use. 885 * @return Reference to this string. 886 * 887 * This function sets the value of this string to @a __n copies of 888 * character @a __c. 889 */ 890 __versa_string& 891 assign(size_type __n, _CharT __c) 892 { return _M_replace_aux(size_type(0), this->size(), __n, __c); } 893 894 /** 895 * @brief Set value to a range of characters. 896 * @param __first Iterator referencing the first character to append. 897 * @param __last Iterator marking the end of the range. 898 * @return Reference to this string. 899 * 900 * Sets value of string to characters in the range 901 * [first,last). 902 */ 903 #if __cplusplus >= 201103L 904 template
> 906 #else 907 template
908 #endif 909 __versa_string& 910 assign(_InputIterator __first, _InputIterator __last) 911 { return this->replace(_M_ibegin(), _M_iend(), __first, __last); } 912 913 #if __cplusplus >= 201103L 914 /** 915 * @brief Set value to an initializer_list of characters. 916 * @param __l The initializer_list of characters to assign. 917 * @return Reference to this string. 918 */ 919 __versa_string& 920 assign(std::initializer_list<_CharT> __l) 921 { return this->assign(__l.begin(), __l.end()); } 922 #endif // C++11 923 924 #if __cplusplus >= 201103L 925 /** 926 * @brief Insert multiple characters. 927 * @param __p Const_iterator referencing location in string to 928 * insert at. 929 * @param __n Number of characters to insert 930 * @param __c The character to insert. 931 * @return Iterator referencing the first inserted char. 932 * @throw std::length_error If new length exceeds @c max_size(). 933 * 934 * Inserts @a __n copies of character @a __c starting at the 935 * position referenced by iterator @a __p. If adding 936 * characters causes the length to exceed max_size(), 937 * length_error is thrown. The value of the string doesn't 938 * change if an error is thrown. 939 */ 940 iterator 941 insert(const_iterator __p, size_type __n, _CharT __c) 942 { 943 _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend()); 944 const size_type __pos = __p - _M_ibegin(); 945 this->replace(__p, __p, __n, __c); 946 return iterator(this->_M_data() + __pos); 947 } 948 #else 949 /** 950 * @brief Insert multiple characters. 951 * @param __p Iterator referencing location in string to insert at. 952 * @param __n Number of characters to insert 953 * @param __c The character to insert. 954 * @throw std::length_error If new length exceeds @c max_size(). 955 * 956 * Inserts @a __n copies of character @a __c starting at the 957 * position referenced by iterator @a __p. If adding 958 * characters causes the length to exceed max_size(), 959 * length_error is thrown. The value of the string doesn't 960 * change if an error is thrown. 961 */ 962 void 963 insert(iterator __p, size_type __n, _CharT __c) 964 { this->replace(__p, __p, __n, __c); } 965 #endif 966 967 #if __cplusplus >= 201103L 968 /** 969 * @brief Insert a range of characters. 970 * @param __p Const_iterator referencing location in string to 971 * insert at. 972 * @param __beg Start of range. 973 * @param __end End of range. 974 * @return Iterator referencing the first inserted char. 975 * @throw std::length_error If new length exceeds @c max_size(). 976 * 977 * Inserts characters in range [beg,end). If adding characters 978 * causes the length to exceed max_size(), length_error is 979 * thrown. The value of the string doesn't change if an error 980 * is thrown. 981 */ 982 template
> 984 iterator 985 insert(const_iterator __p, _InputIterator __beg, _InputIterator __end) 986 { 987 _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend()); 988 const size_type __pos = __p - _M_ibegin(); 989 this->replace(__p, __p, __beg, __end); 990 return iterator(this->_M_data() + __pos); 991 } 992 #else 993 /** 994 * @brief Insert a range of characters. 995 * @param __p Iterator referencing location in string to insert at. 996 * @param __beg Start of range. 997 * @param __end End of range. 998 * @throw std::length_error If new length exceeds @c max_size(). 999 * 1000 * Inserts characters in range [beg,end). If adding characters 1001 * causes the length to exceed max_size(), length_error is 1002 * thrown. The value of the string doesn't change if an error 1003 * is thrown. 1004 */ 1005 template
1006 void 1007 insert(iterator __p, _InputIterator __beg, _InputIterator __end) 1008 { this->replace(__p, __p, __beg, __end); } 1009 #endif 1010 1011 #if __cplusplus >= 201103L 1012 /** 1013 * @brief Insert an initializer_list of characters. 1014 * @param __p Const_iterator referencing location in string to 1015 * insert at. 1016 * @param __l The initializer_list of characters to insert. 1017 * @return Iterator referencing the first inserted char. 1018 * @throw std::length_error If new length exceeds @c max_size(). 1019 */ 1020 iterator 1021 insert(const_iterator __p, std::initializer_list<_CharT> __l) 1022 { return this->insert(__p, __l.begin(), __l.end()); } 1023 #endif // C++11 1024 1025 /** 1026 * @brief Insert value of a string. 1027 * @param __pos1 Iterator referencing location in string to insert at. 1028 * @param __str The string to insert. 1029 * @return Reference to this string. 1030 * @throw std::length_error If new length exceeds @c max_size(). 1031 * 1032 * Inserts value of @a __str starting at @a __pos1. If adding 1033 * characters causes the length to exceed max_size(), 1034 * length_error is thrown. The value of the string doesn't 1035 * change if an error is thrown. 1036 */ 1037 __versa_string& 1038 insert(size_type __pos1, const __versa_string& __str) 1039 { return this->replace(__pos1, size_type(0), 1040 __str._M_data(), __str.size()); } 1041 1042 /** 1043 * @brief Insert a substring. 1044 * @param __pos1 Iterator referencing location in string to insert at. 1045 * @param __str The string to insert. 1046 * @param __pos2 Start of characters in str to insert. 1047 * @param __n Number of characters to insert. 1048 * @return Reference to this string. 1049 * @throw std::length_error If new length exceeds @c max_size(). 1050 * @throw std::out_of_range If @a __pos1 > size() or 1051 * @a __pos2 > @a __str.size(). 1052 * 1053 * Starting at @a __pos1, insert @a __n character of @a __str 1054 * beginning with @a __pos2. If adding characters causes the 1055 * length to exceed max_size(), length_error is thrown. If @a 1056 * __pos1 is beyond the end of this string or @a __pos2 is 1057 * beyond the end of @a __str, out_of_range is thrown. The 1058 * value of the string doesn't change if an error is thrown. 1059 */ 1060 __versa_string& 1061 insert(size_type __pos1, const __versa_string& __str, 1062 size_type __pos2, size_type __n) 1063 { return this->replace(__pos1, size_type(0), __str._M_data() 1064 + __str._M_check(__pos2, "__versa_string::insert"), 1065 __str._M_limit(__pos2, __n)); } 1066 1067 /** 1068 * @brief Insert a C substring. 1069 * @param __pos Iterator referencing location in string to insert at. 1070 * @param __s The C string to insert. 1071 * @param __n The number of characters to insert. 1072 * @return Reference to this string. 1073 * @throw std::length_error If new length exceeds @c max_size(). 1074 * @throw std::out_of_range If @a __pos is beyond the end of this 1075 * string. 1076 * 1077 * Inserts the first @a __n characters of @a __s starting at @a 1078 * __pos. If adding characters causes the length to exceed 1079 * max_size(), length_error is thrown. If @a __pos is beyond 1080 * end(), out_of_range is thrown. The value of the string 1081 * doesn't change if an error is thrown. 1082 */ 1083 __versa_string& 1084 insert(size_type __pos, const _CharT* __s, size_type __n) 1085 { return this->replace(__pos, size_type(0), __s, __n); } 1086 1087 /** 1088 * @brief Insert a C string. 1089 * @param __pos Iterator referencing location in string to insert at. 1090 * @param __s The C string to insert. 1091 * @return Reference to this string. 1092 * @throw std::length_error If new length exceeds @c max_size(). 1093 * @throw std::out_of_range If @a __pos is beyond the end of this 1094 * string. 1095 * 1096 * Inserts the first @a __n characters of @a __s starting at @a 1097 * __pos. If adding characters causes the length to exceed 1098 * max_size(), length_error is thrown. If @a __pos is beyond 1099 * end(), out_of_range is thrown. The value of the string 1100 * doesn't change if an error is thrown. 1101 */ 1102 __versa_string& 1103 insert(size_type __pos, const _CharT* __s) 1104 { 1105 __glibcxx_requires_string(__s); 1106 return this->replace(__pos, size_type(0), __s, 1107 traits_type::length(__s)); 1108 } 1109 1110 /** 1111 * @brief Insert multiple characters. 1112 * @param __pos Index in string to insert at. 1113 * @param __n Number of characters to insert 1114 * @param __c The character to insert. 1115 * @return Reference to this string. 1116 * @throw std::length_error If new length exceeds @c max_size(). 1117 * @throw std::out_of_range If @a __pos is beyond the end of this 1118 * string. 1119 * 1120 * Inserts @a __n copies of character @a __c starting at index 1121 * @a __pos. If adding characters causes the length to exceed 1122 * max_size(), length_error is thrown. If @a __pos > length(), 1123 * out_of_range is thrown. The value of the string doesn't 1124 * change if an error is thrown. 1125 */ 1126 __versa_string& 1127 insert(size_type __pos, size_type __n, _CharT __c) 1128 { return _M_replace_aux(_M_check(__pos, "__versa_string::insert"), 1129 size_type(0), __n, __c); } 1130 1131 /** 1132 * @brief Insert one character. 1133 * @param __p Iterator referencing position in string to insert at. 1134 * @param __c The character to insert. 1135 * @return Iterator referencing newly inserted char. 1136 * @throw std::length_error If new length exceeds @c max_size(). 1137 * 1138 * Inserts character @a __c at position referenced by @a __p. 1139 * If adding character causes the length to exceed max_size(), 1140 * length_error is thrown. If @a __p is beyond end of string, 1141 * out_of_range is thrown. The value of the string doesn't 1142 * change if an error is thrown. 1143 */ 1144 iterator 1145 #if __cplusplus >= 201103L 1146 insert(const_iterator __p, _CharT __c) 1147 #else 1148 insert(iterator __p, _CharT __c) 1149 #endif 1150 { 1151 _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend()); 1152 const size_type __pos = __p - _M_ibegin(); 1153 _M_replace_aux(__pos, size_type(0), size_type(1), __c); 1154 this->_M_set_leaked(); 1155 return iterator(this->_M_data() + __pos); 1156 } 1157 1158 /** 1159 * @brief Remove characters. 1160 * @param __pos Index of first character to remove (default 0). 1161 * @param __n Number of characters to remove (default remainder). 1162 * @return Reference to this string. 1163 * @throw std::out_of_range If @a __pos is beyond the end of this 1164 * string. 1165 * 1166 * Removes @a __n characters from this string starting at @a 1167 * __pos. The length of the string is reduced by @a __n. If 1168 * there are < @a __n characters to remove, the remainder of 1169 * the string is truncated. If @a __p is beyond end of string, 1170 * out_of_range is thrown. The value of the string doesn't 1171 * change if an error is thrown. 1172 */ 1173 __versa_string& 1174 erase(size_type __pos = 0, size_type __n = npos) 1175 { 1176 this->_M_erase(_M_check(__pos, "__versa_string::erase"), 1177 _M_limit(__pos, __n)); 1178 return *this; 1179 } 1180 1181 /** 1182 * @brief Remove one character. 1183 * @param __position Iterator referencing the character to remove. 1184 * @return iterator referencing same location after removal. 1185 * 1186 * Removes the character at @a __position from this string. The 1187 * value of the string doesn't change if an error is thrown. 1188 */ 1189 iterator 1190 #if __cplusplus >= 201103L 1191 erase(const_iterator __position) 1192 #else 1193 erase(iterator __position) 1194 #endif 1195 { 1196 _GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin() 1197 && __position < _M_iend()); 1198 const size_type __pos = __position - _M_ibegin(); 1199 this->_M_erase(__pos, size_type(1)); 1200 this->_M_set_leaked(); 1201 return iterator(this->_M_data() + __pos); 1202 } 1203 1204 /** 1205 * @brief Remove a range of characters. 1206 * @param __first Iterator referencing the first character to remove. 1207 * @param __last Iterator referencing the end of the range. 1208 * @return Iterator referencing location of first after removal. 1209 * 1210 * Removes the characters in the range [first,last) from this 1211 * string. The value of the string doesn't change if an error 1212 * is thrown. 1213 */ 1214 iterator 1215 #if __cplusplus >= 201103L 1216 erase(const_iterator __first, const_iterator __last) 1217 #else 1218 erase(iterator __first, iterator __last) 1219 #endif 1220 { 1221 _GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last 1222 && __last <= _M_iend()); 1223 const size_type __pos = __first - _M_ibegin(); 1224 this->_M_erase(__pos, __last - __first); 1225 this->_M_set_leaked(); 1226 return iterator(this->_M_data() + __pos); 1227 } 1228 1229 #if __cplusplus >= 201103L 1230 /** 1231 * @brief Remove the last character. 1232 * 1233 * The string must be non-empty. 1234 */ 1235 void 1236 pop_back() 1237 { this->_M_erase(size()-1, 1); } 1238 #endif // C++11 1239 1240 /** 1241 * @brief Replace characters with value from another string. 1242 * @param __pos Index of first character to replace. 1243 * @param __n Number of characters to be replaced. 1244 * @param __str String to insert. 1245 * @return Reference to this string. 1246 * @throw std::out_of_range If @a __pos is beyond the end of this 1247 * string. 1248 * @throw std::length_error If new length exceeds @c max_size(). 1249 * 1250 * Removes the characters in the range [pos,pos+n) from this 1251 * string. In place, the value of @a __str is inserted. If @a 1252 * __pos is beyond end of string, out_of_range is thrown. If 1253 * the length of the result exceeds max_size(), length_error is 1254 * thrown. The value of the string doesn't change if an error 1255 * is thrown. 1256 */ 1257 __versa_string& 1258 replace(size_type __pos, size_type __n, const __versa_string& __str) 1259 { return this->replace(__pos, __n, __str._M_data(), __str.size()); } 1260 1261 /** 1262 * @brief Replace characters with value from another string. 1263 * @param __pos1 Index of first character to replace. 1264 * @param __n1 Number of characters to be replaced. 1265 * @param __str String to insert. 1266 * @param __pos2 Index of first character of str to use. 1267 * @param __n2 Number of characters from str to use. 1268 * @return Reference to this string. 1269 * @throw std::out_of_range If @a __pos1 > size() or @a __pos2 > 1270 * str.size(). 1271 * @throw std::length_error If new length exceeds @c max_size(). 1272 * 1273 * Removes the characters in the range [pos1,pos1 + n) from 1274 * this string. In place, the value of @a __str is inserted. 1275 * If @a __pos is beyond end of string, out_of_range is thrown. 1276 * If the length of the result exceeds max_size(), length_error 1277 * is thrown. The value of the string doesn't change if an 1278 * error is thrown. 1279 */ 1280 __versa_string& 1281 replace(size_type __pos1, size_type __n1, const __versa_string& __str, 1282 size_type __pos2, size_type __n2) 1283 { 1284 return this->replace(__pos1, __n1, __str._M_data() 1285 + __str._M_check(__pos2, 1286 "__versa_string::replace"), 1287 __str._M_limit(__pos2, __n2)); 1288 } 1289 1290 /** 1291 * @brief Replace characters with value of a C substring. 1292 * @param __pos Index of first character to replace. 1293 * @param __n1 Number of characters to be replaced. 1294 * @param __s C string to insert. 1295 * @param __n2 Number of characters from @a __s to use. 1296 * @return Reference to this string. 1297 * @throw std::out_of_range If @a __pos1 > size(). 1298 * @throw std::length_error If new length exceeds @c max_size(). 1299 * 1300 * Removes the characters in the range [pos,pos + n1) from this 1301 * string. In place, the first @a __n2 characters of @a __s 1302 * are inserted, or all of @a __s if @a __n2 is too large. If 1303 * @a __pos is beyond end of string, out_of_range is thrown. 1304 * If the length of result exceeds max_size(), length_error is 1305 * thrown. The value of the string doesn't change if an error 1306 * is thrown. 1307 */ 1308 __versa_string& 1309 replace(size_type __pos, size_type __n1, const _CharT* __s, 1310 size_type __n2) 1311 { 1312 __glibcxx_requires_string_len(__s, __n2); 1313 return _M_replace(_M_check(__pos, "__versa_string::replace"), 1314 _M_limit(__pos, __n1), __s, __n2); 1315 } 1316 1317 /** 1318 * @brief Replace characters with value of a C string. 1319 * @param __pos Index of first character to replace. 1320 * @param __n1 Number of characters to be replaced. 1321 * @param __s C string to insert. 1322 * @return Reference to this string. 1323 * @throw std::out_of_range If @a __pos > size(). 1324 * @throw std::length_error If new length exceeds @c max_size(). 1325 * 1326 * Removes the characters in the range [pos,pos + n1) from this 1327 * string. In place, the characters of @a __s are inserted. If 1328 * @a pos is beyond end of string, out_of_range is thrown. If 1329 * the length of result exceeds max_size(), length_error is thrown. 1330 * The value of the string doesn't change if an error is thrown. 1331 */ 1332 __versa_string& 1333 replace(size_type __pos, size_type __n1, const _CharT* __s) 1334 { 1335 __glibcxx_requires_string(__s); 1336 return this->replace(__pos, __n1, __s, traits_type::length(__s)); 1337 } 1338 1339 /** 1340 * @brief Replace characters with multiple characters. 1341 * @param __pos Index of first character to replace. 1342 * @param __n1 Number of characters to be replaced. 1343 * @param __n2 Number of characters to insert. 1344 * @param __c Character to insert. 1345 * @return Reference to this string. 1346 * @throw std::out_of_range If @a __pos > size(). 1347 * @throw std::length_error If new length exceeds @c max_size(). 1348 * 1349 * Removes the characters in the range [pos,pos + n1) from this 1350 * string. In place, @a __n2 copies of @a __c are inserted. 1351 * If @a __pos is beyond end of string, out_of_range is thrown. 1352 * If the length of result exceeds max_size(), length_error is 1353 * thrown. The value of the string doesn't change if an error 1354 * is thrown. 1355 */ 1356 __versa_string& 1357 replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) 1358 { return _M_replace_aux(_M_check(__pos, "__versa_string::replace"), 1359 _M_limit(__pos, __n1), __n2, __c); } 1360 1361 /** 1362 * @brief Replace range of characters with string. 1363 * @param __i1 Iterator referencing start of range to replace. 1364 * @param __i2 Iterator referencing end of range to replace. 1365 * @param __str String value to insert. 1366 * @return Reference to this string. 1367 * @throw std::length_error If new length exceeds @c max_size(). 1368 * 1369 * Removes the characters in the range [i1,i2). In place, the 1370 * value of @a __str is inserted. If the length of result 1371 * exceeds max_size(), length_error is thrown. The value of 1372 * the string doesn't change if an error is thrown. 1373 */ 1374 __versa_string& 1375 #if __cplusplus >= 201103L 1376 replace(const_iterator __i1, const_iterator __i2, 1377 const __versa_string& __str) 1378 #else 1379 replace(iterator __i1, iterator __i2, const __versa_string& __str) 1380 #endif 1381 { return this->replace(__i1, __i2, __str._M_data(), __str.size()); } 1382 1383 /** 1384 * @brief Replace range of characters with C substring. 1385 * @param __i1 Iterator referencing start of range to replace. 1386 * @param __i2 Iterator referencing end of range to replace. 1387 * @param __s C string value to insert. 1388 * @param __n Number of characters from s to insert. 1389 * @return Reference to this string. 1390 * @throw std::length_error If new length exceeds @c max_size(). 1391 * 1392 * Removes the characters in the range [i1,i2). In place, the 1393 * first @a n characters of @a __s are inserted. If the length 1394 * of result exceeds max_size(), length_error is thrown. The 1395 * value of the string doesn't change if an error is thrown. 1396 */ 1397 __versa_string& 1398 #if __cplusplus >= 201103L 1399 replace(const_iterator __i1, const_iterator __i2, 1400 const _CharT* __s, size_type __n) 1401 #else 1402 replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n) 1403 #endif 1404 { 1405 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 1406 && __i2 <= _M_iend()); 1407 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n); 1408 } 1409 1410 /** 1411 * @brief Replace range of characters with C string. 1412 * @param __i1 Iterator referencing start of range to replace. 1413 * @param __i2 Iterator referencing end of range to replace. 1414 * @param __s C string value to insert. 1415 * @return Reference to this string. 1416 * @throw std::length_error If new length exceeds @c max_size(). 1417 * 1418 * Removes the characters in the range [i1,i2). In place, the 1419 * characters of @a __s are inserted. If the length of result 1420 * exceeds max_size(), length_error is thrown. The value of 1421 * the string doesn't change if an error is thrown. 1422 */ 1423 __versa_string& 1424 #if __cplusplus >= 201103L 1425 replace(const_iterator __i1, const_iterator __i2, const _CharT* __s) 1426 #else 1427 replace(iterator __i1, iterator __i2, const _CharT* __s) 1428 #endif 1429 { 1430 __glibcxx_requires_string(__s); 1431 return this->replace(__i1, __i2, __s, traits_type::length(__s)); 1432 } 1433 1434 /** 1435 * @brief Replace range of characters with multiple characters 1436 * @param __i1 Iterator referencing start of range to replace. 1437 * @param __i2 Iterator referencing end of range to replace. 1438 * @param __n Number of characters to insert. 1439 * @param __c Character to insert. 1440 * @return Reference to this string. 1441 * @throw std::length_error If new length exceeds @c max_size(). 1442 * 1443 * Removes the characters in the range [i1,i2). In place, @a 1444 * __n copies of @a __c are inserted. If the length of result 1445 * exceeds max_size(), length_error is thrown. The value of 1446 * the string doesn't change if an error is thrown. 1447 */ 1448 __versa_string& 1449 #if __cplusplus >= 201103L 1450 replace(const_iterator __i1, const_iterator __i2, size_type __n, 1451 _CharT __c) 1452 #else 1453 replace(iterator __i1, iterator __i2, size_type __n, _CharT __c) 1454 #endif 1455 { 1456 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 1457 && __i2 <= _M_iend()); 1458 return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c); 1459 } 1460 1461 /** 1462 * @brief Replace range of characters with range. 1463 * @param __i1 Iterator referencing start of range to replace. 1464 * @param __i2 Iterator referencing end of range to replace. 1465 * @param __k1 Iterator referencing start of range to insert. 1466 * @param __k2 Iterator referencing end of range to insert. 1467 * @return Reference to this string. 1468 * @throw std::length_error If new length exceeds @c max_size(). 1469 * 1470 * Removes the characters in the range [i1,i2). In place, 1471 * characters in the range [k1,k2) are inserted. If the length 1472 * of result exceeds max_size(), length_error is thrown. The 1473 * value of the string doesn't change if an error is thrown. 1474 */ 1475 #if __cplusplus >= 201103L 1476 template
> 1478 __versa_string& 1479 replace(const_iterator __i1, const_iterator __i2, 1480 _InputIterator __k1, _InputIterator __k2) 1481 { 1482 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 1483 && __i2 <= _M_iend()); 1484 __glibcxx_requires_valid_range(__k1, __k2); 1485 return this->_M_replace_dispatch(__i1, __i2, __k1, __k2, 1486 std::__false_type()); 1487 } 1488 #else 1489 template
1490 __versa_string& 1491 replace(iterator __i1, iterator __i2, 1492 _InputIterator __k1, _InputIterator __k2) 1493 { 1494 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 1495 && __i2 <= _M_iend()); 1496 __glibcxx_requires_valid_range(__k1, __k2); 1497 typedef typename std::__is_integer<_InputIterator>::__type _Integral; 1498 return this->_M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral()); 1499 } 1500 #endif 1501 1502 // Specializations for the common case of pointer and iterator: 1503 // useful to avoid the overhead of temporary buffering in _M_replace. 1504 __versa_string& 1505 #if __cplusplus >= 201103L 1506 replace(const_iterator __i1, const_iterator __i2, 1507 _CharT* __k1, _CharT* __k2) 1508 #else 1509 replace(iterator __i1, iterator __i2, 1510 _CharT* __k1, _CharT* __k2) 1511 #endif 1512 { 1513 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 1514 && __i2 <= _M_iend()); 1515 __glibcxx_requires_valid_range(__k1, __k2); 1516 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, 1517 __k1, __k2 - __k1); 1518 } 1519 1520 __versa_string& 1521 #if __cplusplus >= 201103L 1522 replace(const_iterator __i1, const_iterator __i2, 1523 const _CharT* __k1, const _CharT* __k2) 1524 #else 1525 replace(iterator __i1, iterator __i2, 1526 const _CharT* __k1, const _CharT* __k2) 1527 #endif 1528 { 1529 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 1530 && __i2 <= _M_iend()); 1531 __glibcxx_requires_valid_range(__k1, __k2); 1532 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, 1533 __k1, __k2 - __k1); 1534 } 1535 1536 __versa_string& 1537 #if __cplusplus >= 201103L 1538 replace(const_iterator __i1, const_iterator __i2, 1539 iterator __k1, iterator __k2) 1540 #else 1541 replace(iterator __i1, iterator __i2, 1542 iterator __k1, iterator __k2) 1543 #endif 1544 { 1545 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 1546 && __i2 <= _M_iend()); 1547 __glibcxx_requires_valid_range(__k1, __k2); 1548 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, 1549 __k1.base(), __k2 - __k1); 1550 } 1551 1552 __versa_string& 1553 #if __cplusplus >= 201103L 1554 replace(const_iterator __i1, const_iterator __i2, 1555 const_iterator __k1, const_iterator __k2) 1556 #else 1557 replace(iterator __i1, iterator __i2, 1558 const_iterator __k1, const_iterator __k2) 1559 #endif 1560 { 1561 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 1562 && __i2 <= _M_iend()); 1563 __glibcxx_requires_valid_range(__k1, __k2); 1564 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, 1565 __k1.base(), __k2 - __k1); 1566 } 1567 1568 #if __cplusplus >= 201103L 1569 /** 1570 * @brief Replace range of characters with initializer_list. 1571 * @param __i1 Iterator referencing start of range to replace. 1572 * @param __i2 Iterator referencing end of range to replace. 1573 * @param __l The initializer_list of characters to insert. 1574 * @return Reference to this string. 1575 * @throw std::length_error If new length exceeds @c max_size(). 1576 * 1577 * Removes the characters in the range [i1,i2). In place, 1578 * characters in the range [k1,k2) are inserted. If the length 1579 * of result exceeds max_size(), length_error is thrown. The 1580 * value of the string doesn't change if an error is thrown. 1581 */ 1582 __versa_string& 1583 replace(const_iterator __i1, const_iterator __i2, 1584 std::initializer_list<_CharT> __l) 1585 { return this->replace(__i1, __i2, __l.begin(), __l.end()); } 1586 #endif // C++11 1587 1588 private: 1589 template
1590 __versa_string& 1591 _M_replace_dispatch(const_iterator __i1, const_iterator __i2, 1592 _Integer __n, _Integer __val, std::__true_type) 1593 { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); } 1594 1595 template
1596 __versa_string& 1597 _M_replace_dispatch(const_iterator __i1, const_iterator __i2, 1598 _InputIterator __k1, _InputIterator __k2, 1599 std::__false_type); 1600 1601 __versa_string& 1602 _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2, 1603 _CharT __c); 1604 1605 __versa_string& 1606 _M_replace(size_type __pos, size_type __len1, const _CharT* __s, 1607 const size_type __len2); 1608 1609 __versa_string& 1610 _M_append(const _CharT* __s, size_type __n); 1611 1612 public: 1613 1614 /** 1615 * @brief Copy substring into C string. 1616 * @param __s C string to copy value into. 1617 * @param __n Number of characters to copy. 1618 * @param __pos Index of first character to copy. 1619 * @return Number of characters actually copied 1620 * @throw std::out_of_range If pos > size(). 1621 * 1622 * Copies up to @a __n characters starting at @a __pos into the 1623 * C string @a s. If @a __pos is greater than size(), 1624 * out_of_range is thrown. 1625 */ 1626 size_type 1627 copy(_CharT* __s, size_type __n, size_type __pos = 0) const; 1628 1629 /** 1630 * @brief Swap contents with another string. 1631 * @param __s String to swap with. 1632 * 1633 * Exchanges the contents of this string with that of @a __s in 1634 * constant time. 1635 */ 1636 void 1637 swap(__versa_string& __s) _GLIBCXX_NOEXCEPT 1638 { this->_M_swap(__s); } 1639 1640 // String operations: 1641 /** 1642 * @brief Return const pointer to null-terminated contents. 1643 * 1644 * This is a handle to internal data. Do not modify or dire things may 1645 * happen. 1646 */ 1647 const _CharT* 1648 c_str() const _GLIBCXX_NOEXCEPT 1649 { return this->_M_data(); } 1650 1651 /** 1652 * @brief Return const pointer to contents. 1653 * 1654 * This is a handle to internal data. Do not modify or dire things may 1655 * happen. 1656 */ 1657 const _CharT* 1658 data() const _GLIBCXX_NOEXCEPT 1659 { return this->_M_data(); } 1660 1661 /** 1662 * @brief Return copy of allocator used to construct this string. 1663 */ 1664 allocator_type 1665 get_allocator() const _GLIBCXX_NOEXCEPT 1666 { return allocator_type(this->_M_get_allocator()); } 1667 1668 /** 1669 * @brief Find position of a C substring. 1670 * @param __s C string to locate. 1671 * @param __pos Index of character to search from. 1672 * @param __n Number of characters from @a __s to search for. 1673 * @return Index of start of first occurrence. 1674 * 1675 * Starting from @a __pos, searches forward for the first @a 1676 * __n characters in @a __s within this string. If found, 1677 * returns the index where it begins. If not found, returns 1678 * npos. 1679 */ 1680 size_type 1681 find(const _CharT* __s, size_type __pos, size_type __n) const; 1682 1683 /** 1684 * @brief Find position of a string. 1685 * @param __str String to locate. 1686 * @param __pos Index of character to search from (default 0). 1687 * @return Index of start of first occurrence. 1688 * 1689 * Starting from @a __pos, searches forward for value of @a 1690 * __str within this string. If found, returns the index where 1691 * it begins. If not found, returns npos. 1692 */ 1693 size_type 1694 find(const __versa_string& __str, size_type __pos = 0) const 1695 _GLIBCXX_NOEXCEPT 1696 { return this->find(__str.data(), __pos, __str.size()); } 1697 1698 /** 1699 * @brief Find position of a C string. 1700 * @param __s C string to locate. 1701 * @param __pos Index of character to search from (default 0). 1702 * @return Index of start of first occurrence. 1703 * 1704 * Starting from @a __pos, searches forward for the value of @a 1705 * __s within this string. If found, returns the index where 1706 * it begins. If not found, returns npos. 1707 */ 1708 size_type 1709 find(const _CharT* __s, size_type __pos = 0) const 1710 { 1711 __glibcxx_requires_string(__s); 1712 return this->find(__s, __pos, traits_type::length(__s)); 1713 } 1714 1715 /** 1716 * @brief Find position of a character. 1717 * @param __c Character to locate. 1718 * @param __pos Index of character to search from (default 0). 1719 * @return Index of first occurrence. 1720 * 1721 * Starting from @a __pos, searches forward for @a __c within 1722 * this string. If found, returns the index where it was 1723 * found. If not found, returns npos. 1724 */ 1725 size_type 1726 find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT; 1727 1728 /** 1729 * @brief Find last position of a string. 1730 * @param __str String to locate. 1731 * @param __pos Index of character to search back from (default end). 1732 * @return Index of start of last occurrence. 1733 * 1734 * Starting from @a __pos, searches backward for value of @a 1735 * __str within this string. If found, returns the index where 1736 * it begins. If not found, returns npos. 1737 */ 1738 size_type 1739 rfind(const __versa_string& __str, size_type __pos = npos) const 1740 _GLIBCXX_NOEXCEPT 1741 { return this->rfind(__str.data(), __pos, __str.size()); } 1742 1743 /** 1744 * @brief Find last position of a C substring. 1745 * @param __s C string to locate. 1746 * @param __pos Index of character to search back from. 1747 * @param __n Number of characters from s to search for. 1748 * @return Index of start of last occurrence. 1749 * 1750 * Starting from @a __pos, searches backward for the first @a 1751 * __n characters in @a __s within this string. If found, 1752 * returns the index where it begins. If not found, returns 1753 * npos. 1754 */ 1755 size_type 1756 rfind(const _CharT* __s, size_type __pos, size_type __n) const; 1757 1758 /** 1759 * @brief Find last position of a C string. 1760 * @param __s C string to locate. 1761 * @param __pos Index of character to start search at (default end). 1762 * @return Index of start of last occurrence. 1763 * 1764 * Starting from @a __pos, searches backward for the value of 1765 * @a __s within this string. If found, returns the index 1766 * where it begins. If not found, returns npos. 1767 */ 1768 size_type 1769 rfind(const _CharT* __s, size_type __pos = npos) const 1770 { 1771 __glibcxx_requires_string(__s); 1772 return this->rfind(__s, __pos, traits_type::length(__s)); 1773 } 1774 1775 /** 1776 * @brief Find last position of a character. 1777 * @param __c Character to locate. 1778 * @param __pos Index of character to search back from (default end). 1779 * @return Index of last occurrence. 1780 * 1781 * Starting from @a __pos, searches backward for @a __c within 1782 * this string. If found, returns the index where it was 1783 * found. If not found, returns npos. 1784 */ 1785 size_type 1786 rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT; 1787 1788 /** 1789 * @brief Find position of a character of string. 1790 * @param __str String containing characters to locate. 1791 * @param __pos Index of character to search from (default 0). 1792 * @return Index of first occurrence. 1793 * 1794 * Starting from @a __pos, searches forward for one of the characters of 1795 * @a __str within this string. If found, returns the index where it was 1796 * found. If not found, returns npos. 1797 */ 1798 size_type 1799 find_first_of(const __versa_string& __str, size_type __pos = 0) const 1800 _GLIBCXX_NOEXCEPT 1801 { return this->find_first_of(__str.data(), __pos, __str.size()); } 1802 1803 /** 1804 * @brief Find position of a character of C substring. 1805 * @param __s String containing characters to locate. 1806 * @param __pos Index of character to search from. 1807 * @param __n Number of characters from s to search for. 1808 * @return Index of first occurrence. 1809 * 1810 * Starting from @a __pos, searches forward for one of the 1811 * first @a __n characters of @a __s within this string. If 1812 * found, returns the index where it was found. If not found, 1813 * returns npos. 1814 */ 1815 size_type 1816 find_first_of(const _CharT* __s, size_type __pos, size_type __n) const; 1817 1818 /** 1819 * @brief Find position of a character of C string. 1820 * @param __s String containing characters to locate. 1821 * @param __pos Index of character to search from (default 0). 1822 * @return Index of first occurrence. 1823 * 1824 * Starting from @a __pos, searches forward for one of the 1825 * characters of @a __s within this string. If found, returns 1826 * the index where it was found. If not found, returns npos. 1827 */ 1828 size_type 1829 find_first_of(const _CharT* __s, size_type __pos = 0) const 1830 { 1831 __glibcxx_requires_string(__s); 1832 return this->find_first_of(__s, __pos, traits_type::length(__s)); 1833 } 1834 1835 /** 1836 * @brief Find position of a character. 1837 * @param __c Character to locate. 1838 * @param __pos Index of character to search from (default 0). 1839 * @return Index of first occurrence. 1840 * 1841 * Starting from @a __pos, searches forward for the character 1842 * @a __c within this string. If found, returns the index 1843 * where it was found. If not found, returns npos. 1844 * 1845 * Note: equivalent to find(c, pos). 1846 */ 1847 size_type 1848 find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT 1849 { return this->find(__c, __pos); } 1850 1851 /** 1852 * @brief Find last position of a character of string. 1853 * @param __str String containing characters to locate. 1854 * @param __pos Index of character to search back from (default end). 1855 * @return Index of last occurrence. 1856 * 1857 * Starting from @a __pos, searches backward for one of the 1858 * characters of @a __str within this string. If found, 1859 * returns the index where it was found. If not found, returns 1860 * npos. 1861 */ 1862 size_type 1863 find_last_of(const __versa_string& __str, size_type __pos = npos) const 1864 _GLIBCXX_NOEXCEPT 1865 { return this->find_last_of(__str.data(), __pos, __str.size()); } 1866 1867 /** 1868 * @brief Find last position of a character of C substring. 1869 * @param __s C string containing characters to locate. 1870 * @param __pos Index of character to search back from. 1871 * @param __n Number of characters from s to search for. 1872 * @return Index of last occurrence. 1873 * 1874 * Starting from @a __pos, searches backward for one of the 1875 * first @a __n characters of @a __s within this string. If 1876 * found, returns the index where it was found. If not found, 1877 * returns npos. 1878 */ 1879 size_type 1880 find_last_of(const _CharT* __s, size_type __pos, size_type __n) const; 1881 1882 /** 1883 * @brief Find last position of a character of C string. 1884 * @param __s C string containing characters to locate. 1885 * @param __pos Index of character to search back from (default end). 1886 * @return Index of last occurrence. 1887 * 1888 * Starting from @a __pos, searches backward for one of the 1889 * characters of @a __s within this string. If found, returns 1890 * the index where it was found. If not found, returns npos. 1891 */ 1892 size_type 1893 find_last_of(const _CharT* __s, size_type __pos = npos) const 1894 { 1895 __glibcxx_requires_string(__s); 1896 return this->find_last_of(__s, __pos, traits_type::length(__s)); 1897 } 1898 1899 /** 1900 * @brief Find last position of a character. 1901 * @param __c Character to locate. 1902 * @param __pos Index of character to search back from (default end). 1903 * @return Index of last occurrence. 1904 * 1905 * Starting from @a __pos, searches backward for @a __c within 1906 * this string. If found, returns the index where it was 1907 * found. If not found, returns npos. 1908 * 1909 * Note: equivalent to rfind(c, pos). 1910 */ 1911 size_type 1912 find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT 1913 { return this->rfind(__c, __pos); } 1914 1915 /** 1916 * @brief Find position of a character not in string. 1917 * @param __str String containing characters to avoid. 1918 * @param __pos Index of character to search from (default 0). 1919 * @return Index of first occurrence. 1920 * 1921 * Starting from @a __pos, searches forward for a character not 1922 * contained in @a __str within this string. If found, returns 1923 * the index where it was found. If not found, returns npos. 1924 */ 1925 size_type 1926 find_first_not_of(const __versa_string& __str, size_type __pos = 0) const 1927 _GLIBCXX_NOEXCEPT 1928 { return this->find_first_not_of(__str.data(), __pos, __str.size()); } 1929 1930 /** 1931 * @brief Find position of a character not in C substring. 1932 * @param __s C string containing characters to avoid. 1933 * @param __pos Index of character to search from. 1934 * @param __n Number of characters from s to consider. 1935 * @return Index of first occurrence. 1936 * 1937 * Starting from @a __pos, searches forward for a character not 1938 * contained in the first @a __n characters of @a __s within 1939 * this string. If found, returns the index where it was 1940 * found. If not found, returns npos. 1941 */ 1942 size_type 1943 find_first_not_of(const _CharT* __s, size_type __pos, 1944 size_type __n) const; 1945 1946 /** 1947 * @brief Find position of a character not in C string. 1948 * @param __s C string containing characters to avoid. 1949 * @param __pos Index of character to search from (default 0). 1950 * @return Index of first occurrence. 1951 * 1952 * Starting from @a __pos, searches forward for a character not 1953 * contained in @a __s within this string. If found, returns 1954 * the index where it was found. If not found, returns npos. 1955 */ 1956 size_type 1957 find_first_not_of(const _CharT* __s, size_type __pos = 0) const 1958 { 1959 __glibcxx_requires_string(__s); 1960 return this->find_first_not_of(__s, __pos, traits_type::length(__s)); 1961 } 1962 1963 /** 1964 * @brief Find position of a different character. 1965 * @param __c Character to avoid. 1966 * @param __pos Index of character to search from (default 0). 1967 * @return Index of first occurrence. 1968 * 1969 * Starting from @a __pos, searches forward for a character 1970 * other than @a __c within this string. If found, returns the 1971 * index where it was found. If not found, returns npos. 1972 */ 1973 size_type 1974 find_first_not_of(_CharT __c, size_type __pos = 0) const 1975 _GLIBCXX_NOEXCEPT; 1976 1977 /** 1978 * @brief Find last position of a character not in string. 1979 * @param __str String containing characters to avoid. 1980 * @param __pos Index of character to search back from (default end). 1981 * @return Index of last occurrence. 1982 * 1983 * Starting from @a __pos, searches backward for a character 1984 * not contained in @a __str within this string. If found, 1985 * returns the index where it was found. If not found, returns 1986 * npos. 1987 */ 1988 size_type 1989 find_last_not_of(const __versa_string& __str, 1990 size_type __pos = npos) const _GLIBCXX_NOEXCEPT 1991 { return this->find_last_not_of(__str.data(), __pos, __str.size()); } 1992 1993 /** 1994 * @brief Find last position of a character not in C substring. 1995 * @param __s C string containing characters to avoid. 1996 * @param __pos Index of character to search back from. 1997 * @param __n Number of characters from s to consider. 1998 * @return Index of last occurrence. 1999 * 2000 * Starting from @a __pos, searches backward for a character 2001 * not contained in the first @a __n characters of @a __s 2002 * within this string. If found, returns the index where it 2003 * was found. If not found, returns npos. 2004 */ 2005 size_type 2006 find_last_not_of(const _CharT* __s, size_type __pos, 2007 size_type __n) const; 2008 /** 2009 * @brief Find last position of a character not in C string. 2010 * @param __s C string containing characters to avoid. 2011 * @param __pos Index of character to search back from (default end). 2012 * @return Index of last occurrence. 2013 * 2014 * Starting from @a __pos, searches backward for a character 2015 * not contained in @a __s within this string. If found, 2016 * returns the index where it was found. If not found, returns 2017 * npos. 2018 */ 2019 size_type 2020 find_last_not_of(const _CharT* __s, size_type __pos = npos) const 2021 { 2022 __glibcxx_requires_string(__s); 2023 return this->find_last_not_of(__s, __pos, traits_type::length(__s)); 2024 } 2025 2026 /** 2027 * @brief Find last position of a different character. 2028 * @param __c Character to avoid. 2029 * @param __pos Index of character to search back from (default end). 2030 * @return Index of last occurrence. 2031 * 2032 * Starting from @a __pos, searches backward for a character 2033 * other than @a __c within this string. If found, returns the 2034 * index where it was found. If not found, returns npos. 2035 */ 2036 size_type 2037 find_last_not_of(_CharT __c, size_type __pos = npos) const 2038 _GLIBCXX_NOEXCEPT; 2039 2040 /** 2041 * @brief Get a substring. 2042 * @param __pos Index of first character (default 0). 2043 * @param __n Number of characters in substring (default remainder). 2044 * @return The new string. 2045 * @throw std::out_of_range If pos > size(). 2046 * 2047 * Construct and return a new string using the @a __n 2048 * characters starting at @a __pos. If the string is too 2049 * short, use the remainder of the characters. If @a __pos is 2050 * beyond the end of the string, out_of_range is thrown. 2051 */ 2052 __versa_string 2053 substr(size_type __pos = 0, size_type __n = npos) const 2054 { 2055 return __versa_string(*this, _M_check(__pos, "__versa_string::substr"), 2056 __n); 2057 } 2058 2059 /** 2060 * @brief Compare to a string. 2061 * @param __str String to compare against. 2062 * @return Integer < 0, 0, or > 0. 2063 * 2064 * Returns an integer < 0 if this string is ordered before @a 2065 * __str, 0 if their values are equivalent, or > 0 if this 2066 * string is ordered after @a __str. Determines the effective 2067 * length rlen of the strings to compare as the smallest of 2068 * size() and str.size(). The function then compares the two 2069 * strings by calling traits::compare(data(), str.data(),rlen). 2070 * If the result of the comparison is nonzero returns it, 2071 * otherwise the shorter one is ordered first. 2072 */ 2073 int 2074 compare(const __versa_string& __str) const 2075 { 2076 if (this->_M_compare(__str)) 2077 return 0; 2078 2079 const size_type __size = this->size(); 2080 const size_type __osize = __str.size(); 2081 const size_type __len = std::min(__size, __osize); 2082 2083 int __r = traits_type::compare(this->_M_data(), __str.data(), __len); 2084 if (!__r) 2085 __r = this->_S_compare(__size, __osize); 2086 return __r; 2087 } 2088 2089 /** 2090 * @brief Compare substring to a string. 2091 * @param __pos Index of first character of substring. 2092 * @param __n Number of characters in substring. 2093 * @param __str String to compare against. 2094 * @return Integer < 0, 0, or > 0. 2095 * 2096 * Form the substring of this string from the @a __n characters 2097 * starting at @a __pos. Returns an integer < 0 if the 2098 * substring is ordered before @a __str, 0 if their values are 2099 * equivalent, or > 0 if the substring is ordered after @a 2100 * __str. Determines the effective length rlen of the strings 2101 * to compare as the smallest of the length of the substring 2102 * and @a __str.size(). The function then compares the two 2103 * strings by calling 2104 * traits::compare(substring.data(),str.data(),rlen). If the 2105 * result of the comparison is nonzero returns it, otherwise 2106 * the shorter one is ordered first. 2107 */ 2108 int 2109 compare(size_type __pos, size_type __n, 2110 const __versa_string& __str) const; 2111 2112 /** 2113 * @brief Compare substring to a substring. 2114 * @param __pos1 Index of first character of substring. 2115 * @param __n1 Number of characters in substring. 2116 * @param __str String to compare against. 2117 * @param __pos2 Index of first character of substring of str. 2118 * @param __n2 Number of characters in substring of str. 2119 * @return Integer < 0, 0, or > 0. 2120 * 2121 * Form the substring of this string from the @a __n1 2122 * characters starting at @a __pos1. Form the substring of @a 2123 * __str from the @a __n2 characters starting at @a __pos2. 2124 * Returns an integer < 0 if this substring is ordered before 2125 * the substring of @a __str, 0 if their values are equivalent, 2126 * or > 0 if this substring is ordered after the substring of 2127 * @a __str. Determines the effective length rlen of the 2128 * strings to compare as the smallest of the lengths of the 2129 * substrings. The function then compares the two strings by 2130 * calling 2131 * traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen). 2132 * If the result of the comparison is nonzero returns it, 2133 * otherwise the shorter one is ordered first. 2134 */ 2135 int 2136 compare(size_type __pos1, size_type __n1, const __versa_string& __str, 2137 size_type __pos2, size_type __n2) const; 2138 2139 /** 2140 * @brief Compare to a C string. 2141 * @param __s C string to compare against. 2142 * @return Integer < 0, 0, or > 0. 2143 * 2144 * Returns an integer < 0 if this string is ordered before @a 2145 * __s, 0 if their values are equivalent, or > 0 if this string 2146 * is ordered after @a __s. Determines the effective length 2147 * rlen of the strings to compare as the smallest of size() and 2148 * the length of a string constructed from @a __s. The 2149 * function then compares the two strings by calling 2150 * traits::compare(data(),s,rlen). If the result of the 2151 * comparison is nonzero returns it, otherwise the shorter one 2152 * is ordered first. 2153 */ 2154 int 2155 compare(const _CharT* __s) const; 2156 2157 // _GLIBCXX_RESOLVE_LIB_DEFECTS 2158 // 5 String::compare specification questionable 2159 /** 2160 * @brief Compare substring to a C string. 2161 * @param __pos Index of first character of substring. 2162 * @param __n1 Number of characters in substring. 2163 * @param __s C string to compare against. 2164 * @return Integer < 0, 0, or > 0. 2165 * 2166 * Form the substring of this string from the @a __n1 2167 * characters starting at @a __pos. Returns an integer < 0 if 2168 * the substring is ordered before @a __s, 0 if their values 2169 * are equivalent, or > 0 if the substring is ordered after @a 2170 * __s. Determines the effective length rlen of the strings to 2171 * compare as the smallest of the length of the substring and 2172 * the length of a string constructed from @a __s. The 2173 * function then compares the two string by calling 2174 * traits::compare(substring.data(),s,rlen). If the result of 2175 * the comparison is nonzero returns it, otherwise the shorter 2176 * one is ordered first. 2177 */ 2178 int 2179 compare(size_type __pos, size_type __n1, const _CharT* __s) const; 2180 2181 /** 2182 * @brief Compare substring against a character array. 2183 * @param __pos Index of first character of substring. 2184 * @param __n1 Number of characters in substring. 2185 * @param __s character array to compare against. 2186 * @param __n2 Number of characters of s. 2187 * @return Integer < 0, 0, or > 0. 2188 * 2189 * Form the substring of this string from the @a __n1 2190 * characters starting at @a __pos. Form a string from the 2191 * first @a __n2 characters of @a __s. Returns an integer < 0 2192 * if this substring is ordered before the string from @a __s, 2193 * 0 if their values are equivalent, or > 0 if this substring 2194 * is ordered after the string from @a __s. Determines the 2195 * effective length rlen of the strings to compare as the 2196 * smallest of the length of the substring and @a __n2. The 2197 * function then compares the two strings by calling 2198 * traits::compare(substring.data(),__s,rlen). If the result of 2199 * the comparison is nonzero returns it, otherwise the shorter 2200 * one is ordered first. 2201 * 2202 * NB: __s must have at least n2 characters,
\\0
has no special 2203 * meaning. 2204 */ 2205 int 2206 compare(size_type __pos, size_type __n1, const _CharT* __s, 2207 size_type __n2) const; 2208 }; 2209 2210 // operator+ 2211 /** 2212 * @brief Concatenate two strings. 2213 * @param __lhs First string. 2214 * @param __rhs Last string. 2215 * @return New string with value of @a __lhs followed by @a __rhs. 2216 */ 2217 template
class _Base> 2219 __versa_string<_CharT, _Traits, _Alloc, _Base> 2220 operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2221 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs); 2222 2223 /** 2224 * @brief Concatenate C string and string. 2225 * @param __lhs First string. 2226 * @param __rhs Last string. 2227 * @return New string with value of @a __lhs followed by @a __rhs. 2228 */ 2229 template
class _Base> 2231 __versa_string<_CharT, _Traits, _Alloc, _Base> 2232 operator+(const _CharT* __lhs, 2233 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs); 2234 2235 /** 2236 * @brief Concatenate character and string. 2237 * @param __lhs First string. 2238 * @param __rhs Last string. 2239 * @return New string with @a __lhs followed by @a __rhs. 2240 */ 2241 template
class _Base> 2243 __versa_string<_CharT, _Traits, _Alloc, _Base> 2244 operator+(_CharT __lhs, 2245 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs); 2246 2247 /** 2248 * @brief Concatenate string and C string. 2249 * @param __lhs First string. 2250 * @param __rhs Last string. 2251 * @return New string with @a __lhs followed by @a __rhs. 2252 */ 2253 template
class _Base> 2255 __versa_string<_CharT, _Traits, _Alloc, _Base> 2256 operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2257 const _CharT* __rhs); 2258 2259 /** 2260 * @brief Concatenate string and character. 2261 * @param __lhs First string. 2262 * @param __rhs Last string. 2263 * @return New string with @a __lhs followed by @a __rhs. 2264 */ 2265 template
class _Base> 2267 __versa_string<_CharT, _Traits, _Alloc, _Base> 2268 operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2269 _CharT __rhs); 2270 2271 #if __cplusplus >= 201103L 2272 template
class _Base> 2274 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 2275 operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs, 2276 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2277 { return std::move(__lhs.append(__rhs)); } 2278 2279 template
class _Base> 2281 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 2282 operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2283 __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs) 2284 { return std::move(__rhs.insert(0, __lhs)); } 2285 2286 template
class _Base> 2288 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 2289 operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs, 2290 __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs) 2291 { 2292 const auto __size = __lhs.size() + __rhs.size(); 2293 const bool __cond = (__size > __lhs.capacity() 2294 && __size <= __rhs.capacity()); 2295 return __cond ? std::move(__rhs.insert(0, __lhs)) 2296 : std::move(__lhs.append(__rhs)); 2297 } 2298 2299 template
class _Base> 2301 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 2302 operator+(const _CharT* __lhs, 2303 __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs) 2304 { return std::move(__rhs.insert(0, __lhs)); } 2305 2306 template
class _Base> 2308 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 2309 operator+(_CharT __lhs, 2310 __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs) 2311 { return std::move(__rhs.insert(0, 1, __lhs)); } 2312 2313 template
class _Base> 2315 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 2316 operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs, 2317 const _CharT* __rhs) 2318 { return std::move(__lhs.append(__rhs)); } 2319 2320 template
class _Base> 2322 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 2323 operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs, 2324 _CharT __rhs) 2325 { return std::move(__lhs.append(1, __rhs)); } 2326 #endif 2327 2328 // operator == 2329 /** 2330 * @brief Test equivalence of two strings. 2331 * @param __lhs First string. 2332 * @param __rhs Second string. 2333 * @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise. 2334 */ 2335 template
class _Base> 2337 inline bool 2338 operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2339 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2340 { return __lhs.compare(__rhs) == 0; } 2341 2342 template
class _Base> 2344 inline typename __enable_if
::__value, bool>::__type 2345 operator==(const __versa_string<_CharT, std::char_traits<_CharT>, 2346 std::allocator<_CharT>, _Base>& __lhs, 2347 const __versa_string<_CharT, std::char_traits<_CharT>, 2348 std::allocator<_CharT>, _Base>& __rhs) 2349 { return (__lhs.size() == __rhs.size() 2350 && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(), 2351 __lhs.size())); } 2352 2353 /** 2354 * @brief Test equivalence of C string and string. 2355 * @param __lhs C string. 2356 * @param __rhs String. 2357 * @return True if @a __rhs.compare(@a __lhs) == 0. False otherwise. 2358 */ 2359 template
class _Base> 2361 inline bool 2362 operator==(const _CharT* __lhs, 2363 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2364 { return __rhs.compare(__lhs) == 0; } 2365 2366 /** 2367 * @brief Test equivalence of string and C string. 2368 * @param __lhs String. 2369 * @param __rhs C string. 2370 * @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise. 2371 */ 2372 template
class _Base> 2374 inline bool 2375 operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2376 const _CharT* __rhs) 2377 { return __lhs.compare(__rhs) == 0; } 2378 2379 // operator != 2380 /** 2381 * @brief Test difference of two strings. 2382 * @param __lhs First string. 2383 * @param __rhs Second string. 2384 * @return True if @a __lhs.compare(@a __rhs) != 0. False otherwise. 2385 */ 2386 template
class _Base> 2388 inline bool 2389 operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2390 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2391 { return !(__lhs == __rhs); } 2392 2393 /** 2394 * @brief Test difference of C string and string. 2395 * @param __lhs C string. 2396 * @param __rhs String. 2397 * @return True if @a __rhs.compare(@a __lhs) != 0. False otherwise. 2398 */ 2399 template
class _Base> 2401 inline bool 2402 operator!=(const _CharT* __lhs, 2403 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2404 { return !(__lhs == __rhs); } 2405 2406 /** 2407 * @brief Test difference of string and C string. 2408 * @param __lhs String. 2409 * @param __rhs C string. 2410 * @return True if @a __lhs.compare(@a __rhs) != 0. False otherwise. 2411 */ 2412 template
class _Base> 2414 inline bool 2415 operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2416 const _CharT* __rhs) 2417 { return !(__lhs == __rhs); } 2418 2419 // operator < 2420 /** 2421 * @brief Test if string precedes string. 2422 * @param __lhs First string. 2423 * @param __rhs Second string. 2424 * @return True if @a __lhs precedes @a __rhs. False otherwise. 2425 */ 2426 template
class _Base> 2428 inline bool 2429 operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2430 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2431 { return __lhs.compare(__rhs) < 0; } 2432 2433 /** 2434 * @brief Test if string precedes C string. 2435 * @param __lhs String. 2436 * @param __rhs C string. 2437 * @return True if @a __lhs precedes @a __rhs. False otherwise. 2438 */ 2439 template
class _Base> 2441 inline bool 2442 operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2443 const _CharT* __rhs) 2444 { return __lhs.compare(__rhs) < 0; } 2445 2446 /** 2447 * @brief Test if C string precedes string. 2448 * @param __lhs C string. 2449 * @param __rhs String. 2450 * @return True if @a __lhs precedes @a __rhs. False otherwise. 2451 */ 2452 template
class _Base> 2454 inline bool 2455 operator<(const _CharT* __lhs, 2456 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2457 { return __rhs.compare(__lhs) > 0; } 2458 2459 // operator > 2460 /** 2461 * @brief Test if string follows string. 2462 * @param __lhs First string. 2463 * @param __rhs Second string. 2464 * @return True if @a __lhs follows @a __rhs. False otherwise. 2465 */ 2466 template
class _Base> 2468 inline bool 2469 operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2470 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2471 { return __lhs.compare(__rhs) > 0; } 2472 2473 /** 2474 * @brief Test if string follows C string. 2475 * @param __lhs String. 2476 * @param __rhs C string. 2477 * @return True if @a __lhs follows @a __rhs. False otherwise. 2478 */ 2479 template
class _Base> 2481 inline bool 2482 operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2483 const _CharT* __rhs) 2484 { return __lhs.compare(__rhs) > 0; } 2485 2486 /** 2487 * @brief Test if C string follows string. 2488 * @param __lhs C string. 2489 * @param __rhs String. 2490 * @return True if @a __lhs follows @a __rhs. False otherwise. 2491 */ 2492 template
class _Base> 2494 inline bool 2495 operator>(const _CharT* __lhs, 2496 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2497 { return __rhs.compare(__lhs) < 0; } 2498 2499 // operator <= 2500 /** 2501 * @brief Test if string doesn't follow string. 2502 * @param __lhs First string. 2503 * @param __rhs Second string. 2504 * @return True if @a __lhs doesn't follow @a __rhs. False otherwise. 2505 */ 2506 template
class _Base> 2508 inline bool 2509 operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2510 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2511 { return __lhs.compare(__rhs) <= 0; } 2512 2513 /** 2514 * @brief Test if string doesn't follow C string. 2515 * @param __lhs String. 2516 * @param __rhs C string. 2517 * @return True if @a __lhs doesn't follow @a __rhs. False otherwise. 2518 */ 2519 template
class _Base> 2521 inline bool 2522 operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2523 const _CharT* __rhs) 2524 { return __lhs.compare(__rhs) <= 0; } 2525 2526 /** 2527 * @brief Test if C string doesn't follow string. 2528 * @param __lhs C string. 2529 * @param __rhs String. 2530 * @return True if @a __lhs doesn't follow @a __rhs. False otherwise. 2531 */ 2532 template
class _Base> 2534 inline bool 2535 operator<=(const _CharT* __lhs, 2536 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2537 { return __rhs.compare(__lhs) >= 0; } 2538 2539 // operator >= 2540 /** 2541 * @brief Test if string doesn't precede string. 2542 * @param __lhs First string. 2543 * @param __rhs Second string. 2544 * @return True if @a __lhs doesn't precede @a __rhs. False otherwise. 2545 */ 2546 template
class _Base> 2548 inline bool 2549 operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2550 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2551 { return __lhs.compare(__rhs) >= 0; } 2552 2553 /** 2554 * @brief Test if string doesn't precede C string. 2555 * @param __lhs String. 2556 * @param __rhs C string. 2557 * @return True if @a __lhs doesn't precede @a __rhs. False otherwise. 2558 */ 2559 template
class _Base> 2561 inline bool 2562 operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2563 const _CharT* __rhs) 2564 { return __lhs.compare(__rhs) >= 0; } 2565 2566 /** 2567 * @brief Test if C string doesn't precede string. 2568 * @param __lhs C string. 2569 * @param __rhs String. 2570 * @return True if @a __lhs doesn't precede @a __rhs. False otherwise. 2571 */ 2572 template
class _Base> 2574 inline bool 2575 operator>=(const _CharT* __lhs, 2576 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2577 { return __rhs.compare(__lhs) <= 0; } 2578 2579 /** 2580 * @brief Swap contents of two strings. 2581 * @param __lhs First string. 2582 * @param __rhs Second string. 2583 * 2584 * Exchanges the contents of @a __lhs and @a __rhs in constant time. 2585 */ 2586 template
class _Base> 2588 inline void 2589 swap(__versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 2590 __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 2591 { __lhs.swap(__rhs); } 2592 2593 _GLIBCXX_END_NAMESPACE_VERSION 2594 } // namespace 2595 2596 namespace std _GLIBCXX_VISIBILITY(default) 2597 { 2598 _GLIBCXX_BEGIN_NAMESPACE_VERSION 2599 2600 /** 2601 * @brief Read stream into a string. 2602 * @param __is Input stream. 2603 * @param __str Buffer to store into. 2604 * @return Reference to the input stream. 2605 * 2606 * Stores characters from @a __is into @a __str until whitespace is 2607 * found, the end of the stream is encountered, or str.max_size() 2608 * is reached. If is.width() is non-zero, that is the limit on the 2609 * number of characters stored into @a __str. Any previous 2610 * contents of @a __str are erased. 2611 */ 2612 template
class _Base> 2614 basic_istream<_CharT, _Traits>& 2615 operator>>(basic_istream<_CharT, _Traits>& __is, 2616 __gnu_cxx::__versa_string<_CharT, _Traits, 2617 _Alloc, _Base>& __str); 2618 2619 /** 2620 * @brief Write string to a stream. 2621 * @param __os Output stream. 2622 * @param __str String to write out. 2623 * @return Reference to the output stream. 2624 * 2625 * Output characters of @a __str into os following the same rules as for 2626 * writing a C string. 2627 */ 2628 template
class _Base> 2630 inline basic_ostream<_CharT, _Traits>& 2631 operator<<(basic_ostream<_CharT, _Traits>& __os, 2632 const __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, 2633 _Base>& __str) 2634 { 2635 // _GLIBCXX_RESOLVE_LIB_DEFECTS 2636 // 586. string inserter not a formatted function 2637 return __ostream_insert(__os, __str.data(), __str.size()); 2638 } 2639 2640 /** 2641 * @brief Read a line from stream into a string. 2642 * @param __is Input stream. 2643 * @param __str Buffer to store into. 2644 * @param __delim Character marking end of line. 2645 * @return Reference to the input stream. 2646 * 2647 * Stores characters from @a __is into @a __str until @a __delim is 2648 * found, the end of the stream is encountered, or str.max_size() 2649 * is reached. If is.width() is non-zero, that is the limit on the 2650 * number of characters stored into @a __str. Any previous 2651 * contents of @a __str are erased. If @a delim was encountered, 2652 * it is extracted but not stored into @a __str. 2653 */ 2654 template
class _Base> 2656 basic_istream<_CharT, _Traits>& 2657 getline(basic_istream<_CharT, _Traits>& __is, 2658 __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str, 2659 _CharT __delim); 2660 2661 /** 2662 * @brief Read a line from stream into a string. 2663 * @param __is Input stream. 2664 * @param __str Buffer to store into. 2665 * @return Reference to the input stream. 2666 * 2667 * Stores characters from is into @a __str until '\n' is 2668 * found, the end of the stream is encountered, or str.max_size() 2669 * is reached. If is.width() is non-zero, that is the limit on the 2670 * number of characters stored into @a __str. Any previous 2671 * contents of @a __str are erased. If end of line was 2672 * encountered, it is extracted but not stored into @a __str. 2673 */ 2674 template
class _Base> 2676 inline basic_istream<_CharT, _Traits>& 2677 getline(basic_istream<_CharT, _Traits>& __is, 2678 __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str) 2679 { return getline(__is, __str, __is.widen('\n')); } 2680 2681 _GLIBCXX_END_NAMESPACE_VERSION 2682 } // namespace 2683 2684 #if __cplusplus >= 201103L 2685 2686 #include
2687 2688 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 2689 { 2690 _GLIBCXX_BEGIN_NAMESPACE_VERSION 2691 2692 #if _GLIBCXX_USE_C99_STDLIB 2693 // 21.4 Numeric Conversions [string.conversions]. 2694 inline int 2695 stoi(const __vstring& __str, std::size_t* __idx = 0, int __base = 10) 2696 { return __gnu_cxx::__stoa
(&std::strtol, "stoi", __str.c_str(), 2697 __idx, __base); } 2698 2699 inline long 2700 stol(const __vstring& __str, std::size_t* __idx = 0, int __base = 10) 2701 { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(), 2702 __idx, __base); } 2703 2704 inline unsigned long 2705 stoul(const __vstring& __str, std::size_t* __idx = 0, int __base = 10) 2706 { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(), 2707 __idx, __base); } 2708 2709 inline long long 2710 stoll(const __vstring& __str, std::size_t* __idx = 0, int __base = 10) 2711 { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(), 2712 __idx, __base); } 2713 2714 inline unsigned long long 2715 stoull(const __vstring& __str, std::size_t* __idx, int __base = 10) 2716 { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(), 2717 __idx, __base); } 2718 2719 // NB: strtof vs strtod. 2720 inline float 2721 stof(const __vstring& __str, std::size_t* __idx = 0) 2722 { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); } 2723 2724 inline double 2725 stod(const __vstring& __str, std::size_t* __idx = 0) 2726 { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); } 2727 2728 inline long double 2729 stold(const __vstring& __str, std::size_t* __idx = 0) 2730 { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); } 2731 #endif // _GLIBCXX_USE_C99_STDLIB 2732 2733 #if _GLIBCXX_USE_C99_STDIO 2734 // NB: (v)snprintf vs sprintf. 2735 2736 // DR 1261. 2737 inline __vstring 2738 to_string(int __val) 2739 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 4 * sizeof(int), 2740 "%d", __val); } 2741 2742 inline __vstring 2743 to_string(unsigned __val) 2744 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 2745 4 * sizeof(unsigned), 2746 "%u", __val); } 2747 2748 inline __vstring 2749 to_string(long __val) 2750 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 2751 4 * sizeof(long), 2752 "%ld", __val); } 2753 2754 inline __vstring 2755 to_string(unsigned long __val) 2756 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 2757 4 * sizeof(unsigned long), 2758 "%lu", __val); } 2759 2760 2761 inline __vstring 2762 to_string(long long __val) 2763 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 2764 4 * sizeof(long long), 2765 "%lld", __val); } 2766 2767 inline __vstring 2768 to_string(unsigned long long __val) 2769 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 2770 4 * sizeof(unsigned long long), 2771 "%llu", __val); } 2772 2773 inline __vstring 2774 to_string(float __val) 2775 { 2776 const int __n = __numeric_traits
::__max_exponent10 + 20; 2777 return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n, 2778 "%f", __val); 2779 } 2780 2781 inline __vstring 2782 to_string(double __val) 2783 { 2784 const int __n = __numeric_traits
::__max_exponent10 + 20; 2785 return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n, 2786 "%f", __val); 2787 } 2788 2789 inline __vstring 2790 to_string(long double __val) 2791 { 2792 const int __n = __numeric_traits
::__max_exponent10 + 20; 2793 return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n, 2794 "%Lf", __val); 2795 } 2796 #endif // _GLIBCXX_USE_C99_STDIO 2797 2798 #if defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_WCHAR 2799 inline int 2800 stoi(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) 2801 { return __gnu_cxx::__stoa
(&std::wcstol, "stoi", __str.c_str(), 2802 __idx, __base); } 2803 2804 inline long 2805 stol(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) 2806 { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(), 2807 __idx, __base); } 2808 2809 inline unsigned long 2810 stoul(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) 2811 { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(), 2812 __idx, __base); } 2813 2814 inline long long 2815 stoll(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) 2816 { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(), 2817 __idx, __base); } 2818 2819 inline unsigned long long 2820 stoull(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) 2821 { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(), 2822 __idx, __base); } 2823 2824 // NB: wcstof vs wcstod. 2825 inline float 2826 stof(const __wvstring& __str, std::size_t* __idx = 0) 2827 { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); } 2828 2829 inline double 2830 stod(const __wvstring& __str, std::size_t* __idx = 0) 2831 { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); } 2832 2833 inline long double 2834 stold(const __wvstring& __str, std::size_t* __idx = 0) 2835 { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); } 2836 2837 #ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF 2838 // DR 1261. 2839 inline __wvstring 2840 to_wstring(int __val) 2841 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 2842 4 * sizeof(int), 2843 L"%d", __val); } 2844 2845 inline __wvstring 2846 to_wstring(unsigned __val) 2847 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 2848 4 * sizeof(unsigned), 2849 L"%u", __val); } 2850 2851 inline __wvstring 2852 to_wstring(long __val) 2853 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 2854 4 * sizeof(long), 2855 L"%ld", __val); } 2856 2857 inline __wvstring 2858 to_wstring(unsigned long __val) 2859 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 2860 4 * sizeof(unsigned long), 2861 L"%lu", __val); } 2862 2863 inline __wvstring 2864 to_wstring(long long __val) 2865 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 2866 4 * sizeof(long long), 2867 L"%lld", __val); } 2868 2869 inline __wvstring 2870 to_wstring(unsigned long long __val) 2871 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 2872 4 * sizeof(unsigned long long), 2873 L"%llu", __val); } 2874 2875 inline __wvstring 2876 to_wstring(float __val) 2877 { 2878 const int __n = __numeric_traits
::__max_exponent10 + 20; 2879 return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n, 2880 L"%f", __val); 2881 } 2882 2883 inline __wvstring 2884 to_wstring(double __val) 2885 { 2886 const int __n = __numeric_traits
::__max_exponent10 + 20; 2887 return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n, 2888 L"%f", __val); 2889 } 2890 2891 inline __wvstring 2892 to_wstring(long double __val) 2893 { 2894 const int __n = __numeric_traits
::__max_exponent10 + 20; 2895 return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n, 2896 L"%Lf", __val); 2897 } 2898 #endif // _GLIBCXX_HAVE_BROKEN_VSWPRINTF 2899 #endif // _GLIBCXX_USE_WCHAR_T && _GLIBCXX_USE_C99_WCHAR 2900 2901 _GLIBCXX_END_NAMESPACE_VERSION 2902 } // namespace 2903 2904 #endif 2905 2906 #if __cplusplus >= 201103L 2907 2908 #include
2909 2910 namespace std _GLIBCXX_VISIBILITY(default) 2911 { 2912 _GLIBCXX_BEGIN_NAMESPACE_VERSION 2913 2914 /// std::hash specialization for __vstring. 2915 template<> 2916 struct hash<__gnu_cxx::__vstring> 2917 : public __hash_base
2918 { 2919 size_t 2920 operator()(const __gnu_cxx::__vstring& __s) const noexcept 2921 { return std::_Hash_impl::hash(__s.data(), __s.length()); } 2922 }; 2923 2924 #ifdef _GLIBCXX_USE_WCHAR_T 2925 /// std::hash specialization for __wvstring. 2926 template<> 2927 struct hash<__gnu_cxx::__wvstring> 2928 : public __hash_base
2929 { 2930 size_t 2931 operator()(const __gnu_cxx::__wvstring& __s) const noexcept 2932 { return std::_Hash_impl::hash(__s.data(), 2933 __s.length() * sizeof(wchar_t)); } 2934 }; 2935 #endif 2936 2937 /// std::hash specialization for __u16vstring. 2938 template<> 2939 struct hash<__gnu_cxx::__u16vstring> 2940 : public __hash_base
2941 { 2942 size_t 2943 operator()(const __gnu_cxx::__u16vstring& __s) const noexcept 2944 { return std::_Hash_impl::hash(__s.data(), 2945 __s.length() * sizeof(char16_t)); } 2946 }; 2947 2948 /// std::hash specialization for __u32vstring. 2949 template<> 2950 struct hash<__gnu_cxx::__u32vstring> 2951 : public __hash_base
2952 { 2953 size_t 2954 operator()(const __gnu_cxx::__u32vstring& __s) const noexcept 2955 { return std::_Hash_impl::hash(__s.data(), 2956 __s.length() * sizeof(char32_t)); } 2957 }; 2958 2959 _GLIBCXX_END_NAMESPACE_VERSION 2960 } // namespace 2961 2962 #endif // C++11 2963 2964 #include
2965 2966 #endif /* _VSTRING_H */
Contact us
|
About us
|
Term of use
|
Copyright © 2000-2025 MyWebUniversity.com ™