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