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