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