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