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