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