libstdc++
|
00001 // Versatile string -*- C++ -*- 00002 00003 // Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 00004 // Free Software Foundation, Inc. 00005 // 00006 // This file is part of the GNU ISO C++ Library. This library is free 00007 // software; you can redistribute it and/or modify it under the 00008 // terms of the GNU General Public License as published by the 00009 // Free Software Foundation; either version 3, or (at your option) 00010 // any later version. 00011 00012 // This library is distributed in the hope that it will be useful, 00013 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 // GNU General Public License for more details. 00016 00017 // Under Section 7 of GPL version 3, you are granted additional 00018 // permissions described in the GCC Runtime Library Exception, version 00019 // 3.1, as published by the Free Software Foundation. 00020 00021 // You should have received a copy of the GNU General Public License and 00022 // a copy of the GCC Runtime Library Exception along with this program; 00023 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 00024 // <http://www.gnu.org/licenses/>. 00025 00026 /** @file ext/vstring.h 00027 * This file is a GNU extension to the Standard C++ Library. 00028 */ 00029 00030 #ifndef _VSTRING_H 00031 #define _VSTRING_H 1 00032 00033 #pragma GCC system_header 00034 00035 #include <initializer_list> 00036 #include <ext/vstring_util.h> 00037 #include <ext/rc_string_base.h> 00038 #include <ext/sso_string_base.h> 00039 00040 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 00041 { 00042 _GLIBCXX_BEGIN_NAMESPACE_VERSION 00043 00044 /** 00045 * @class __versa_string vstring.h 00046 * @brief Template class __versa_string. 00047 * @ingroup extensions 00048 * 00049 * Data structure managing sequences of characters and 00050 * character-like objects. 00051 */ 00052 template<typename _CharT, typename _Traits, typename _Alloc, 00053 template <typename, typename, typename> class _Base> 00054 class __versa_string 00055 : private _Base<_CharT, _Traits, _Alloc> 00056 { 00057 typedef _Base<_CharT, _Traits, _Alloc> __vstring_base; 00058 typedef typename __vstring_base::_CharT_alloc_type _CharT_alloc_type; 00059 00060 // Types: 00061 public: 00062 typedef _Traits traits_type; 00063 typedef typename _Traits::char_type value_type; 00064 typedef _Alloc allocator_type; 00065 typedef typename _CharT_alloc_type::size_type size_type; 00066 typedef typename _CharT_alloc_type::difference_type difference_type; 00067 typedef value_type& reference; 00068 typedef const value_type& const_reference; 00069 typedef typename _CharT_alloc_type::pointer pointer; 00070 typedef typename _CharT_alloc_type::const_pointer const_pointer; 00071 typedef __gnu_cxx::__normal_iterator<pointer, __versa_string> iterator; 00072 typedef __gnu_cxx::__normal_iterator<const_pointer, __versa_string> 00073 const_iterator; 00074 typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 00075 typedef std::reverse_iterator<iterator> reverse_iterator; 00076 00077 // Data Member (public): 00078 /// Value returned by various member functions when they fail. 00079 static const size_type npos = static_cast<size_type>(-1); 00080 00081 private: 00082 size_type 00083 _M_check(size_type __pos, const char* __s) const 00084 { 00085 if (__pos > this->size()) 00086 std::__throw_out_of_range(__N(__s)); 00087 return __pos; 00088 } 00089 00090 void 00091 _M_check_length(size_type __n1, size_type __n2, const char* __s) const 00092 { 00093 if (this->max_size() - (this->size() - __n1) < __n2) 00094 std::__throw_length_error(__N(__s)); 00095 } 00096 00097 // NB: _M_limit doesn't check for a bad __pos value. 00098 size_type 00099 _M_limit(size_type __pos, size_type __off) const 00100 { 00101 const bool __testoff = __off < this->size() - __pos; 00102 return __testoff ? __off : this->size() - __pos; 00103 } 00104 00105 // True if _Rep and source do not overlap. 00106 bool 00107 _M_disjunct(const _CharT* __s) const 00108 { 00109 return (std::less<const _CharT*>()(__s, this->_M_data()) 00110 || std::less<const _CharT*>()(this->_M_data() 00111 + this->size(), __s)); 00112 } 00113 00114 // For the internal use we have functions similar to `begin'/`end' 00115 // but they do not call _M_leak. 00116 iterator 00117 _M_ibegin() const 00118 { return iterator(this->_M_data()); } 00119 00120 iterator 00121 _M_iend() const 00122 { return iterator(this->_M_data() + this->_M_length()); } 00123 00124 public: 00125 // Construct/copy/destroy: 00126 // NB: We overload ctors in some cases instead of using default 00127 // arguments, per 17.4.4.4 para. 2 item 2. 00128 00129 /** 00130 * @brief Default constructor creates an empty string. 00131 */ 00132 __versa_string() 00133 : __vstring_base() { } 00134 00135 /** 00136 * @brief Construct an empty string using allocator @a a. 00137 */ 00138 explicit 00139 __versa_string(const _Alloc& __a) 00140 : __vstring_base(__a) { } 00141 00142 // NB: per LWG issue 42, semantics different from IS: 00143 /** 00144 * @brief Construct string with copy of value of @a str. 00145 * @param __str Source string. 00146 */ 00147 __versa_string(const __versa_string& __str) 00148 : __vstring_base(__str) { } 00149 00150 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00151 /** 00152 * @brief String move constructor. 00153 * @param __str Source string. 00154 * 00155 * The newly-constructed %string contains the exact contents of 00156 * @a str. The contents of @a str are a valid, but unspecified 00157 * string. 00158 */ 00159 __versa_string(__versa_string&& __str) 00160 : __vstring_base(std::move(__str)) { } 00161 00162 /** 00163 * @brief Construct string from an initializer list. 00164 * @param __l std::initializer_list of characters. 00165 * @param __a Allocator to use (default is default allocator). 00166 */ 00167 __versa_string(std::initializer_list<_CharT> __l, 00168 const _Alloc& __a = _Alloc()) 00169 : __vstring_base(__l.begin(), __l.end(), __a) { } 00170 #endif 00171 00172 /** 00173 * @brief Construct string as copy of a substring. 00174 * @param __str Source string. 00175 * @param __pos Index of first character to copy from. 00176 * @param __n Number of characters to copy (default remainder). 00177 */ 00178 __versa_string(const __versa_string& __str, size_type __pos, 00179 size_type __n = npos) 00180 : __vstring_base(__str._M_data() 00181 + __str._M_check(__pos, 00182 "__versa_string::__versa_string"), 00183 __str._M_data() + __str._M_limit(__pos, __n) 00184 + __pos, _Alloc()) { } 00185 00186 /** 00187 * @brief Construct string as copy of a substring. 00188 * @param __str Source string. 00189 * @param __pos Index of first character to copy from. 00190 * @param __n Number of characters to copy. 00191 * @param __a Allocator to use. 00192 */ 00193 __versa_string(const __versa_string& __str, size_type __pos, 00194 size_type __n, const _Alloc& __a) 00195 : __vstring_base(__str._M_data() 00196 + __str._M_check(__pos, 00197 "__versa_string::__versa_string"), 00198 __str._M_data() + __str._M_limit(__pos, __n) 00199 + __pos, __a) { } 00200 00201 /** 00202 * @brief Construct string initialized by a character array. 00203 * @param __s Source character array. 00204 * @param __n Number of characters to copy. 00205 * @param __a Allocator to use (default is default allocator). 00206 * 00207 * NB: @a __s must have at least @a __n characters, '\\0' has no special 00208 * meaning. 00209 */ 00210 __versa_string(const _CharT* __s, size_type __n, 00211 const _Alloc& __a = _Alloc()) 00212 : __vstring_base(__s, __s + __n, __a) { } 00213 00214 /** 00215 * @brief Construct string as copy of a C string. 00216 * @param __s Source C string. 00217 * @param __a Allocator to use (default is default allocator). 00218 */ 00219 __versa_string(const _CharT* __s, const _Alloc& __a = _Alloc()) 00220 : __vstring_base(__s, __s ? __s + traits_type::length(__s) : 00221 __s + npos, __a) { } 00222 00223 /** 00224 * @brief Construct string as multiple characters. 00225 * @param __n Number of characters. 00226 * @param __c Character to use. 00227 * @param __a Allocator to use (default is default allocator). 00228 */ 00229 __versa_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc()) 00230 : __vstring_base(__n, __c, __a) { } 00231 00232 /** 00233 * @brief Construct string as copy of a range. 00234 * @param __beg Start of range. 00235 * @param __end End of range. 00236 * @param __a Allocator to use (default is default allocator). 00237 */ 00238 template<class _InputIterator> 00239 __versa_string(_InputIterator __beg, _InputIterator __end, 00240 const _Alloc& __a = _Alloc()) 00241 : __vstring_base(__beg, __end, __a) { } 00242 00243 /** 00244 * @brief Destroy the string instance. 00245 */ 00246 ~__versa_string() { } 00247 00248 /** 00249 * @brief Assign the value of @a str to this string. 00250 * @param __str Source string. 00251 */ 00252 __versa_string& 00253 operator=(const __versa_string& __str) 00254 { return this->assign(__str); } 00255 00256 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00257 /** 00258 * @brief String move assignment operator. 00259 * @param __str Source string. 00260 * 00261 * The contents of @a __str are moved into this string (without 00262 * copying). @a __str is a valid, but unspecified string. 00263 */ 00264 __versa_string& 00265 operator=(__versa_string&& __str) 00266 { 00267 // NB: DR 1204. 00268 this->swap(__str); 00269 return *this; 00270 } 00271 00272 /** 00273 * @brief Set value to string constructed from initializer list. 00274 * @param __l std::initializer_list. 00275 */ 00276 __versa_string& 00277 operator=(std::initializer_list<_CharT> __l) 00278 { 00279 this->assign(__l.begin(), __l.end()); 00280 return *this; 00281 } 00282 #endif 00283 00284 /** 00285 * @brief Copy contents of @a __s into this string. 00286 * @param __s Source null-terminated string. 00287 */ 00288 __versa_string& 00289 operator=(const _CharT* __s) 00290 { return this->assign(__s); } 00291 00292 /** 00293 * @brief Set value to string of length 1. 00294 * @param __c Source character. 00295 * 00296 * Assigning to a character makes this string length 1 and 00297 * (*this)[0] == @a __c. 00298 */ 00299 __versa_string& 00300 operator=(_CharT __c) 00301 { 00302 this->assign(1, __c); 00303 return *this; 00304 } 00305 00306 // Iterators: 00307 /** 00308 * Returns a read/write iterator that points to the first character in 00309 * the %string. Unshares the string. 00310 */ 00311 iterator 00312 begin() 00313 { 00314 this->_M_leak(); 00315 return iterator(this->_M_data()); 00316 } 00317 00318 /** 00319 * Returns a read-only (constant) iterator that points to the first 00320 * character in the %string. 00321 */ 00322 const_iterator 00323 begin() const 00324 { return const_iterator(this->_M_data()); } 00325 00326 /** 00327 * Returns a read/write iterator that points one past the last 00328 * character in the %string. Unshares the string. 00329 */ 00330 iterator 00331 end() 00332 { 00333 this->_M_leak(); 00334 return iterator(this->_M_data() + this->size()); 00335 } 00336 00337 /** 00338 * Returns a read-only (constant) iterator that points one past the 00339 * last character in the %string. 00340 */ 00341 const_iterator 00342 end() const 00343 { return const_iterator(this->_M_data() + this->size()); } 00344 00345 /** 00346 * Returns a read/write reverse iterator that points to the last 00347 * character in the %string. Iteration is done in reverse element 00348 * order. Unshares the string. 00349 */ 00350 reverse_iterator 00351 rbegin() 00352 { return reverse_iterator(this->end()); } 00353 00354 /** 00355 * Returns a read-only (constant) reverse iterator that points 00356 * to the last character in the %string. Iteration is done in 00357 * reverse element order. 00358 */ 00359 const_reverse_iterator 00360 rbegin() const 00361 { return const_reverse_iterator(this->end()); } 00362 00363 /** 00364 * Returns a read/write reverse iterator that points to one before the 00365 * first character in the %string. Iteration is done in reverse 00366 * element order. Unshares the string. 00367 */ 00368 reverse_iterator 00369 rend() 00370 { return reverse_iterator(this->begin()); } 00371 00372 /** 00373 * Returns a read-only (constant) reverse iterator that points 00374 * to one before the first character in the %string. Iteration 00375 * is done in reverse element order. 00376 */ 00377 const_reverse_iterator 00378 rend() const 00379 { return const_reverse_iterator(this->begin()); } 00380 00381 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00382 /** 00383 * Returns a read-only (constant) iterator that points to the first 00384 * character in the %string. 00385 */ 00386 const_iterator 00387 cbegin() const 00388 { return const_iterator(this->_M_data()); } 00389 00390 /** 00391 * Returns a read-only (constant) iterator that points one past the 00392 * last character in the %string. 00393 */ 00394 const_iterator 00395 cend() const 00396 { return const_iterator(this->_M_data() + this->size()); } 00397 00398 /** 00399 * Returns a read-only (constant) reverse iterator that points 00400 * to the last character in the %string. Iteration is done in 00401 * reverse element order. 00402 */ 00403 const_reverse_iterator 00404 crbegin() const 00405 { return const_reverse_iterator(this->end()); } 00406 00407 /** 00408 * Returns a read-only (constant) reverse iterator that points 00409 * to one before the first character in the %string. Iteration 00410 * is done in reverse element order. 00411 */ 00412 const_reverse_iterator 00413 crend() const 00414 { return const_reverse_iterator(this->begin()); } 00415 #endif 00416 00417 public: 00418 // Capacity: 00419 /// Returns the number of characters in the string, not including any 00420 /// null-termination. 00421 size_type 00422 size() const 00423 { return this->_M_length(); } 00424 00425 /// Returns the number of characters in the string, not including any 00426 /// null-termination. 00427 size_type 00428 length() const 00429 { return this->_M_length(); } 00430 00431 /// Returns the size() of the largest possible %string. 00432 size_type 00433 max_size() const 00434 { return this->_M_max_size(); } 00435 00436 /** 00437 * @brief Resizes the %string to the specified number of characters. 00438 * @param __n Number of characters the %string should contain. 00439 * @param __c Character to fill any new elements. 00440 * 00441 * This function will %resize the %string to the specified 00442 * number of characters. If the number is smaller than the 00443 * %string's current size the %string is truncated, otherwise 00444 * the %string is extended and new elements are set to @a __c. 00445 */ 00446 void 00447 resize(size_type __n, _CharT __c); 00448 00449 /** 00450 * @brief Resizes the %string to the specified number of characters. 00451 * @param __n Number of characters the %string should contain. 00452 * 00453 * This function will resize the %string to the specified 00454 * length. If the new size is smaller than the %string's 00455 * current size the %string is truncated, otherwise the %string 00456 * is extended and new characters are default-constructed. For 00457 * basic types such as char, this means setting them to 0. 00458 */ 00459 void 00460 resize(size_type __n) 00461 { this->resize(__n, _CharT()); } 00462 00463 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00464 /// A non-binding request to reduce capacity() to size(). 00465 void 00466 shrink_to_fit() 00467 { 00468 __try 00469 { this->reserve(0); } 00470 __catch(...) 00471 { } 00472 } 00473 #endif 00474 00475 /** 00476 * Returns the total number of characters that the %string can 00477 * hold before needing to allocate more memory. 00478 */ 00479 size_type 00480 capacity() const 00481 { return this->_M_capacity(); } 00482 00483 /** 00484 * @brief Attempt to preallocate enough memory for specified number of 00485 * characters. 00486 * @param __res_arg Number of characters required. 00487 * @throw std::length_error If @a __res_arg exceeds @c max_size(). 00488 * 00489 * This function attempts to reserve enough memory for the 00490 * %string to hold the specified number of characters. If the 00491 * number requested is more than max_size(), length_error is 00492 * thrown. 00493 * 00494 * The advantage of this function is that if optimal code is a 00495 * necessity and the user can determine the string length that 00496 * will be required, the user can reserve the memory in 00497 * %advance, and thus prevent a possible reallocation of memory 00498 * and copying of %string data. 00499 */ 00500 void 00501 reserve(size_type __res_arg = 0) 00502 { this->_M_reserve(__res_arg); } 00503 00504 /** 00505 * Erases the string, making it empty. 00506 */ 00507 void 00508 clear() 00509 { this->_M_clear(); } 00510 00511 /** 00512 * Returns true if the %string is empty. Equivalent to 00513 * <code>*this == ""</code>. 00514 */ 00515 bool 00516 empty() const 00517 { return this->size() == 0; } 00518 00519 // Element access: 00520 /** 00521 * @brief Subscript access to the data contained in the %string. 00522 * @param __pos The index of the character to access. 00523 * @return Read-only (constant) reference to the character. 00524 * 00525 * This operator allows for easy, array-style, data access. 00526 * Note that data access with this operator is unchecked and 00527 * out_of_range lookups are not defined. (For checked lookups 00528 * see at().) 00529 */ 00530 const_reference 00531 operator[] (size_type __pos) const 00532 { 00533 _GLIBCXX_DEBUG_ASSERT(__pos <= this->size()); 00534 return this->_M_data()[__pos]; 00535 } 00536 00537 /** 00538 * @brief Subscript access to the data contained in the %string. 00539 * @param __pos The index of the character to access. 00540 * @return Read/write reference to the character. 00541 * 00542 * This operator allows for easy, array-style, data access. 00543 * Note that data access with this operator is unchecked and 00544 * out_of_range lookups are not defined. (For checked lookups 00545 * see at().) Unshares the string. 00546 */ 00547 reference 00548 operator[](size_type __pos) 00549 { 00550 // allow pos == size() as v3 extension: 00551 _GLIBCXX_DEBUG_ASSERT(__pos <= this->size()); 00552 // but be strict in pedantic mode: 00553 _GLIBCXX_DEBUG_PEDASSERT(__pos < this->size()); 00554 this->_M_leak(); 00555 return this->_M_data()[__pos]; 00556 } 00557 00558 /** 00559 * @brief Provides access to the data contained in the %string. 00560 * @param __n The index of the character to access. 00561 * @return Read-only (const) reference to the character. 00562 * @throw std::out_of_range If @a __n is an invalid index. 00563 * 00564 * This function provides for safer data access. The parameter 00565 * is first checked that it is in the range of the string. The 00566 * function throws out_of_range if the check fails. 00567 */ 00568 const_reference 00569 at(size_type __n) const 00570 { 00571 if (__n >= this->size()) 00572 std::__throw_out_of_range(__N("__versa_string::at")); 00573 return this->_M_data()[__n]; 00574 } 00575 00576 /** 00577 * @brief Provides access to the data contained in the %string. 00578 * @param __n The index of the character to access. 00579 * @return Read/write reference to the character. 00580 * @throw std::out_of_range If @a __n is an invalid index. 00581 * 00582 * This function provides for safer data access. The parameter 00583 * is first checked that it is in the range of the string. The 00584 * function throws out_of_range if the check fails. Success 00585 * results in unsharing the string. 00586 */ 00587 reference 00588 at(size_type __n) 00589 { 00590 if (__n >= this->size()) 00591 std::__throw_out_of_range(__N("__versa_string::at")); 00592 this->_M_leak(); 00593 return this->_M_data()[__n]; 00594 } 00595 00596 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00597 /** 00598 * Returns a read/write reference to the data at the first 00599 * element of the %string. 00600 */ 00601 reference 00602 front() 00603 { return operator[](0); } 00604 00605 /** 00606 * Returns a read-only (constant) reference to the data at the first 00607 * element of the %string. 00608 */ 00609 const_reference 00610 front() const 00611 { return operator[](0); } 00612 00613 /** 00614 * Returns a read/write reference to the data at the last 00615 * element of the %string. 00616 */ 00617 reference 00618 back() 00619 { return operator[](this->size() - 1); } 00620 00621 /** 00622 * Returns a read-only (constant) reference to the data at the 00623 * last element of the %string. 00624 */ 00625 const_reference 00626 back() const 00627 { return operator[](this->size() - 1); } 00628 #endif 00629 00630 // Modifiers: 00631 /** 00632 * @brief Append a string to this string. 00633 * @param __str The string to append. 00634 * @return Reference to this string. 00635 */ 00636 __versa_string& 00637 operator+=(const __versa_string& __str) 00638 { return this->append(__str); } 00639 00640 /** 00641 * @brief Append a C string. 00642 * @param __s The C string to append. 00643 * @return Reference to this string. 00644 */ 00645 __versa_string& 00646 operator+=(const _CharT* __s) 00647 { return this->append(__s); } 00648 00649 /** 00650 * @brief Append a character. 00651 * @param __c The character to append. 00652 * @return Reference to this string. 00653 */ 00654 __versa_string& 00655 operator+=(_CharT __c) 00656 { 00657 this->push_back(__c); 00658 return *this; 00659 } 00660 00661 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00662 /** 00663 * @brief Append an initializer_list of characters. 00664 * @param __l The initializer_list of characters to be appended. 00665 * @return Reference to this string. 00666 */ 00667 __versa_string& 00668 operator+=(std::initializer_list<_CharT> __l) 00669 { return this->append(__l.begin(), __l.end()); } 00670 #endif // __GXX_EXPERIMENTAL_CXX0X__ 00671 00672 /** 00673 * @brief Append a string to this string. 00674 * @param __str The string to append. 00675 * @return Reference to this string. 00676 */ 00677 __versa_string& 00678 append(const __versa_string& __str) 00679 { return _M_append(__str._M_data(), __str.size()); } 00680 00681 /** 00682 * @brief Append a substring. 00683 * @param __str The string to append. 00684 * @param __pos Index of the first character of str to append. 00685 * @param __n The number of characters to append. 00686 * @return Reference to this string. 00687 * @throw std::out_of_range if @a pos is not a valid index. 00688 * 00689 * This function appends @a __n characters from @a __str 00690 * starting at @a __pos to this string. If @a __n is is larger 00691 * than the number of available characters in @a __str, the 00692 * remainder of @a __str is appended. 00693 */ 00694 __versa_string& 00695 append(const __versa_string& __str, size_type __pos, size_type __n) 00696 { return _M_append(__str._M_data() 00697 + __str._M_check(__pos, "__versa_string::append"), 00698 __str._M_limit(__pos, __n)); } 00699 00700 /** 00701 * @brief Append a C substring. 00702 * @param __s The C string to append. 00703 * @param __n The number of characters to append. 00704 * @return Reference to this string. 00705 */ 00706 __versa_string& 00707 append(const _CharT* __s, size_type __n) 00708 { 00709 __glibcxx_requires_string_len(__s, __n); 00710 _M_check_length(size_type(0), __n, "__versa_string::append"); 00711 return _M_append(__s, __n); 00712 } 00713 00714 /** 00715 * @brief Append a C string. 00716 * @param __s The C string to append. 00717 * @return Reference to this string. 00718 */ 00719 __versa_string& 00720 append(const _CharT* __s) 00721 { 00722 __glibcxx_requires_string(__s); 00723 const size_type __n = traits_type::length(__s); 00724 _M_check_length(size_type(0), __n, "__versa_string::append"); 00725 return _M_append(__s, __n); 00726 } 00727 00728 /** 00729 * @brief Append multiple characters. 00730 * @param __n The number of characters to append. 00731 * @param __c The character to use. 00732 * @return Reference to this string. 00733 * 00734 * Appends n copies of c to this string. 00735 */ 00736 __versa_string& 00737 append(size_type __n, _CharT __c) 00738 { return _M_replace_aux(this->size(), size_type(0), __n, __c); } 00739 00740 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00741 /** 00742 * @brief Append an initializer_list of characters. 00743 * @param __l The initializer_list of characters to append. 00744 * @return Reference to this string. 00745 */ 00746 __versa_string& 00747 append(std::initializer_list<_CharT> __l) 00748 { return this->append(__l.begin(), __l.end()); } 00749 #endif // __GXX_EXPERIMENTAL_CXX0X__ 00750 00751 /** 00752 * @brief Append a range of characters. 00753 * @param __first Iterator referencing the first character to append. 00754 * @param __last Iterator marking the end of the range. 00755 * @return Reference to this string. 00756 * 00757 * Appends characters in the range [first,last) to this string. 00758 */ 00759 template<class _InputIterator> 00760 __versa_string& 00761 append(_InputIterator __first, _InputIterator __last) 00762 { return this->replace(_M_iend(), _M_iend(), __first, __last); } 00763 00764 /** 00765 * @brief Append a single character. 00766 * @param __c Character to append. 00767 */ 00768 void 00769 push_back(_CharT __c) 00770 { 00771 const size_type __size = this->size(); 00772 if (__size + 1 > this->capacity() || this->_M_is_shared()) 00773 this->_M_mutate(__size, size_type(0), 0, size_type(1)); 00774 traits_type::assign(this->_M_data()[__size], __c); 00775 this->_M_set_length(__size + 1); 00776 } 00777 00778 /** 00779 * @brief Set value to contents of another string. 00780 * @param __str Source string to use. 00781 * @return Reference to this string. 00782 */ 00783 __versa_string& 00784 assign(const __versa_string& __str) 00785 { 00786 this->_M_assign(__str); 00787 return *this; 00788 } 00789 00790 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00791 /** 00792 * @brief Set value to contents of another string. 00793 * @param __str Source string to use. 00794 * @return Reference to this string. 00795 * 00796 * This function sets this string to the exact contents of @a __str. 00797 * @a __str is a valid, but unspecified string. 00798 */ 00799 __versa_string& 00800 assign(__versa_string&& __str) 00801 { 00802 this->swap(__str); 00803 return *this; 00804 } 00805 #endif // __GXX_EXPERIMENTAL_CXX0X__ 00806 00807 /** 00808 * @brief Set value to a substring of a string. 00809 * @param __str The string to use. 00810 * @param __pos Index of the first character of str. 00811 * @param __n Number of characters to use. 00812 * @return Reference to this string. 00813 * @throw std::out_of_range if @a __pos is not a valid index. 00814 * 00815 * This function sets this string to the substring of @a __str 00816 * consisting of @a __n characters at @a __pos. If @a __n is 00817 * is larger than the number of available characters in @a 00818 * __str, the remainder of @a __str is used. 00819 */ 00820 __versa_string& 00821 assign(const __versa_string& __str, size_type __pos, size_type __n) 00822 { return _M_replace(size_type(0), this->size(), __str._M_data() 00823 + __str._M_check(__pos, "__versa_string::assign"), 00824 __str._M_limit(__pos, __n)); } 00825 00826 /** 00827 * @brief Set value to a C substring. 00828 * @param __s The C string to use. 00829 * @param __n Number of characters to use. 00830 * @return Reference to this string. 00831 * 00832 * This function sets the value of this string to the first @a 00833 * __n characters of @a __s. If @a __n is is larger than the 00834 * number of available characters in @a __s, the remainder of 00835 * @a __s is used. 00836 */ 00837 __versa_string& 00838 assign(const _CharT* __s, size_type __n) 00839 { 00840 __glibcxx_requires_string_len(__s, __n); 00841 return _M_replace(size_type(0), this->size(), __s, __n); 00842 } 00843 00844 /** 00845 * @brief Set value to contents of a C string. 00846 * @param __s The C string to use. 00847 * @return Reference to this string. 00848 * 00849 * This function sets the value of this string to the value of 00850 * @a __s. The data is copied, so there is no dependence on @a 00851 * __s once the function returns. 00852 */ 00853 __versa_string& 00854 assign(const _CharT* __s) 00855 { 00856 __glibcxx_requires_string(__s); 00857 return _M_replace(size_type(0), this->size(), __s, 00858 traits_type::length(__s)); 00859 } 00860 00861 /** 00862 * @brief Set value to multiple characters. 00863 * @param __n Length of the resulting string. 00864 * @param __c The character to use. 00865 * @return Reference to this string. 00866 * 00867 * This function sets the value of this string to @a __n copies of 00868 * character @a __c. 00869 */ 00870 __versa_string& 00871 assign(size_type __n, _CharT __c) 00872 { return _M_replace_aux(size_type(0), this->size(), __n, __c); } 00873 00874 /** 00875 * @brief Set value to a range of characters. 00876 * @param __first Iterator referencing the first character to append. 00877 * @param __last Iterator marking the end of the range. 00878 * @return Reference to this string. 00879 * 00880 * Sets value of string to characters in the range 00881 * [first,last). 00882 */ 00883 template<class _InputIterator> 00884 __versa_string& 00885 assign(_InputIterator __first, _InputIterator __last) 00886 { return this->replace(_M_ibegin(), _M_iend(), __first, __last); } 00887 00888 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00889 /** 00890 * @brief Set value to an initializer_list of characters. 00891 * @param __l The initializer_list of characters to assign. 00892 * @return Reference to this string. 00893 */ 00894 __versa_string& 00895 assign(std::initializer_list<_CharT> __l) 00896 { return this->assign(__l.begin(), __l.end()); } 00897 #endif // __GXX_EXPERIMENTAL_CXX0X__ 00898 00899 /** 00900 * @brief Insert multiple characters. 00901 * @param __p Iterator referencing location in string to insert at. 00902 * @param __n Number of characters to insert 00903 * @param __c The character to insert. 00904 * @throw std::length_error If new length exceeds @c max_size(). 00905 * 00906 * Inserts @a __n copies of character @a __c starting at the 00907 * position referenced by iterator @a __p. If adding 00908 * characters causes the length to exceed max_size(), 00909 * length_error is thrown. The value of the string doesn't 00910 * change if an error is thrown. 00911 */ 00912 void 00913 insert(iterator __p, size_type __n, _CharT __c) 00914 { this->replace(__p, __p, __n, __c); } 00915 00916 /** 00917 * @brief Insert a range of characters. 00918 * @param __p Iterator referencing location in string to insert at. 00919 * @param __beg Start of range. 00920 * @param __end End of range. 00921 * @throw std::length_error If new length exceeds @c max_size(). 00922 * 00923 * Inserts characters in range [beg,end). If adding characters 00924 * causes the length to exceed max_size(), length_error is 00925 * thrown. The value of the string doesn't change if an error 00926 * is thrown. 00927 */ 00928 template<class _InputIterator> 00929 void 00930 insert(iterator __p, _InputIterator __beg, _InputIterator __end) 00931 { this->replace(__p, __p, __beg, __end); } 00932 00933 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00934 /** 00935 * @brief Insert an initializer_list of characters. 00936 * @param __p Iterator referencing location in string to insert at. 00937 * @param __l The initializer_list of characters to insert. 00938 * @throw std::length_error If new length exceeds @c max_size(). 00939 */ 00940 void 00941 insert(iterator __p, std::initializer_list<_CharT> __l) 00942 { this->insert(__p, __l.begin(), __l.end()); } 00943 #endif // __GXX_EXPERIMENTAL_CXX0X__ 00944 00945 /** 00946 * @brief Insert value of a string. 00947 * @param __pos1 Iterator referencing location in string to insert at. 00948 * @param __str The string to insert. 00949 * @return Reference to this string. 00950 * @throw std::length_error If new length exceeds @c max_size(). 00951 * 00952 * Inserts value of @a __str starting at @a __pos1. If adding 00953 * characters causes the length to exceed max_size(), 00954 * length_error is thrown. The value of the string doesn't 00955 * change if an error is thrown. 00956 */ 00957 __versa_string& 00958 insert(size_type __pos1, const __versa_string& __str) 00959 { return this->replace(__pos1, size_type(0), 00960 __str._M_data(), __str.size()); } 00961 00962 /** 00963 * @brief Insert a substring. 00964 * @param __pos1 Iterator referencing location in string to insert at. 00965 * @param __str The string to insert. 00966 * @param __pos2 Start of characters in str to insert. 00967 * @param __n Number of characters to insert. 00968 * @return Reference to this string. 00969 * @throw std::length_error If new length exceeds @c max_size(). 00970 * @throw std::out_of_range If @a __pos1 > size() or 00971 * @a __pos2 > @a __str.size(). 00972 * 00973 * Starting at @a __pos1, insert @a __n character of @a __str 00974 * beginning with @a __pos2. If adding characters causes the 00975 * length to exceed max_size(), length_error is thrown. If @a 00976 * __pos1 is beyond the end of this string or @a __pos2 is 00977 * beyond the end of @a __str, out_of_range is thrown. The 00978 * value of the string doesn't change if an error is thrown. 00979 */ 00980 __versa_string& 00981 insert(size_type __pos1, const __versa_string& __str, 00982 size_type __pos2, size_type __n) 00983 { return this->replace(__pos1, size_type(0), __str._M_data() 00984 + __str._M_check(__pos2, "__versa_string::insert"), 00985 __str._M_limit(__pos2, __n)); } 00986 00987 /** 00988 * @brief Insert a C substring. 00989 * @param __pos Iterator referencing location in string to insert at. 00990 * @param __s The C string to insert. 00991 * @param __n The number of characters to insert. 00992 * @return Reference to this string. 00993 * @throw std::length_error If new length exceeds @c max_size(). 00994 * @throw std::out_of_range If @a __pos is beyond the end of this 00995 * string. 00996 * 00997 * Inserts the first @a __n characters of @a __s starting at @a 00998 * __pos. If adding characters causes the length to exceed 00999 * max_size(), length_error is thrown. If @a __pos is beyond 01000 * end(), out_of_range is thrown. The value of the string 01001 * doesn't change if an error is thrown. 01002 */ 01003 __versa_string& 01004 insert(size_type __pos, const _CharT* __s, size_type __n) 01005 { return this->replace(__pos, size_type(0), __s, __n); } 01006 01007 /** 01008 * @brief Insert a C string. 01009 * @param __pos Iterator referencing location in string to insert at. 01010 * @param __s The C string to insert. 01011 * @return Reference to this string. 01012 * @throw std::length_error If new length exceeds @c max_size(). 01013 * @throw std::out_of_range If @a __pos is beyond the end of this 01014 * string. 01015 * 01016 * Inserts the first @a __n characters of @a __s starting at @a 01017 * __pos. If adding characters causes the length to exceed 01018 * max_size(), length_error is thrown. If @a __pos is beyond 01019 * end(), out_of_range is thrown. The value of the string 01020 * doesn't change if an error is thrown. 01021 */ 01022 __versa_string& 01023 insert(size_type __pos, const _CharT* __s) 01024 { 01025 __glibcxx_requires_string(__s); 01026 return this->replace(__pos, size_type(0), __s, 01027 traits_type::length(__s)); 01028 } 01029 01030 /** 01031 * @brief Insert multiple characters. 01032 * @param __pos Index in string to insert at. 01033 * @param __n Number of characters to insert 01034 * @param __c The character to insert. 01035 * @return Reference to this string. 01036 * @throw std::length_error If new length exceeds @c max_size(). 01037 * @throw std::out_of_range If @a __pos is beyond the end of this 01038 * string. 01039 * 01040 * Inserts @a __n copies of character @a __c starting at index 01041 * @a __pos. If adding characters causes the length to exceed 01042 * max_size(), length_error is thrown. If @a __pos > length(), 01043 * out_of_range is thrown. The value of the string doesn't 01044 * change if an error is thrown. 01045 */ 01046 __versa_string& 01047 insert(size_type __pos, size_type __n, _CharT __c) 01048 { return _M_replace_aux(_M_check(__pos, "__versa_string::insert"), 01049 size_type(0), __n, __c); } 01050 01051 /** 01052 * @brief Insert one character. 01053 * @param __p Iterator referencing position in string to insert at. 01054 * @param __c The character to insert. 01055 * @return Iterator referencing newly inserted char. 01056 * @throw std::length_error If new length exceeds @c max_size(). 01057 * 01058 * Inserts character @a __c at position referenced by @a __p. 01059 * If adding character causes the length to exceed max_size(), 01060 * length_error is thrown. If @a __p is beyond end of string, 01061 * out_of_range is thrown. The value of the string doesn't 01062 * change if an error is thrown. 01063 */ 01064 iterator 01065 insert(iterator __p, _CharT __c) 01066 { 01067 _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend()); 01068 const size_type __pos = __p - _M_ibegin(); 01069 _M_replace_aux(__pos, size_type(0), size_type(1), __c); 01070 this->_M_set_leaked(); 01071 return iterator(this->_M_data() + __pos); 01072 } 01073 01074 /** 01075 * @brief Remove characters. 01076 * @param __pos Index of first character to remove (default 0). 01077 * @param __n Number of characters to remove (default remainder). 01078 * @return Reference to this string. 01079 * @throw std::out_of_range If @a __pos is beyond the end of this 01080 * string. 01081 * 01082 * Removes @a __n characters from this string starting at @a 01083 * __pos. The length of the string is reduced by @a __n. If 01084 * there are < @a __n characters to remove, the remainder of 01085 * the string is truncated. If @a __p is beyond end of string, 01086 * out_of_range is thrown. The value of the string doesn't 01087 * change if an error is thrown. 01088 */ 01089 __versa_string& 01090 erase(size_type __pos = 0, size_type __n = npos) 01091 { 01092 this->_M_erase(_M_check(__pos, "__versa_string::erase"), 01093 _M_limit(__pos, __n)); 01094 return *this; 01095 } 01096 01097 /** 01098 * @brief Remove one character. 01099 * @param __position Iterator referencing the character to remove. 01100 * @return iterator referencing same location after removal. 01101 * 01102 * Removes the character at @a __position from this string. The 01103 * value of the string doesn't change if an error is thrown. 01104 */ 01105 iterator 01106 erase(iterator __position) 01107 { 01108 _GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin() 01109 && __position < _M_iend()); 01110 const size_type __pos = __position - _M_ibegin(); 01111 this->_M_erase(__pos, size_type(1)); 01112 this->_M_set_leaked(); 01113 return iterator(this->_M_data() + __pos); 01114 } 01115 01116 /** 01117 * @brief Remove a range of characters. 01118 * @param __first Iterator referencing the first character to remove. 01119 * @param __last Iterator referencing the end of the range. 01120 * @return Iterator referencing location of first after removal. 01121 * 01122 * Removes the characters in the range [first,last) from this 01123 * string. The value of the string doesn't change if an error 01124 * is thrown. 01125 */ 01126 iterator 01127 erase(iterator __first, iterator __last) 01128 { 01129 _GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last 01130 && __last <= _M_iend()); 01131 const size_type __pos = __first - _M_ibegin(); 01132 this->_M_erase(__pos, __last - __first); 01133 this->_M_set_leaked(); 01134 return iterator(this->_M_data() + __pos); 01135 } 01136 01137 /** 01138 * @brief Replace characters with value from another string. 01139 * @param __pos Index of first character to replace. 01140 * @param __n Number of characters to be replaced. 01141 * @param __str String to insert. 01142 * @return Reference to this string. 01143 * @throw std::out_of_range If @a __pos is beyond the end of this 01144 * string. 01145 * @throw std::length_error If new length exceeds @c max_size(). 01146 * 01147 * Removes the characters in the range [pos,pos+n) from this 01148 * string. In place, the value of @a __str is inserted. If @a 01149 * __pos is beyond end of string, out_of_range is thrown. If 01150 * the length of the result exceeds max_size(), length_error is 01151 * thrown. The value of the string doesn't change if an error 01152 * is thrown. 01153 */ 01154 __versa_string& 01155 replace(size_type __pos, size_type __n, const __versa_string& __str) 01156 { return this->replace(__pos, __n, __str._M_data(), __str.size()); } 01157 01158 /** 01159 * @brief Replace characters with value from another string. 01160 * @param __pos1 Index of first character to replace. 01161 * @param __n1 Number of characters to be replaced. 01162 * @param __str String to insert. 01163 * @param __pos2 Index of first character of str to use. 01164 * @param __n2 Number of characters from str to use. 01165 * @return Reference to this string. 01166 * @throw std::out_of_range If @a __pos1 > size() or @a __pos2 > 01167 * str.size(). 01168 * @throw std::length_error If new length exceeds @c max_size(). 01169 * 01170 * Removes the characters in the range [pos1,pos1 + n) from 01171 * this string. In place, the value of @a __str is inserted. 01172 * If @a __pos is beyond end of string, out_of_range is thrown. 01173 * If the length of the result exceeds max_size(), length_error 01174 * is thrown. The value of the string doesn't change if an 01175 * error is thrown. 01176 */ 01177 __versa_string& 01178 replace(size_type __pos1, size_type __n1, const __versa_string& __str, 01179 size_type __pos2, size_type __n2) 01180 { 01181 return this->replace(__pos1, __n1, __str._M_data() 01182 + __str._M_check(__pos2, 01183 "__versa_string::replace"), 01184 __str._M_limit(__pos2, __n2)); 01185 } 01186 01187 /** 01188 * @brief Replace characters with value of a C substring. 01189 * @param __pos Index of first character to replace. 01190 * @param __n1 Number of characters to be replaced. 01191 * @param __s C string to insert. 01192 * @param __n2 Number of characters from @a __s to use. 01193 * @return Reference to this string. 01194 * @throw std::out_of_range If @a __pos1 > size(). 01195 * @throw std::length_error If new length exceeds @c max_size(). 01196 * 01197 * Removes the characters in the range [pos,pos + n1) from this 01198 * string. In place, the first @a __n2 characters of @a __s 01199 * are inserted, or all of @a __s if @a __n2 is too large. If 01200 * @a __pos is beyond end of string, out_of_range is thrown. 01201 * If the length of result exceeds max_size(), length_error is 01202 * thrown. The value of the string doesn't change if an error 01203 * is thrown. 01204 */ 01205 __versa_string& 01206 replace(size_type __pos, size_type __n1, const _CharT* __s, 01207 size_type __n2) 01208 { 01209 __glibcxx_requires_string_len(__s, __n2); 01210 return _M_replace(_M_check(__pos, "__versa_string::replace"), 01211 _M_limit(__pos, __n1), __s, __n2); 01212 } 01213 01214 /** 01215 * @brief Replace characters with value of a C string. 01216 * @param __pos Index of first character to replace. 01217 * @param __n1 Number of characters to be replaced. 01218 * @param __s C string to insert. 01219 * @return Reference to this string. 01220 * @throw std::out_of_range If @a __pos > size(). 01221 * @throw std::length_error If new length exceeds @c max_size(). 01222 * 01223 * Removes the characters in the range [pos,pos + n1) from this 01224 * string. In place, the characters of @a __s are inserted. If 01225 * @a pos is beyond end of string, out_of_range is thrown. If 01226 * the length of result exceeds max_size(), length_error is thrown. 01227 * The value of the string doesn't change if an error is thrown. 01228 */ 01229 __versa_string& 01230 replace(size_type __pos, size_type __n1, const _CharT* __s) 01231 { 01232 __glibcxx_requires_string(__s); 01233 return this->replace(__pos, __n1, __s, traits_type::length(__s)); 01234 } 01235 01236 /** 01237 * @brief Replace characters with multiple characters. 01238 * @param __pos Index of first character to replace. 01239 * @param __n1 Number of characters to be replaced. 01240 * @param __n2 Number of characters to insert. 01241 * @param __c Character to insert. 01242 * @return Reference to this string. 01243 * @throw std::out_of_range If @a __pos > size(). 01244 * @throw std::length_error If new length exceeds @c max_size(). 01245 * 01246 * Removes the characters in the range [pos,pos + n1) from this 01247 * string. In place, @a __n2 copies of @a __c are inserted. 01248 * If @a __pos is beyond end of string, out_of_range is thrown. 01249 * If the length of result exceeds max_size(), length_error is 01250 * thrown. The value of the string doesn't change if an error 01251 * is thrown. 01252 */ 01253 __versa_string& 01254 replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) 01255 { return _M_replace_aux(_M_check(__pos, "__versa_string::replace"), 01256 _M_limit(__pos, __n1), __n2, __c); } 01257 01258 /** 01259 * @brief Replace range of characters with string. 01260 * @param __i1 Iterator referencing start of range to replace. 01261 * @param __i2 Iterator referencing end of range to replace. 01262 * @param __str String value to insert. 01263 * @return Reference to this string. 01264 * @throw std::length_error If new length exceeds @c max_size(). 01265 * 01266 * Removes the characters in the range [i1,i2). In place, the 01267 * value of @a __str is inserted. If the length of result 01268 * exceeds max_size(), length_error is thrown. The value of 01269 * the string doesn't change if an error is thrown. 01270 */ 01271 __versa_string& 01272 replace(iterator __i1, iterator __i2, const __versa_string& __str) 01273 { return this->replace(__i1, __i2, __str._M_data(), __str.size()); } 01274 01275 /** 01276 * @brief Replace range of characters with C substring. 01277 * @param __i1 Iterator referencing start of range to replace. 01278 * @param __i2 Iterator referencing end of range to replace. 01279 * @param __s C string value to insert. 01280 * @param __n Number of characters from s to insert. 01281 * @return Reference to this string. 01282 * @throw std::length_error If new length exceeds @c max_size(). 01283 * 01284 * Removes the characters in the range [i1,i2). In place, the 01285 * first @a n characters of @a __s are inserted. If the length 01286 * of result exceeds max_size(), length_error is thrown. The 01287 * value of the string doesn't change if an error is thrown. 01288 */ 01289 __versa_string& 01290 replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n) 01291 { 01292 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 01293 && __i2 <= _M_iend()); 01294 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n); 01295 } 01296 01297 /** 01298 * @brief Replace range of characters with C string. 01299 * @param __i1 Iterator referencing start of range to replace. 01300 * @param __i2 Iterator referencing end of range to replace. 01301 * @param __s C string value to insert. 01302 * @return Reference to this string. 01303 * @throw std::length_error If new length exceeds @c max_size(). 01304 * 01305 * Removes the characters in the range [i1,i2). In place, the 01306 * characters of @a __s are inserted. If the length of result 01307 * exceeds max_size(), length_error is thrown. The value of 01308 * the string doesn't change if an error is thrown. 01309 */ 01310 __versa_string& 01311 replace(iterator __i1, iterator __i2, const _CharT* __s) 01312 { 01313 __glibcxx_requires_string(__s); 01314 return this->replace(__i1, __i2, __s, traits_type::length(__s)); 01315 } 01316 01317 /** 01318 * @brief Replace range of characters with multiple characters 01319 * @param __i1 Iterator referencing start of range to replace. 01320 * @param __i2 Iterator referencing end of range to replace. 01321 * @param __n Number of characters to insert. 01322 * @param __c Character to insert. 01323 * @return Reference to this string. 01324 * @throw std::length_error If new length exceeds @c max_size(). 01325 * 01326 * Removes the characters in the range [i1,i2). In place, @a 01327 * __n copies of @a __c are inserted. If the length of result 01328 * exceeds max_size(), length_error is thrown. The value of 01329 * the string doesn't change if an error is thrown. 01330 */ 01331 __versa_string& 01332 replace(iterator __i1, iterator __i2, size_type __n, _CharT __c) 01333 { 01334 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 01335 && __i2 <= _M_iend()); 01336 return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c); 01337 } 01338 01339 /** 01340 * @brief Replace range of characters with range. 01341 * @param __i1 Iterator referencing start of range to replace. 01342 * @param __i2 Iterator referencing end of range to replace. 01343 * @param __k1 Iterator referencing start of range to insert. 01344 * @param __k2 Iterator referencing end of range to insert. 01345 * @return Reference to this string. 01346 * @throw std::length_error If new length exceeds @c max_size(). 01347 * 01348 * Removes the characters in the range [i1,i2). In place, 01349 * characters in the range [k1,k2) are inserted. If the length 01350 * of result exceeds max_size(), length_error is thrown. The 01351 * value of the string doesn't change if an error is thrown. 01352 */ 01353 template<class _InputIterator> 01354 __versa_string& 01355 replace(iterator __i1, iterator __i2, 01356 _InputIterator __k1, _InputIterator __k2) 01357 { 01358 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 01359 && __i2 <= _M_iend()); 01360 __glibcxx_requires_valid_range(__k1, __k2); 01361 typedef typename std::__is_integer<_InputIterator>::__type _Integral; 01362 return this->_M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral()); 01363 } 01364 01365 // Specializations for the common case of pointer and iterator: 01366 // useful to avoid the overhead of temporary buffering in _M_replace. 01367 __versa_string& 01368 replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2) 01369 { 01370 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 01371 && __i2 <= _M_iend()); 01372 __glibcxx_requires_valid_range(__k1, __k2); 01373 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, 01374 __k1, __k2 - __k1); 01375 } 01376 01377 __versa_string& 01378 replace(iterator __i1, iterator __i2, 01379 const _CharT* __k1, const _CharT* __k2) 01380 { 01381 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 01382 && __i2 <= _M_iend()); 01383 __glibcxx_requires_valid_range(__k1, __k2); 01384 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, 01385 __k1, __k2 - __k1); 01386 } 01387 01388 __versa_string& 01389 replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2) 01390 { 01391 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 01392 && __i2 <= _M_iend()); 01393 __glibcxx_requires_valid_range(__k1, __k2); 01394 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, 01395 __k1.base(), __k2 - __k1); 01396 } 01397 01398 __versa_string& 01399 replace(iterator __i1, iterator __i2, 01400 const_iterator __k1, const_iterator __k2) 01401 { 01402 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 01403 && __i2 <= _M_iend()); 01404 __glibcxx_requires_valid_range(__k1, __k2); 01405 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, 01406 __k1.base(), __k2 - __k1); 01407 } 01408 01409 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 01410 /** 01411 * @brief Replace range of characters with initializer_list. 01412 * @param __i1 Iterator referencing start of range to replace. 01413 * @param __i2 Iterator referencing end of range to replace. 01414 * @param __l The initializer_list of characters to insert. 01415 * @return Reference to this string. 01416 * @throw std::length_error If new length exceeds @c max_size(). 01417 * 01418 * Removes the characters in the range [i1,i2). In place, 01419 * characters in the range [k1,k2) are inserted. If the length 01420 * of result exceeds max_size(), length_error is thrown. The 01421 * value of the string doesn't change if an error is thrown. 01422 */ 01423 __versa_string& replace(iterator __i1, iterator __i2, 01424 std::initializer_list<_CharT> __l) 01425 { return this->replace(__i1, __i2, __l.begin(), __l.end()); } 01426 #endif // __GXX_EXPERIMENTAL_CXX0X__ 01427 01428 private: 01429 template<class _Integer> 01430 __versa_string& 01431 _M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n, 01432 _Integer __val, std::__true_type) 01433 { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); } 01434 01435 template<class _InputIterator> 01436 __versa_string& 01437 _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1, 01438 _InputIterator __k2, std::__false_type); 01439 01440 __versa_string& 01441 _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2, 01442 _CharT __c); 01443 01444 __versa_string& 01445 _M_replace(size_type __pos, size_type __len1, const _CharT* __s, 01446 const size_type __len2); 01447 01448 __versa_string& 01449 _M_append(const _CharT* __s, size_type __n); 01450 01451 public: 01452 01453 /** 01454 * @brief Copy substring into C string. 01455 * @param __s C string to copy value into. 01456 * @param __n Number of characters to copy. 01457 * @param __pos Index of first character to copy. 01458 * @return Number of characters actually copied 01459 * @throw std::out_of_range If pos > size(). 01460 * 01461 * Copies up to @a __n characters starting at @a __pos into the 01462 * C string @a s. If @a __pos is greater than size(), 01463 * out_of_range is thrown. 01464 */ 01465 size_type 01466 copy(_CharT* __s, size_type __n, size_type __pos = 0) const; 01467 01468 /** 01469 * @brief Swap contents with another string. 01470 * @param __s String to swap with. 01471 * 01472 * Exchanges the contents of this string with that of @a __s in 01473 * constant time. 01474 */ 01475 void 01476 swap(__versa_string& __s) 01477 { this->_M_swap(__s); } 01478 01479 // String operations: 01480 /** 01481 * @brief Return const pointer to null-terminated contents. 01482 * 01483 * This is a handle to internal data. Do not modify or dire things may 01484 * happen. 01485 */ 01486 const _CharT* 01487 c_str() const 01488 { return this->_M_data(); } 01489 01490 /** 01491 * @brief Return const pointer to contents. 01492 * 01493 * This is a handle to internal data. Do not modify or dire things may 01494 * happen. 01495 */ 01496 const _CharT* 01497 data() const 01498 { return this->_M_data(); } 01499 01500 /** 01501 * @brief Return copy of allocator used to construct this string. 01502 */ 01503 allocator_type 01504 get_allocator() const 01505 { return allocator_type(this->_M_get_allocator()); } 01506 01507 /** 01508 * @brief Find position of a C substring. 01509 * @param __s C string to locate. 01510 * @param __pos Index of character to search from. 01511 * @param __n Number of characters from @a __s to search for. 01512 * @return Index of start of first occurrence. 01513 * 01514 * Starting from @a __pos, searches forward for the first @a 01515 * __n characters in @a __s within this string. If found, 01516 * returns the index where it begins. If not found, returns 01517 * npos. 01518 */ 01519 size_type 01520 find(const _CharT* __s, size_type __pos, size_type __n) const; 01521 01522 /** 01523 * @brief Find position of a string. 01524 * @param __str String to locate. 01525 * @param __pos Index of character to search from (default 0). 01526 * @return Index of start of first occurrence. 01527 * 01528 * Starting from @a __pos, searches forward for value of @a 01529 * __str within this string. If found, returns the index where 01530 * it begins. If not found, returns npos. 01531 */ 01532 size_type 01533 find(const __versa_string& __str, size_type __pos = 0) const 01534 { return this->find(__str.data(), __pos, __str.size()); } 01535 01536 /** 01537 * @brief Find position of a C string. 01538 * @param __s C string to locate. 01539 * @param __pos Index of character to search from (default 0). 01540 * @return Index of start of first occurrence. 01541 * 01542 * Starting from @a __pos, searches forward for the value of @a 01543 * __s within this string. If found, returns the index where 01544 * it begins. If not found, returns npos. 01545 */ 01546 size_type 01547 find(const _CharT* __s, size_type __pos = 0) const 01548 { 01549 __glibcxx_requires_string(__s); 01550 return this->find(__s, __pos, traits_type::length(__s)); 01551 } 01552 01553 /** 01554 * @brief Find position of a character. 01555 * @param __c Character to locate. 01556 * @param __pos Index of character to search from (default 0). 01557 * @return Index of first occurrence. 01558 * 01559 * Starting from @a __pos, searches forward for @a __c within 01560 * this string. If found, returns the index where it was 01561 * found. If not found, returns npos. 01562 */ 01563 size_type 01564 find(_CharT __c, size_type __pos = 0) const; 01565 01566 /** 01567 * @brief Find last position of a string. 01568 * @param __str String to locate. 01569 * @param __pos Index of character to search back from (default end). 01570 * @return Index of start of last occurrence. 01571 * 01572 * Starting from @a __pos, searches backward for value of @a 01573 * __str within this string. If found, returns the index where 01574 * it begins. If not found, returns npos. 01575 */ 01576 size_type 01577 rfind(const __versa_string& __str, size_type __pos = npos) const 01578 { return this->rfind(__str.data(), __pos, __str.size()); } 01579 01580 /** 01581 * @brief Find last position of a C substring. 01582 * @param __s C string to locate. 01583 * @param __pos Index of character to search back from. 01584 * @param __n Number of characters from s to search for. 01585 * @return Index of start of last occurrence. 01586 * 01587 * Starting from @a __pos, searches backward for the first @a 01588 * __n characters in @a __s within this string. If found, 01589 * returns the index where it begins. If not found, returns 01590 * npos. 01591 */ 01592 size_type 01593 rfind(const _CharT* __s, size_type __pos, size_type __n) const; 01594 01595 /** 01596 * @brief Find last position of a C string. 01597 * @param __s C string to locate. 01598 * @param __pos Index of character to start search at (default end). 01599 * @return Index of start of last occurrence. 01600 * 01601 * Starting from @a __pos, searches backward for the value of 01602 * @a __s within this string. If found, returns the index 01603 * where it begins. If not found, returns npos. 01604 */ 01605 size_type 01606 rfind(const _CharT* __s, size_type __pos = npos) const 01607 { 01608 __glibcxx_requires_string(__s); 01609 return this->rfind(__s, __pos, traits_type::length(__s)); 01610 } 01611 01612 /** 01613 * @brief Find last position of a character. 01614 * @param __c Character to locate. 01615 * @param __pos Index of character to search back from (default end). 01616 * @return Index of last occurrence. 01617 * 01618 * Starting from @a __pos, searches backward for @a __c within 01619 * this string. If found, returns the index where it was 01620 * found. If not found, returns npos. 01621 */ 01622 size_type 01623 rfind(_CharT __c, size_type __pos = npos) const; 01624 01625 /** 01626 * @brief Find position of a character of string. 01627 * @param __str String containing characters to locate. 01628 * @param __pos Index of character to search from (default 0). 01629 * @return Index of first occurrence. 01630 * 01631 * Starting from @a __pos, searches forward for one of the characters of 01632 * @a __str within this string. If found, returns the index where it was 01633 * found. If not found, returns npos. 01634 */ 01635 size_type 01636 find_first_of(const __versa_string& __str, size_type __pos = 0) const 01637 { return this->find_first_of(__str.data(), __pos, __str.size()); } 01638 01639 /** 01640 * @brief Find position of a character of C substring. 01641 * @param __s String containing characters to locate. 01642 * @param __pos Index of character to search from. 01643 * @param __n Number of characters from s to search for. 01644 * @return Index of first occurrence. 01645 * 01646 * Starting from @a __pos, searches forward for one of the 01647 * first @a __n characters of @a __s within this string. If 01648 * found, returns the index where it was found. If not found, 01649 * returns npos. 01650 */ 01651 size_type 01652 find_first_of(const _CharT* __s, size_type __pos, size_type __n) const; 01653 01654 /** 01655 * @brief Find position of a character of C string. 01656 * @param __s String containing characters to locate. 01657 * @param __pos Index of character to search from (default 0). 01658 * @return Index of first occurrence. 01659 * 01660 * Starting from @a __pos, searches forward for one of the 01661 * characters of @a __s within this string. If found, returns 01662 * the index where it was found. If not found, returns npos. 01663 */ 01664 size_type 01665 find_first_of(const _CharT* __s, size_type __pos = 0) const 01666 { 01667 __glibcxx_requires_string(__s); 01668 return this->find_first_of(__s, __pos, traits_type::length(__s)); 01669 } 01670 01671 /** 01672 * @brief Find position of a character. 01673 * @param __c Character to locate. 01674 * @param __pos Index of character to search from (default 0). 01675 * @return Index of first occurrence. 01676 * 01677 * Starting from @a __pos, searches forward for the character 01678 * @a __c within this string. If found, returns the index 01679 * where it was found. If not found, returns npos. 01680 * 01681 * Note: equivalent to find(c, pos). 01682 */ 01683 size_type 01684 find_first_of(_CharT __c, size_type __pos = 0) const 01685 { return this->find(__c, __pos); } 01686 01687 /** 01688 * @brief Find last position of a character of string. 01689 * @param __str String containing characters to locate. 01690 * @param __pos Index of character to search back from (default end). 01691 * @return Index of last occurrence. 01692 * 01693 * Starting from @a __pos, searches backward for one of the 01694 * characters of @a __str within this string. If found, 01695 * returns the index where it was found. If not found, returns 01696 * npos. 01697 */ 01698 size_type 01699 find_last_of(const __versa_string& __str, size_type __pos = npos) const 01700 { return this->find_last_of(__str.data(), __pos, __str.size()); } 01701 01702 /** 01703 * @brief Find last position of a character of C substring. 01704 * @param __s C string containing characters to locate. 01705 * @param __pos Index of character to search back from. 01706 * @param __n Number of characters from s to search for. 01707 * @return Index of last occurrence. 01708 * 01709 * Starting from @a __pos, searches backward for one of the 01710 * first @a __n characters of @a __s within this string. If 01711 * found, returns the index where it was found. If not found, 01712 * returns npos. 01713 */ 01714 size_type 01715 find_last_of(const _CharT* __s, size_type __pos, size_type __n) const; 01716 01717 /** 01718 * @brief Find last position of a character of C string. 01719 * @param __s C string containing characters to locate. 01720 * @param __pos Index of character to search back from (default end). 01721 * @return Index of last occurrence. 01722 * 01723 * Starting from @a __pos, searches backward for one of the 01724 * characters of @a __s within this string. If found, returns 01725 * the index where it was found. If not found, returns npos. 01726 */ 01727 size_type 01728 find_last_of(const _CharT* __s, size_type __pos = npos) const 01729 { 01730 __glibcxx_requires_string(__s); 01731 return this->find_last_of(__s, __pos, traits_type::length(__s)); 01732 } 01733 01734 /** 01735 * @brief Find last position of a character. 01736 * @param __c Character to locate. 01737 * @param __pos Index of character to search back from (default end). 01738 * @return Index of last occurrence. 01739 * 01740 * Starting from @a __pos, searches backward for @a __c within 01741 * this string. If found, returns the index where it was 01742 * found. If not found, returns npos. 01743 * 01744 * Note: equivalent to rfind(c, pos). 01745 */ 01746 size_type 01747 find_last_of(_CharT __c, size_type __pos = npos) const 01748 { return this->rfind(__c, __pos); } 01749 01750 /** 01751 * @brief Find position of a character not in string. 01752 * @param __str String containing characters to avoid. 01753 * @param __pos Index of character to search from (default 0). 01754 * @return Index of first occurrence. 01755 * 01756 * Starting from @a __pos, searches forward for a character not 01757 * contained in @a __str within this string. If found, returns 01758 * the index where it was found. If not found, returns npos. 01759 */ 01760 size_type 01761 find_first_not_of(const __versa_string& __str, size_type __pos = 0) const 01762 { return this->find_first_not_of(__str.data(), __pos, __str.size()); } 01763 01764 /** 01765 * @brief Find position of a character not in C substring. 01766 * @param __s C string containing characters to avoid. 01767 * @param __pos Index of character to search from. 01768 * @param __n Number of characters from s to consider. 01769 * @return Index of first occurrence. 01770 * 01771 * Starting from @a __pos, searches forward for a character not 01772 * contained in the first @a __n characters of @a __s within 01773 * this string. If found, returns the index where it was 01774 * found. If not found, returns npos. 01775 */ 01776 size_type 01777 find_first_not_of(const _CharT* __s, size_type __pos, 01778 size_type __n) const; 01779 01780 /** 01781 * @brief Find position of a character not in C string. 01782 * @param __s C string containing characters to avoid. 01783 * @param __pos Index of character to search from (default 0). 01784 * @return Index of first occurrence. 01785 * 01786 * Starting from @a __pos, searches forward for a character not 01787 * contained in @a __s within this string. If found, returns 01788 * the index where it was found. If not found, returns npos. 01789 */ 01790 size_type 01791 find_first_not_of(const _CharT* __s, size_type __pos = 0) const 01792 { 01793 __glibcxx_requires_string(__s); 01794 return this->find_first_not_of(__s, __pos, traits_type::length(__s)); 01795 } 01796 01797 /** 01798 * @brief Find position of a different character. 01799 * @param __c Character to avoid. 01800 * @param __pos Index of character to search from (default 0). 01801 * @return Index of first occurrence. 01802 * 01803 * Starting from @a __pos, searches forward for a character 01804 * other than @a __c within this string. If found, returns the 01805 * index where it was found. If not found, returns npos. 01806 */ 01807 size_type 01808 find_first_not_of(_CharT __c, size_type __pos = 0) const; 01809 01810 /** 01811 * @brief Find last position of a character not in string. 01812 * @param __str String containing characters to avoid. 01813 * @param __pos Index of character to search back from (default end). 01814 * @return Index of last occurrence. 01815 * 01816 * Starting from @a __pos, searches backward for a character 01817 * not contained in @a __str within this string. If found, 01818 * returns the index where it was found. If not found, returns 01819 * npos. 01820 */ 01821 size_type 01822 find_last_not_of(const __versa_string& __str, 01823 size_type __pos = npos) const 01824 { return this->find_last_not_of(__str.data(), __pos, __str.size()); } 01825 01826 /** 01827 * @brief Find last position of a character not in C substring. 01828 * @param __s C string containing characters to avoid. 01829 * @param __pos Index of character to search back from. 01830 * @param __n Number of characters from s to consider. 01831 * @return Index of last occurrence. 01832 * 01833 * Starting from @a __pos, searches backward for a character 01834 * not contained in the first @a __n characters of @a __s 01835 * within this string. If found, returns the index where it 01836 * was found. If not found, returns npos. 01837 */ 01838 size_type 01839 find_last_not_of(const _CharT* __s, size_type __pos, 01840 size_type __n) const; 01841 /** 01842 * @brief Find last position of a character not in C string. 01843 * @param __s C string containing characters to avoid. 01844 * @param __pos Index of character to search back from (default end). 01845 * @return Index of last occurrence. 01846 * 01847 * Starting from @a __pos, searches backward for a character 01848 * not contained in @a __s within this string. If found, 01849 * returns the index where it was found. If not found, returns 01850 * npos. 01851 */ 01852 size_type 01853 find_last_not_of(const _CharT* __s, size_type __pos = npos) const 01854 { 01855 __glibcxx_requires_string(__s); 01856 return this->find_last_not_of(__s, __pos, traits_type::length(__s)); 01857 } 01858 01859 /** 01860 * @brief Find last position of a different character. 01861 * @param __c Character to avoid. 01862 * @param __pos Index of character to search back from (default end). 01863 * @return Index of last occurrence. 01864 * 01865 * Starting from @a __pos, searches backward for a character 01866 * other than @a __c within this string. If found, returns the 01867 * index where it was found. If not found, returns npos. 01868 */ 01869 size_type 01870 find_last_not_of(_CharT __c, size_type __pos = npos) const; 01871 01872 /** 01873 * @brief Get a substring. 01874 * @param __pos Index of first character (default 0). 01875 * @param __n Number of characters in substring (default remainder). 01876 * @return The new string. 01877 * @throw std::out_of_range If pos > size(). 01878 * 01879 * Construct and return a new string using the @a __n 01880 * characters starting at @a __pos. If the string is too 01881 * short, use the remainder of the characters. If @a __pos is 01882 * beyond the end of the string, out_of_range is thrown. 01883 */ 01884 __versa_string 01885 substr(size_type __pos = 0, size_type __n = npos) const 01886 { 01887 return __versa_string(*this, _M_check(__pos, "__versa_string::substr"), 01888 __n); 01889 } 01890 01891 /** 01892 * @brief Compare to a string. 01893 * @param __str String to compare against. 01894 * @return Integer < 0, 0, or > 0. 01895 * 01896 * Returns an integer < 0 if this string is ordered before @a 01897 * __str, 0 if their values are equivalent, or > 0 if this 01898 * string is ordered after @a __str. Determines the effective 01899 * length rlen of the strings to compare as the smallest of 01900 * size() and str.size(). The function then compares the two 01901 * strings by calling traits::compare(data(), str.data(),rlen). 01902 * If the result of the comparison is nonzero returns it, 01903 * otherwise the shorter one is ordered first. 01904 */ 01905 int 01906 compare(const __versa_string& __str) const 01907 { 01908 if (this->_M_compare(__str)) 01909 return 0; 01910 01911 const size_type __size = this->size(); 01912 const size_type __osize = __str.size(); 01913 const size_type __len = std::min(__size, __osize); 01914 01915 int __r = traits_type::compare(this->_M_data(), __str.data(), __len); 01916 if (!__r) 01917 __r = this->_S_compare(__size, __osize); 01918 return __r; 01919 } 01920 01921 /** 01922 * @brief Compare substring to a string. 01923 * @param __pos Index of first character of substring. 01924 * @param __n Number of characters in substring. 01925 * @param __str String to compare against. 01926 * @return Integer < 0, 0, or > 0. 01927 * 01928 * Form the substring of this string from the @a __n characters 01929 * starting at @a __pos. Returns an integer < 0 if the 01930 * substring is ordered before @a __str, 0 if their values are 01931 * equivalent, or > 0 if the substring is ordered after @a 01932 * __str. Determines the effective length rlen of the strings 01933 * to compare as the smallest of the length of the substring 01934 * and @a __str.size(). The function then compares the two 01935 * strings by calling 01936 * traits::compare(substring.data(),str.data(),rlen). If the 01937 * result of the comparison is nonzero returns it, otherwise 01938 * the shorter one is ordered first. 01939 */ 01940 int 01941 compare(size_type __pos, size_type __n, 01942 const __versa_string& __str) const; 01943 01944 /** 01945 * @brief Compare substring to a substring. 01946 * @param __pos1 Index of first character of substring. 01947 * @param __n1 Number of characters in substring. 01948 * @param __str String to compare against. 01949 * @param __pos2 Index of first character of substring of str. 01950 * @param __n2 Number of characters in substring of str. 01951 * @return Integer < 0, 0, or > 0. 01952 * 01953 * Form the substring of this string from the @a __n1 01954 * characters starting at @a __pos1. Form the substring of @a 01955 * __str from the @a __n2 characters starting at @a __pos2. 01956 * Returns an integer < 0 if this substring is ordered before 01957 * the substring of @a __str, 0 if their values are equivalent, 01958 * or > 0 if this substring is ordered after the substring of 01959 * @a __str. Determines the effective length rlen of the 01960 * strings to compare as the smallest of the lengths of the 01961 * substrings. The function then compares the two strings by 01962 * calling 01963 * traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen). 01964 * If the result of the comparison is nonzero returns it, 01965 * otherwise the shorter one is ordered first. 01966 */ 01967 int 01968 compare(size_type __pos1, size_type __n1, const __versa_string& __str, 01969 size_type __pos2, size_type __n2) const; 01970 01971 /** 01972 * @brief Compare to a C string. 01973 * @param __s C string to compare against. 01974 * @return Integer < 0, 0, or > 0. 01975 * 01976 * Returns an integer < 0 if this string is ordered before @a 01977 * __s, 0 if their values are equivalent, or > 0 if this string 01978 * is ordered after @a __s. Determines the effective length 01979 * rlen of the strings to compare as the smallest of size() and 01980 * the length of a string constructed from @a __s. The 01981 * function then compares the two strings by calling 01982 * traits::compare(data(),s,rlen). If the result of the 01983 * comparison is nonzero returns it, otherwise the shorter one 01984 * is ordered first. 01985 */ 01986 int 01987 compare(const _CharT* __s) const; 01988 01989 // _GLIBCXX_RESOLVE_LIB_DEFECTS 01990 // 5 String::compare specification questionable 01991 /** 01992 * @brief Compare substring to a C string. 01993 * @param __pos Index of first character of substring. 01994 * @param __n1 Number of characters in substring. 01995 * @param __s C string to compare against. 01996 * @return Integer < 0, 0, or > 0. 01997 * 01998 * Form the substring of this string from the @a __n1 01999 * characters starting at @a __pos. Returns an integer < 0 if 02000 * the substring is ordered before @a __s, 0 if their values 02001 * are equivalent, or > 0 if the substring is ordered after @a 02002 * __s. Determines the effective length rlen of the strings to 02003 * compare as the smallest of the length of the substring and 02004 * the length of a string constructed from @a __s. The 02005 * function then compares the two string by calling 02006 * traits::compare(substring.data(),s,rlen). If the result of 02007 * the comparison is nonzero returns it, otherwise the shorter 02008 * one is ordered first. 02009 */ 02010 int 02011 compare(size_type __pos, size_type __n1, const _CharT* __s) const; 02012 02013 /** 02014 * @brief Compare substring against a character array. 02015 * @param __pos1 Index of first character of substring. 02016 * @param __n1 Number of characters in substring. 02017 * @param __s character array to compare against. 02018 * @param __n2 Number of characters of s. 02019 * @return Integer < 0, 0, or > 0. 02020 * 02021 * Form the substring of this string from the @a __n1 02022 * characters starting at @a __pos1. Form a string from the 02023 * first @a __n2 characters of @a __s. Returns an integer < 0 02024 * if this substring is ordered before the string from @a __s, 02025 * 0 if their values are equivalent, or > 0 if this substring 02026 * is ordered after the string from @a __s. Determines the 02027 * effective length rlen of the strings to compare as the 02028 * smallest of the length of the substring and @a __n2. The 02029 * function then compares the two strings by calling 02030 * traits::compare(substring.data(),s,rlen). If the result of 02031 * the comparison is nonzero returns it, otherwise the shorter 02032 * one is ordered first. 02033 * 02034 * NB: s must have at least n2 characters, <em>\\0</em> has no special 02035 * meaning. 02036 */ 02037 int 02038 compare(size_type __pos, size_type __n1, const _CharT* __s, 02039 size_type __n2) const; 02040 }; 02041 02042 // operator+ 02043 /** 02044 * @brief Concatenate two strings. 02045 * @param __lhs First string. 02046 * @param __rhs Last string. 02047 * @return New string with value of @a __lhs followed by @a __rhs. 02048 */ 02049 template<typename _CharT, typename _Traits, typename _Alloc, 02050 template <typename, typename, typename> class _Base> 02051 __versa_string<_CharT, _Traits, _Alloc, _Base> 02052 operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02053 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs); 02054 02055 /** 02056 * @brief Concatenate C string and string. 02057 * @param __lhs First string. 02058 * @param __rhs Last string. 02059 * @return New string with value of @a __lhs followed by @a __rhs. 02060 */ 02061 template<typename _CharT, typename _Traits, typename _Alloc, 02062 template <typename, typename, typename> class _Base> 02063 __versa_string<_CharT, _Traits, _Alloc, _Base> 02064 operator+(const _CharT* __lhs, 02065 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs); 02066 02067 /** 02068 * @brief Concatenate character and string. 02069 * @param __lhs First string. 02070 * @param __rhs Last string. 02071 * @return New string with @a __lhs followed by @a __rhs. 02072 */ 02073 template<typename _CharT, typename _Traits, typename _Alloc, 02074 template <typename, typename, typename> class _Base> 02075 __versa_string<_CharT, _Traits, _Alloc, _Base> 02076 operator+(_CharT __lhs, 02077 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs); 02078 02079 /** 02080 * @brief Concatenate string and C string. 02081 * @param __lhs First string. 02082 * @param __rhs Last string. 02083 * @return New string with @a __lhs followed by @a __rhs. 02084 */ 02085 template<typename _CharT, typename _Traits, typename _Alloc, 02086 template <typename, typename, typename> class _Base> 02087 __versa_string<_CharT, _Traits, _Alloc, _Base> 02088 operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02089 const _CharT* __rhs); 02090 02091 /** 02092 * @brief Concatenate string and character. 02093 * @param __lhs First string. 02094 * @param __rhs Last string. 02095 * @return New string with @a __lhs followed by @a __rhs. 02096 */ 02097 template<typename _CharT, typename _Traits, typename _Alloc, 02098 template <typename, typename, typename> class _Base> 02099 __versa_string<_CharT, _Traits, _Alloc, _Base> 02100 operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02101 _CharT __rhs); 02102 02103 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 02104 template<typename _CharT, typename _Traits, typename _Alloc, 02105 template <typename, typename, typename> class _Base> 02106 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 02107 operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs, 02108 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02109 { return std::move(__lhs.append(__rhs)); } 02110 02111 template<typename _CharT, typename _Traits, typename _Alloc, 02112 template <typename, typename, typename> class _Base> 02113 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 02114 operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02115 __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs) 02116 { return std::move(__rhs.insert(0, __lhs)); } 02117 02118 template<typename _CharT, typename _Traits, typename _Alloc, 02119 template <typename, typename, typename> class _Base> 02120 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 02121 operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs, 02122 __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs) 02123 { 02124 const auto __size = __lhs.size() + __rhs.size(); 02125 const bool __cond = (__size > __lhs.capacity() 02126 && __size <= __rhs.capacity()); 02127 return __cond ? std::move(__rhs.insert(0, __lhs)) 02128 : std::move(__lhs.append(__rhs)); 02129 } 02130 02131 template<typename _CharT, typename _Traits, typename _Alloc, 02132 template <typename, typename, typename> class _Base> 02133 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 02134 operator+(const _CharT* __lhs, 02135 __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs) 02136 { return std::move(__rhs.insert(0, __lhs)); } 02137 02138 template<typename _CharT, typename _Traits, typename _Alloc, 02139 template <typename, typename, typename> class _Base> 02140 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 02141 operator+(_CharT __lhs, 02142 __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs) 02143 { return std::move(__rhs.insert(0, 1, __lhs)); } 02144 02145 template<typename _CharT, typename _Traits, typename _Alloc, 02146 template <typename, typename, typename> class _Base> 02147 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 02148 operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs, 02149 const _CharT* __rhs) 02150 { return std::move(__lhs.append(__rhs)); } 02151 02152 template<typename _CharT, typename _Traits, typename _Alloc, 02153 template <typename, typename, typename> class _Base> 02154 inline __versa_string<_CharT, _Traits, _Alloc, _Base> 02155 operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs, 02156 _CharT __rhs) 02157 { return std::move(__lhs.append(1, __rhs)); } 02158 #endif 02159 02160 // operator == 02161 /** 02162 * @brief Test equivalence of two strings. 02163 * @param __lhs First string. 02164 * @param __rhs Second string. 02165 * @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise. 02166 */ 02167 template<typename _CharT, typename _Traits, typename _Alloc, 02168 template <typename, typename, typename> class _Base> 02169 inline bool 02170 operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02171 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02172 { return __lhs.compare(__rhs) == 0; } 02173 02174 template<typename _CharT, 02175 template <typename, typename, typename> class _Base> 02176 inline typename __enable_if<std::__is_char<_CharT>::__value, bool>::__type 02177 operator==(const __versa_string<_CharT, std::char_traits<_CharT>, 02178 std::allocator<_CharT>, _Base>& __lhs, 02179 const __versa_string<_CharT, std::char_traits<_CharT>, 02180 std::allocator<_CharT>, _Base>& __rhs) 02181 { return (__lhs.size() == __rhs.size() 02182 && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(), 02183 __lhs.size())); } 02184 02185 /** 02186 * @brief Test equivalence of C string and string. 02187 * @param __lhs C string. 02188 * @param __rhs String. 02189 * @return True if @a __rhs.compare(@a __lhs) == 0. False otherwise. 02190 */ 02191 template<typename _CharT, typename _Traits, typename _Alloc, 02192 template <typename, typename, typename> class _Base> 02193 inline bool 02194 operator==(const _CharT* __lhs, 02195 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02196 { return __rhs.compare(__lhs) == 0; } 02197 02198 /** 02199 * @brief Test equivalence of string and C string. 02200 * @param __lhs String. 02201 * @param __rhs C string. 02202 * @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise. 02203 */ 02204 template<typename _CharT, typename _Traits, typename _Alloc, 02205 template <typename, typename, typename> class _Base> 02206 inline bool 02207 operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02208 const _CharT* __rhs) 02209 { return __lhs.compare(__rhs) == 0; } 02210 02211 // operator != 02212 /** 02213 * @brief Test difference of two strings. 02214 * @param __lhs First string. 02215 * @param __rhs Second string. 02216 * @return True if @a __lhs.compare(@a __rhs) != 0. False otherwise. 02217 */ 02218 template<typename _CharT, typename _Traits, typename _Alloc, 02219 template <typename, typename, typename> class _Base> 02220 inline bool 02221 operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02222 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02223 { return !(__lhs == __rhs); } 02224 02225 /** 02226 * @brief Test difference of C string and string. 02227 * @param __lhs C string. 02228 * @param __rhs String. 02229 * @return True if @a __rhs.compare(@a __lhs) != 0. False otherwise. 02230 */ 02231 template<typename _CharT, typename _Traits, typename _Alloc, 02232 template <typename, typename, typename> class _Base> 02233 inline bool 02234 operator!=(const _CharT* __lhs, 02235 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02236 { return !(__lhs == __rhs); } 02237 02238 /** 02239 * @brief Test difference of string and C string. 02240 * @param __lhs String. 02241 * @param __rhs C string. 02242 * @return True if @a __lhs.compare(@a __rhs) != 0. False otherwise. 02243 */ 02244 template<typename _CharT, typename _Traits, typename _Alloc, 02245 template <typename, typename, typename> class _Base> 02246 inline bool 02247 operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02248 const _CharT* __rhs) 02249 { return !(__lhs == __rhs); } 02250 02251 // operator < 02252 /** 02253 * @brief Test if string precedes string. 02254 * @param __lhs First string. 02255 * @param __rhs Second string. 02256 * @return True if @a __lhs precedes @a __rhs. False otherwise. 02257 */ 02258 template<typename _CharT, typename _Traits, typename _Alloc, 02259 template <typename, typename, typename> class _Base> 02260 inline bool 02261 operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02262 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02263 { return __lhs.compare(__rhs) < 0; } 02264 02265 /** 02266 * @brief Test if string precedes C string. 02267 * @param __lhs String. 02268 * @param __rhs C string. 02269 * @return True if @a __lhs precedes @a __rhs. False otherwise. 02270 */ 02271 template<typename _CharT, typename _Traits, typename _Alloc, 02272 template <typename, typename, typename> class _Base> 02273 inline bool 02274 operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02275 const _CharT* __rhs) 02276 { return __lhs.compare(__rhs) < 0; } 02277 02278 /** 02279 * @brief Test if C string precedes string. 02280 * @param __lhs C string. 02281 * @param __rhs String. 02282 * @return True if @a __lhs precedes @a __rhs. False otherwise. 02283 */ 02284 template<typename _CharT, typename _Traits, typename _Alloc, 02285 template <typename, typename, typename> class _Base> 02286 inline bool 02287 operator<(const _CharT* __lhs, 02288 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02289 { return __rhs.compare(__lhs) > 0; } 02290 02291 // operator > 02292 /** 02293 * @brief Test if string follows string. 02294 * @param __lhs First string. 02295 * @param __rhs Second string. 02296 * @return True if @a __lhs follows @a __rhs. False otherwise. 02297 */ 02298 template<typename _CharT, typename _Traits, typename _Alloc, 02299 template <typename, typename, typename> class _Base> 02300 inline bool 02301 operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02302 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02303 { return __lhs.compare(__rhs) > 0; } 02304 02305 /** 02306 * @brief Test if string follows C string. 02307 * @param __lhs String. 02308 * @param __rhs C string. 02309 * @return True if @a __lhs follows @a __rhs. False otherwise. 02310 */ 02311 template<typename _CharT, typename _Traits, typename _Alloc, 02312 template <typename, typename, typename> class _Base> 02313 inline bool 02314 operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02315 const _CharT* __rhs) 02316 { return __lhs.compare(__rhs) > 0; } 02317 02318 /** 02319 * @brief Test if C string follows string. 02320 * @param __lhs C string. 02321 * @param __rhs String. 02322 * @return True if @a __lhs follows @a __rhs. False otherwise. 02323 */ 02324 template<typename _CharT, typename _Traits, typename _Alloc, 02325 template <typename, typename, typename> class _Base> 02326 inline bool 02327 operator>(const _CharT* __lhs, 02328 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02329 { return __rhs.compare(__lhs) < 0; } 02330 02331 // operator <= 02332 /** 02333 * @brief Test if string doesn't follow string. 02334 * @param __lhs First string. 02335 * @param __rhs Second string. 02336 * @return True if @a __lhs doesn't follow @a __rhs. False otherwise. 02337 */ 02338 template<typename _CharT, typename _Traits, typename _Alloc, 02339 template <typename, typename, typename> class _Base> 02340 inline bool 02341 operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02342 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02343 { return __lhs.compare(__rhs) <= 0; } 02344 02345 /** 02346 * @brief Test if string doesn't follow C string. 02347 * @param __lhs String. 02348 * @param __rhs C string. 02349 * @return True if @a __lhs doesn't follow @a __rhs. False otherwise. 02350 */ 02351 template<typename _CharT, typename _Traits, typename _Alloc, 02352 template <typename, typename, typename> class _Base> 02353 inline bool 02354 operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02355 const _CharT* __rhs) 02356 { return __lhs.compare(__rhs) <= 0; } 02357 02358 /** 02359 * @brief Test if C string doesn't follow string. 02360 * @param __lhs C string. 02361 * @param __rhs String. 02362 * @return True if @a __lhs doesn't follow @a __rhs. False otherwise. 02363 */ 02364 template<typename _CharT, typename _Traits, typename _Alloc, 02365 template <typename, typename, typename> class _Base> 02366 inline bool 02367 operator<=(const _CharT* __lhs, 02368 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02369 { return __rhs.compare(__lhs) >= 0; } 02370 02371 // operator >= 02372 /** 02373 * @brief Test if string doesn't precede string. 02374 * @param __lhs First string. 02375 * @param __rhs Second string. 02376 * @return True if @a __lhs doesn't precede @a __rhs. False otherwise. 02377 */ 02378 template<typename _CharT, typename _Traits, typename _Alloc, 02379 template <typename, typename, typename> class _Base> 02380 inline bool 02381 operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02382 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02383 { return __lhs.compare(__rhs) >= 0; } 02384 02385 /** 02386 * @brief Test if string doesn't precede C string. 02387 * @param __lhs String. 02388 * @param __rhs C string. 02389 * @return True if @a __lhs doesn't precede @a __rhs. False otherwise. 02390 */ 02391 template<typename _CharT, typename _Traits, typename _Alloc, 02392 template <typename, typename, typename> class _Base> 02393 inline bool 02394 operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02395 const _CharT* __rhs) 02396 { return __lhs.compare(__rhs) >= 0; } 02397 02398 /** 02399 * @brief Test if C string doesn't precede string. 02400 * @param __lhs C string. 02401 * @param __rhs String. 02402 * @return True if @a __lhs doesn't precede @a __rhs. False otherwise. 02403 */ 02404 template<typename _CharT, typename _Traits, typename _Alloc, 02405 template <typename, typename, typename> class _Base> 02406 inline bool 02407 operator>=(const _CharT* __lhs, 02408 const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02409 { return __rhs.compare(__lhs) <= 0; } 02410 02411 /** 02412 * @brief Swap contents of two strings. 02413 * @param __lhs First string. 02414 * @param __rhs Second string. 02415 * 02416 * Exchanges the contents of @a __lhs and @a __rhs in constant time. 02417 */ 02418 template<typename _CharT, typename _Traits, typename _Alloc, 02419 template <typename, typename, typename> class _Base> 02420 inline void 02421 swap(__versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 02422 __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 02423 { __lhs.swap(__rhs); } 02424 02425 _GLIBCXX_END_NAMESPACE_VERSION 02426 } // namespace 02427 02428 namespace std _GLIBCXX_VISIBILITY(default) 02429 { 02430 _GLIBCXX_BEGIN_NAMESPACE_VERSION 02431 02432 /** 02433 * @brief Read stream into a string. 02434 * @param __is Input stream. 02435 * @param __str Buffer to store into. 02436 * @return Reference to the input stream. 02437 * 02438 * Stores characters from @a __is into @a __str until whitespace is 02439 * found, the end of the stream is encountered, or str.max_size() 02440 * is reached. If is.width() is non-zero, that is the limit on the 02441 * number of characters stored into @a __str. Any previous 02442 * contents of @a __str are erased. 02443 */ 02444 template<typename _CharT, typename _Traits, typename _Alloc, 02445 template <typename, typename, typename> class _Base> 02446 basic_istream<_CharT, _Traits>& 02447 operator>>(basic_istream<_CharT, _Traits>& __is, 02448 __gnu_cxx::__versa_string<_CharT, _Traits, 02449 _Alloc, _Base>& __str); 02450 02451 /** 02452 * @brief Write string to a stream. 02453 * @param __os Output stream. 02454 * @param __str String to write out. 02455 * @return Reference to the output stream. 02456 * 02457 * Output characters of @a __str into os following the same rules as for 02458 * writing a C string. 02459 */ 02460 template<typename _CharT, typename _Traits, typename _Alloc, 02461 template <typename, typename, typename> class _Base> 02462 inline basic_ostream<_CharT, _Traits>& 02463 operator<<(basic_ostream<_CharT, _Traits>& __os, 02464 const __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, 02465 _Base>& __str) 02466 { 02467 // _GLIBCXX_RESOLVE_LIB_DEFECTS 02468 // 586. string inserter not a formatted function 02469 return __ostream_insert(__os, __str.data(), __str.size()); 02470 } 02471 02472 /** 02473 * @brief Read a line from stream into a string. 02474 * @param __is Input stream. 02475 * @param __str Buffer to store into. 02476 * @param __delim Character marking end of line. 02477 * @return Reference to the input stream. 02478 * 02479 * Stores characters from @a __is into @a __str until @a __delim is 02480 * found, the end of the stream is encountered, or str.max_size() 02481 * is reached. If is.width() is non-zero, that is the limit on the 02482 * number of characters stored into @a __str. Any previous 02483 * contents of @a __str are erased. If @a delim was encountered, 02484 * it is extracted but not stored into @a __str. 02485 */ 02486 template<typename _CharT, typename _Traits, typename _Alloc, 02487 template <typename, typename, typename> class _Base> 02488 basic_istream<_CharT, _Traits>& 02489 getline(basic_istream<_CharT, _Traits>& __is, 02490 __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str, 02491 _CharT __delim); 02492 02493 /** 02494 * @brief Read a line from stream into a string. 02495 * @param __is Input stream. 02496 * @param __str Buffer to store into. 02497 * @return Reference to the input stream. 02498 * 02499 * Stores characters from is into @a __str until '\n' is 02500 * found, the end of the stream is encountered, or str.max_size() 02501 * is reached. If is.width() is non-zero, that is the limit on the 02502 * number of characters stored into @a __str. Any previous 02503 * contents of @a __str are erased. If end of line was 02504 * encountered, it is extracted but not stored into @a __str. 02505 */ 02506 template<typename _CharT, typename _Traits, typename _Alloc, 02507 template <typename, typename, typename> class _Base> 02508 inline basic_istream<_CharT, _Traits>& 02509 getline(basic_istream<_CharT, _Traits>& __is, 02510 __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str) 02511 { return getline(__is, __str, __is.widen('\n')); } 02512 02513 _GLIBCXX_END_NAMESPACE_VERSION 02514 } // namespace 02515 02516 #if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99)) 02517 02518 #include <ext/string_conversions.h> 02519 02520 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 02521 { 02522 _GLIBCXX_BEGIN_NAMESPACE_VERSION 02523 02524 // 21.4 Numeric Conversions [string.conversions]. 02525 inline int 02526 stoi(const __vstring& __str, std::size_t* __idx = 0, int __base = 10) 02527 { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(), 02528 __idx, __base); } 02529 02530 inline long 02531 stol(const __vstring& __str, std::size_t* __idx = 0, int __base = 10) 02532 { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(), 02533 __idx, __base); } 02534 02535 inline unsigned long 02536 stoul(const __vstring& __str, std::size_t* __idx = 0, int __base = 10) 02537 { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(), 02538 __idx, __base); } 02539 02540 inline long long 02541 stoll(const __vstring& __str, std::size_t* __idx = 0, int __base = 10) 02542 { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(), 02543 __idx, __base); } 02544 02545 inline unsigned long long 02546 stoull(const __vstring& __str, std::size_t* __idx, int __base = 10) 02547 { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(), 02548 __idx, __base); } 02549 02550 // NB: strtof vs strtod. 02551 inline float 02552 stof(const __vstring& __str, std::size_t* __idx = 0) 02553 { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); } 02554 02555 inline double 02556 stod(const __vstring& __str, std::size_t* __idx = 0) 02557 { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); } 02558 02559 inline long double 02560 stold(const __vstring& __str, std::size_t* __idx = 0) 02561 { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); } 02562 02563 // NB: (v)snprintf vs sprintf. 02564 02565 // DR 1261. 02566 inline __vstring 02567 to_string(int __val) 02568 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 4 * sizeof(int), 02569 "%d", __val); } 02570 02571 inline __vstring 02572 to_string(unsigned __val) 02573 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 02574 4 * sizeof(unsigned), 02575 "%u", __val); } 02576 02577 inline __vstring 02578 to_string(long __val) 02579 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 02580 4 * sizeof(long), 02581 "%ld", __val); } 02582 02583 inline __vstring 02584 to_string(unsigned long __val) 02585 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 02586 4 * sizeof(unsigned long), 02587 "%lu", __val); } 02588 02589 02590 inline __vstring 02591 to_string(long long __val) 02592 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 02593 4 * sizeof(long long), 02594 "%lld", __val); } 02595 02596 inline __vstring 02597 to_string(unsigned long long __val) 02598 { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 02599 4 * sizeof(unsigned long long), 02600 "%llu", __val); } 02601 02602 inline __vstring 02603 to_string(float __val) 02604 { 02605 const int __n = __numeric_traits<float>::__max_exponent10 + 20; 02606 return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n, 02607 "%f", __val); 02608 } 02609 02610 inline __vstring 02611 to_string(double __val) 02612 { 02613 const int __n = __numeric_traits<double>::__max_exponent10 + 20; 02614 return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n, 02615 "%f", __val); 02616 } 02617 02618 inline __vstring 02619 to_string(long double __val) 02620 { 02621 const int __n = __numeric_traits<long double>::__max_exponent10 + 20; 02622 return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n, 02623 "%Lf", __val); 02624 } 02625 02626 #ifdef _GLIBCXX_USE_WCHAR_T 02627 inline int 02628 stoi(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) 02629 { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(), 02630 __idx, __base); } 02631 02632 inline long 02633 stol(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) 02634 { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(), 02635 __idx, __base); } 02636 02637 inline unsigned long 02638 stoul(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) 02639 { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(), 02640 __idx, __base); } 02641 02642 inline long long 02643 stoll(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) 02644 { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(), 02645 __idx, __base); } 02646 02647 inline unsigned long long 02648 stoull(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10) 02649 { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(), 02650 __idx, __base); } 02651 02652 // NB: wcstof vs wcstod. 02653 inline float 02654 stof(const __wvstring& __str, std::size_t* __idx = 0) 02655 { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); } 02656 02657 inline double 02658 stod(const __wvstring& __str, std::size_t* __idx = 0) 02659 { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); } 02660 02661 inline long double 02662 stold(const __wvstring& __str, std::size_t* __idx = 0) 02663 { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); } 02664 02665 #ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF 02666 // DR 1261. 02667 inline __wvstring 02668 to_wstring(int __val) 02669 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 02670 4 * sizeof(int), 02671 L"%d", __val); } 02672 02673 inline __wvstring 02674 to_wstring(unsigned __val) 02675 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 02676 4 * sizeof(unsigned), 02677 L"%u", __val); } 02678 02679 inline __wvstring 02680 to_wstring(long __val) 02681 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 02682 4 * sizeof(long), 02683 L"%ld", __val); } 02684 02685 inline __wvstring 02686 to_wstring(unsigned long __val) 02687 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 02688 4 * sizeof(unsigned long), 02689 L"%lu", __val); } 02690 02691 inline __wvstring 02692 to_wstring(long long __val) 02693 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 02694 4 * sizeof(long long), 02695 L"%lld", __val); } 02696 02697 inline __wvstring 02698 to_wstring(unsigned long long __val) 02699 { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, 02700 4 * sizeof(unsigned long long), 02701 L"%llu", __val); } 02702 02703 inline __wvstring 02704 to_wstring(float __val) 02705 { 02706 const int __n = __numeric_traits<float>::__max_exponent10 + 20; 02707 return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n, 02708 L"%f", __val); 02709 } 02710 02711 inline __wvstring 02712 to_wstring(double __val) 02713 { 02714 const int __n = __numeric_traits<double>::__max_exponent10 + 20; 02715 return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n, 02716 L"%f", __val); 02717 } 02718 02719 inline __wvstring 02720 to_wstring(long double __val) 02721 { 02722 const int __n = __numeric_traits<long double>::__max_exponent10 + 20; 02723 return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n, 02724 L"%Lf", __val); 02725 } 02726 #endif 02727 #endif 02728 02729 _GLIBCXX_END_NAMESPACE_VERSION 02730 } // namespace 02731 02732 #endif 02733 02734 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 02735 02736 #include <bits/functional_hash.h> 02737 02738 namespace std _GLIBCXX_VISIBILITY(default) 02739 { 02740 _GLIBCXX_BEGIN_NAMESPACE_VERSION 02741 02742 /// std::hash specialization for __vstring. 02743 template<> 02744 struct hash<__gnu_cxx::__vstring> 02745 : public __hash_base<size_t, __gnu_cxx::__vstring> 02746 { 02747 size_t 02748 operator()(const __gnu_cxx::__vstring& __s) const 02749 { return std::_Hash_impl::hash(__s.data(), __s.length()); } 02750 }; 02751 02752 #ifdef _GLIBCXX_USE_WCHAR_T 02753 /// std::hash specialization for __wvstring. 02754 template<> 02755 struct hash<__gnu_cxx::__wvstring> 02756 : public __hash_base<size_t, __gnu_cxx::__wvstring> 02757 { 02758 size_t 02759 operator()(const __gnu_cxx::__wvstring& __s) const 02760 { return std::_Hash_impl::hash(__s.data(), 02761 __s.length() * sizeof(wchar_t)); } 02762 }; 02763 #endif 02764 02765 #ifdef _GLIBCXX_USE_C99_STDINT_TR1 02766 /// std::hash specialization for __u16vstring. 02767 template<> 02768 struct hash<__gnu_cxx::__u16vstring> 02769 : public __hash_base<size_t, __gnu_cxx::__u16vstring> 02770 { 02771 size_t 02772 operator()(const __gnu_cxx::__u16vstring& __s) const 02773 { return std::_Hash_impl::hash(__s.data(), 02774 __s.length() * sizeof(char16_t)); } 02775 }; 02776 02777 /// std::hash specialization for __u32vstring. 02778 template<> 02779 struct hash<__gnu_cxx::__u32vstring> 02780 : public __hash_base<size_t, __gnu_cxx::__u32vstring> 02781 { 02782 size_t 02783 operator()(const __gnu_cxx::__u32vstring& __s) const 02784 { return std::_Hash_impl::hash(__s.data(), 02785 __s.length() * sizeof(char32_t)); } 02786 }; 02787 #endif 02788 02789 _GLIBCXX_END_NAMESPACE_VERSION 02790 } // namespace 02791 02792 #endif /* __GXX_EXPERIMENTAL_CXX0X__ */ 02793 02794 #include "vstring.tcc" 02795 02796 #endif /* _VSTRING_H */