1132720Skan// Debugging string implementation -*- C++ -*- 2132720Skan 3169691Skan// Copyright (C) 2003, 2005, 2006 4132720Skan// Free Software Foundation, Inc. 5132720Skan// 6132720Skan// This file is part of the GNU ISO C++ Library. This library is free 7132720Skan// software; you can redistribute it and/or modify it under the 8132720Skan// terms of the GNU General Public License as published by the 9132720Skan// Free Software Foundation; either version 2, or (at your option) 10132720Skan// any later version. 11132720Skan 12132720Skan// This library is distributed in the hope that it will be useful, 13132720Skan// but WITHOUT ANY WARRANTY; without even the implied warranty of 14132720Skan// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15132720Skan// GNU General Public License for more details. 16132720Skan 17132720Skan// You should have received a copy of the GNU General Public License along 18132720Skan// with this library; see the file COPYING. If not, write to the Free 19169691Skan// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 20132720Skan// USA. 21132720Skan 22132720Skan// As a special exception, you may use this file as part of a free software 23132720Skan// library without restriction. Specifically, if other files instantiate 24132720Skan// templates or use macros or inline functions from this file, or you compile 25132720Skan// this file and link it with other files to produce an executable, this 26132720Skan// file does not by itself cause the resulting executable to be covered by 27132720Skan// the GNU General Public License. This exception does not however 28132720Skan// invalidate any other reasons why the executable file might be covered by 29132720Skan// the GNU General Public License. 30132720Skan 31169691Skan/** @file debug/string 32169691Skan * This file is a GNU debug extension to the Standard C++ Library. 33169691Skan */ 34169691Skan 35132720Skan#ifndef _GLIBCXX_DEBUG_STRING 36132720Skan#define _GLIBCXX_DEBUG_STRING 1 37132720Skan 38132720Skan#include <string> 39132720Skan#include <debug/safe_sequence.h> 40132720Skan#include <debug/safe_iterator.h> 41132720Skan 42132720Skannamespace __gnu_debug 43132720Skan{ 44169691Skan template<typename _CharT, typename _Traits = std::char_traits<_CharT>, 45169691Skan typename _Allocator = std::allocator<_CharT> > 46132720Skan class basic_string 47132720Skan : public std::basic_string<_CharT, _Traits, _Allocator>, 48132720Skan public __gnu_debug::_Safe_sequence<basic_string<_CharT, _Traits, 49132720Skan _Allocator> > 50132720Skan { 51132720Skan typedef std::basic_string<_CharT, _Traits, _Allocator> _Base; 52132720Skan typedef __gnu_debug::_Safe_sequence<basic_string> _Safe_base; 53132720Skan 54132720Skan public: 55132720Skan // types: 56132720Skan typedef _Traits traits_type; 57132720Skan typedef typename _Traits::char_type value_type; 58132720Skan typedef _Allocator allocator_type; 59169691Skan typedef typename _Base::size_type size_type; 60169691Skan typedef typename _Base::difference_type difference_type; 61169691Skan typedef typename _Base::reference reference; 62169691Skan typedef typename _Base::const_reference const_reference; 63169691Skan typedef typename _Base::pointer pointer; 64169691Skan typedef typename _Base::const_pointer const_pointer; 65132720Skan 66132720Skan typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, basic_string> 67132720Skan iterator; 68132720Skan typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator, 69132720Skan basic_string> const_iterator; 70132720Skan 71132720Skan typedef std::reverse_iterator<iterator> reverse_iterator; 72132720Skan typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 73132720Skan 74132720Skan using _Base::npos; 75132720Skan 76132720Skan // 21.3.1 construct/copy/destroy: 77132720Skan explicit basic_string(const _Allocator& __a = _Allocator()) 78132720Skan : _Base(__a) 79132720Skan { } 80132720Skan 81132720Skan // Provides conversion from a release-mode string to a debug-mode string 82132720Skan basic_string(const _Base& __base) : _Base(__base), _Safe_base() { } 83132720Skan 84132720Skan // _GLIBCXX_RESOLVE_LIB_DEFECTS 85132720Skan // 42. string ctors specify wrong default allocator 86132720Skan basic_string(const basic_string& __str) 87132720Skan : _Base(__str, 0, _Base::npos, __str.get_allocator()), _Safe_base() 88132720Skan { } 89132720Skan 90132720Skan // _GLIBCXX_RESOLVE_LIB_DEFECTS 91132720Skan // 42. string ctors specify wrong default allocator 92132720Skan basic_string(const basic_string& __str, size_type __pos, 93132720Skan size_type __n = _Base::npos, 94132720Skan const _Allocator& __a = _Allocator()) 95132720Skan : _Base(__str, __pos, __n, __a) 96132720Skan { } 97132720Skan 98132720Skan basic_string(const _CharT* __s, size_type __n, 99132720Skan const _Allocator& __a = _Allocator()) 100132720Skan : _Base(__gnu_debug::__check_string(__s, __n), __n, __a) 101132720Skan { } 102132720Skan 103132720Skan basic_string(const _CharT* __s, const _Allocator& __a = _Allocator()) 104132720Skan : _Base(__gnu_debug::__check_string(__s), __a) 105132720Skan { this->assign(__s); } 106132720Skan 107132720Skan basic_string(size_type __n, _CharT __c, 108132720Skan const _Allocator& __a = _Allocator()) 109132720Skan : _Base(__n, __c, __a) 110132720Skan { } 111132720Skan 112132720Skan template<typename _InputIterator> 113132720Skan basic_string(_InputIterator __begin, _InputIterator __end, 114132720Skan const _Allocator& __a = _Allocator()) 115132720Skan : _Base(__gnu_debug::__check_valid_range(__begin, __end), __end, __a) 116132720Skan { } 117132720Skan 118132720Skan ~basic_string() { } 119132720Skan 120132720Skan basic_string& 121132720Skan operator=(const basic_string& __str) 122132720Skan { 123132720Skan *static_cast<_Base*>(this) = __str; 124132720Skan this->_M_invalidate_all(); 125132720Skan return *this; 126132720Skan } 127132720Skan 128132720Skan basic_string& 129132720Skan operator=(const _CharT* __s) 130132720Skan { 131132720Skan __glibcxx_check_string(__s); 132132720Skan *static_cast<_Base*>(this) = __s; 133132720Skan this->_M_invalidate_all(); 134132720Skan return *this; 135132720Skan } 136132720Skan 137132720Skan basic_string& 138132720Skan operator=(_CharT __c) 139132720Skan { 140132720Skan *static_cast<_Base*>(this) = __c; 141132720Skan this->_M_invalidate_all(); 142132720Skan return *this; 143132720Skan } 144132720Skan 145132720Skan // 21.3.2 iterators: 146132720Skan iterator 147132720Skan begin() 148132720Skan { return iterator(_Base::begin(), this); } 149132720Skan 150132720Skan const_iterator 151132720Skan begin() const 152132720Skan { return const_iterator(_Base::begin(), this); } 153132720Skan 154132720Skan iterator 155132720Skan end() 156132720Skan { return iterator(_Base::end(), this); } 157132720Skan 158132720Skan const_iterator 159132720Skan end() const 160132720Skan { return const_iterator(_Base::end(), this); } 161132720Skan 162132720Skan reverse_iterator 163132720Skan rbegin() 164132720Skan { return reverse_iterator(end()); } 165132720Skan 166132720Skan const_reverse_iterator 167132720Skan rbegin() const 168132720Skan { return const_reverse_iterator(end()); } 169132720Skan 170132720Skan reverse_iterator 171132720Skan rend() 172132720Skan { return reverse_iterator(begin()); } 173132720Skan 174132720Skan const_reverse_iterator 175132720Skan rend() const 176132720Skan { return const_reverse_iterator(begin()); } 177132720Skan 178132720Skan // 21.3.3 capacity: 179132720Skan using _Base::size; 180132720Skan using _Base::length; 181132720Skan using _Base::max_size; 182132720Skan 183132720Skan void 184132720Skan resize(size_type __n, _CharT __c) 185132720Skan { 186132720Skan _Base::resize(__n, __c); 187132720Skan this->_M_invalidate_all(); 188132720Skan } 189132720Skan 190132720Skan void 191132720Skan resize(size_type __n) 192132720Skan { this->resize(__n, _CharT()); } 193132720Skan 194132720Skan using _Base::capacity; 195132720Skan using _Base::reserve; 196132720Skan 197132720Skan void 198132720Skan clear() 199132720Skan { 200132720Skan _Base::clear(); 201132720Skan this->_M_invalidate_all(); 202132720Skan } 203132720Skan 204132720Skan using _Base::empty; 205132720Skan 206132720Skan // 21.3.4 element access: 207132720Skan const_reference 208132720Skan operator[](size_type __pos) const 209132720Skan { 210132720Skan _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(), 211169691Skan _M_message(__gnu_debug::__msg_subscript_oob) 212132720Skan ._M_sequence(*this, "this") 213132720Skan ._M_integer(__pos, "__pos") 214132720Skan ._M_integer(this->size(), "size")); 215132720Skan return _M_base()[__pos]; 216132720Skan } 217132720Skan 218132720Skan reference 219132720Skan operator[](size_type __pos) 220132720Skan { 221169691Skan#ifdef _GLIBCXX_DEBUG_PEDANTIC 222132720Skan __glibcxx_check_subscript(__pos); 223169691Skan#else 224169691Skan // as an extension v3 allows s[s.size()] when s is non-const. 225169691Skan _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(), 226169691Skan _M_message(__gnu_debug::__msg_subscript_oob) 227169691Skan ._M_sequence(*this, "this") 228169691Skan ._M_integer(__pos, "__pos") 229169691Skan ._M_integer(this->size(), "size")); 230169691Skan#endif 231132720Skan return _M_base()[__pos]; 232132720Skan } 233132720Skan 234132720Skan using _Base::at; 235132720Skan 236132720Skan // 21.3.5 modifiers: 237132720Skan basic_string& 238132720Skan operator+=(const basic_string& __str) 239132720Skan { 240132720Skan _M_base() += __str; 241132720Skan this->_M_invalidate_all(); 242132720Skan return *this; 243132720Skan } 244132720Skan 245132720Skan basic_string& 246132720Skan operator+=(const _CharT* __s) 247132720Skan { 248132720Skan __glibcxx_check_string(__s); 249132720Skan _M_base() += __s; 250132720Skan this->_M_invalidate_all(); 251132720Skan return *this; 252132720Skan } 253132720Skan 254132720Skan basic_string& 255132720Skan operator+=(_CharT __c) 256132720Skan { 257132720Skan _M_base() += __c; 258132720Skan this->_M_invalidate_all(); 259132720Skan return *this; 260132720Skan } 261132720Skan 262132720Skan basic_string& 263132720Skan append(const basic_string& __str) 264132720Skan { 265132720Skan _Base::append(__str); 266132720Skan this->_M_invalidate_all(); 267132720Skan return *this; 268132720Skan } 269132720Skan 270132720Skan basic_string& 271132720Skan append(const basic_string& __str, size_type __pos, size_type __n) 272132720Skan { 273132720Skan _Base::append(__str, __pos, __n); 274132720Skan this->_M_invalidate_all(); 275132720Skan return *this; 276132720Skan } 277132720Skan 278132720Skan basic_string& 279132720Skan append(const _CharT* __s, size_type __n) 280132720Skan { 281132720Skan __glibcxx_check_string_len(__s, __n); 282132720Skan _Base::append(__s, __n); 283132720Skan this->_M_invalidate_all(); 284132720Skan return *this; 285132720Skan } 286132720Skan 287132720Skan basic_string& 288132720Skan append(const _CharT* __s) 289132720Skan { 290132720Skan __glibcxx_check_string(__s); 291132720Skan _Base::append(__s); 292132720Skan this->_M_invalidate_all(); 293132720Skan return *this; 294132720Skan } 295132720Skan 296132720Skan basic_string& 297132720Skan append(size_type __n, _CharT __c) 298132720Skan { 299132720Skan _Base::append(__n, __c); 300132720Skan this->_M_invalidate_all(); 301132720Skan return *this; 302132720Skan } 303132720Skan 304132720Skan template<typename _InputIterator> 305132720Skan basic_string& 306132720Skan append(_InputIterator __first, _InputIterator __last) 307132720Skan { 308132720Skan __glibcxx_check_valid_range(__first, __last); 309132720Skan _Base::append(__first, __last); 310132720Skan this->_M_invalidate_all(); 311132720Skan return *this; 312132720Skan } 313132720Skan 314132720Skan // _GLIBCXX_RESOLVE_LIB_DEFECTS 315132720Skan // 7. string clause minor problems 316132720Skan void 317132720Skan push_back(_CharT __c) 318132720Skan { 319132720Skan _Base::push_back(__c); 320132720Skan this->_M_invalidate_all(); 321132720Skan } 322132720Skan 323132720Skan basic_string& 324132720Skan assign(const basic_string& __x) 325132720Skan { 326132720Skan _Base::assign(__x); 327132720Skan this->_M_invalidate_all(); 328132720Skan return *this; 329132720Skan } 330132720Skan 331132720Skan basic_string& 332132720Skan assign(const basic_string& __str, size_type __pos, size_type __n) 333132720Skan { 334132720Skan _Base::assign(__str, __pos, __n); 335132720Skan this->_M_invalidate_all(); 336132720Skan return *this; 337132720Skan } 338132720Skan 339132720Skan basic_string& 340132720Skan assign(const _CharT* __s, size_type __n) 341132720Skan { 342132720Skan __glibcxx_check_string_len(__s, __n); 343132720Skan _Base::assign(__s, __n); 344132720Skan this->_M_invalidate_all(); 345132720Skan return *this; 346132720Skan } 347132720Skan 348132720Skan basic_string& 349132720Skan assign(const _CharT* __s) 350132720Skan { 351132720Skan __glibcxx_check_string(__s); 352132720Skan _Base::assign(__s); 353132720Skan this->_M_invalidate_all(); 354132720Skan return *this; 355132720Skan } 356132720Skan 357132720Skan basic_string& 358132720Skan assign(size_type __n, _CharT __c) 359132720Skan { 360132720Skan _Base::assign(__n, __c); 361132720Skan this->_M_invalidate_all(); 362132720Skan return *this; 363132720Skan } 364132720Skan 365132720Skan template<typename _InputIterator> 366132720Skan basic_string& 367132720Skan assign(_InputIterator __first, _InputIterator __last) 368132720Skan { 369132720Skan __glibcxx_check_valid_range(__first, __last); 370132720Skan _Base::assign(__first, __last); 371132720Skan this->_M_invalidate_all(); 372132720Skan return *this; 373132720Skan } 374132720Skan 375132720Skan basic_string& 376132720Skan insert(size_type __pos1, const basic_string& __str) 377132720Skan { 378132720Skan _Base::insert(__pos1, __str); 379132720Skan this->_M_invalidate_all(); 380132720Skan return *this; 381132720Skan } 382132720Skan 383132720Skan basic_string& 384132720Skan insert(size_type __pos1, const basic_string& __str, 385132720Skan size_type __pos2, size_type __n) 386132720Skan { 387132720Skan _Base::insert(__pos1, __str, __pos2, __n); 388132720Skan this->_M_invalidate_all(); 389132720Skan return *this; 390132720Skan } 391132720Skan 392132720Skan basic_string& 393132720Skan insert(size_type __pos, const _CharT* __s, size_type __n) 394132720Skan { 395132720Skan __glibcxx_check_string(__s); 396132720Skan _Base::insert(__pos, __s, __n); 397132720Skan this->_M_invalidate_all(); 398132720Skan return *this; 399132720Skan } 400132720Skan 401132720Skan basic_string& 402132720Skan insert(size_type __pos, const _CharT* __s) 403132720Skan { 404132720Skan __glibcxx_check_string(__s); 405132720Skan _Base::insert(__pos, __s); 406132720Skan this->_M_invalidate_all(); 407132720Skan return *this; 408132720Skan } 409132720Skan 410132720Skan basic_string& 411132720Skan insert(size_type __pos, size_type __n, _CharT __c) 412132720Skan { 413132720Skan _Base::insert(__pos, __n, __c); 414132720Skan this->_M_invalidate_all(); 415132720Skan return *this; 416132720Skan } 417132720Skan 418132720Skan iterator 419132720Skan insert(iterator __p, _CharT __c) 420132720Skan { 421132720Skan __glibcxx_check_insert(__p); 422132720Skan typename _Base::iterator __res = _Base::insert(__p.base(), __c); 423132720Skan this->_M_invalidate_all(); 424132720Skan return iterator(__res, this); 425132720Skan } 426132720Skan 427132720Skan void 428132720Skan insert(iterator __p, size_type __n, _CharT __c) 429132720Skan { 430132720Skan __glibcxx_check_insert(__p); 431132720Skan _Base::insert(__p.base(), __n, __c); 432132720Skan this->_M_invalidate_all(); 433132720Skan } 434132720Skan 435132720Skan template<typename _InputIterator> 436132720Skan void 437132720Skan insert(iterator __p, _InputIterator __first, _InputIterator __last) 438132720Skan { 439132720Skan __glibcxx_check_insert_range(__p, __first, __last); 440132720Skan _Base::insert(__p.base(), __first, __last); 441132720Skan this->_M_invalidate_all(); 442132720Skan } 443132720Skan 444132720Skan basic_string& 445132720Skan erase(size_type __pos = 0, size_type __n = _Base::npos) 446132720Skan { 447132720Skan _Base::erase(__pos, __n); 448132720Skan this->_M_invalidate_all(); 449132720Skan return *this; 450132720Skan } 451132720Skan 452132720Skan iterator 453132720Skan erase(iterator __position) 454132720Skan { 455132720Skan __glibcxx_check_erase(__position); 456132720Skan typename _Base::iterator __res = _Base::erase(__position.base()); 457132720Skan this->_M_invalidate_all(); 458132720Skan return iterator(__res, this); 459132720Skan } 460132720Skan 461132720Skan iterator 462132720Skan erase(iterator __first, iterator __last) 463132720Skan { 464132720Skan // _GLIBCXX_RESOLVE_LIB_DEFECTS 465132720Skan // 151. can't currently clear() empty container 466132720Skan __glibcxx_check_erase_range(__first, __last); 467132720Skan typename _Base::iterator __res = _Base::erase(__first.base(), 468132720Skan __last.base()); 469132720Skan this->_M_invalidate_all(); 470132720Skan return iterator(__res, this); 471132720Skan } 472132720Skan 473132720Skan basic_string& 474132720Skan replace(size_type __pos1, size_type __n1, const basic_string& __str) 475132720Skan { 476132720Skan _Base::replace(__pos1, __n1, __str); 477132720Skan this->_M_invalidate_all(); 478132720Skan return *this; 479132720Skan } 480132720Skan 481132720Skan basic_string& 482132720Skan replace(size_type __pos1, size_type __n1, const basic_string& __str, 483132720Skan size_type __pos2, size_type __n2) 484132720Skan { 485132720Skan _Base::replace(__pos1, __n1, __str, __pos2, __n2); 486132720Skan this->_M_invalidate_all(); 487132720Skan return *this; 488132720Skan } 489132720Skan 490132720Skan basic_string& 491132720Skan replace(size_type __pos, size_type __n1, const _CharT* __s, 492132720Skan size_type __n2) 493132720Skan { 494132720Skan __glibcxx_check_string_len(__s, __n2); 495132720Skan _Base::replace(__pos, __n1, __s, __n2); 496132720Skan this->_M_invalidate_all(); 497132720Skan return *this; 498132720Skan } 499132720Skan 500132720Skan basic_string& 501132720Skan replace(size_type __pos, size_type __n1, const _CharT* __s) 502132720Skan { 503132720Skan __glibcxx_check_string(__s); 504132720Skan _Base::replace(__pos, __n1, __s); 505132720Skan this->_M_invalidate_all(); 506132720Skan return *this; 507132720Skan } 508132720Skan 509132720Skan basic_string& 510132720Skan replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) 511132720Skan { 512132720Skan _Base::replace(__pos, __n1, __n2, __c); 513132720Skan this->_M_invalidate_all(); 514132720Skan return *this; 515132720Skan } 516132720Skan 517132720Skan basic_string& 518132720Skan replace(iterator __i1, iterator __i2, const basic_string& __str) 519132720Skan { 520132720Skan __glibcxx_check_erase_range(__i1, __i2); 521132720Skan _Base::replace(__i1.base(), __i2.base(), __str); 522132720Skan this->_M_invalidate_all(); 523132720Skan return *this; 524132720Skan } 525132720Skan 526132720Skan basic_string& 527132720Skan replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n) 528132720Skan { 529132720Skan __glibcxx_check_erase_range(__i1, __i2); 530132720Skan __glibcxx_check_string_len(__s, __n); 531132720Skan _Base::replace(__i1.base(), __i2.base(), __s, __n); 532132720Skan this->_M_invalidate_all(); 533132720Skan return *this; 534132720Skan } 535132720Skan 536132720Skan basic_string& 537132720Skan replace(iterator __i1, iterator __i2, const _CharT* __s) 538132720Skan { 539132720Skan __glibcxx_check_erase_range(__i1, __i2); 540132720Skan __glibcxx_check_string(__s); 541132720Skan _Base::replace(__i1.base(), __i2.base(), __s); 542132720Skan this->_M_invalidate_all(); 543132720Skan return *this; 544132720Skan } 545132720Skan 546132720Skan basic_string& 547132720Skan replace(iterator __i1, iterator __i2, size_type __n, _CharT __c) 548132720Skan { 549132720Skan __glibcxx_check_erase_range(__i1, __i2); 550132720Skan _Base::replace(__i1.base(), __i2.base(), __n, __c); 551132720Skan this->_M_invalidate_all(); 552132720Skan return *this; 553132720Skan } 554132720Skan 555132720Skan template<typename _InputIterator> 556132720Skan basic_string& 557132720Skan replace(iterator __i1, iterator __i2, 558132720Skan _InputIterator __j1, _InputIterator __j2) 559132720Skan { 560132720Skan __glibcxx_check_erase_range(__i1, __i2); 561132720Skan __glibcxx_check_valid_range(__j1, __j2); 562132720Skan _Base::replace(__i1.base(), __i2.base(), __j1, __j2); 563132720Skan this->_M_invalidate_all(); 564132720Skan return *this; 565132720Skan } 566132720Skan 567132720Skan size_type 568132720Skan copy(_CharT* __s, size_type __n, size_type __pos = 0) const 569132720Skan { 570132720Skan __glibcxx_check_string_len(__s, __n); 571132720Skan return _Base::copy(__s, __n, __pos); 572132720Skan } 573132720Skan 574132720Skan void 575132720Skan swap(basic_string<_CharT,_Traits,_Allocator>& __x) 576132720Skan { 577132720Skan _Base::swap(__x); 578132720Skan this->_M_swap(__x); 579132720Skan this->_M_invalidate_all(); 580132720Skan __x._M_invalidate_all(); 581132720Skan } 582132720Skan 583132720Skan // 21.3.6 string operations: 584132720Skan const _CharT* 585132720Skan c_str() const 586132720Skan { 587132720Skan const _CharT* __res = _Base::c_str(); 588132720Skan this->_M_invalidate_all(); 589132720Skan return __res; 590132720Skan } 591132720Skan 592132720Skan const _CharT* 593132720Skan data() const 594132720Skan { 595132720Skan const _CharT* __res = _Base::data(); 596132720Skan this->_M_invalidate_all(); 597132720Skan return __res; 598132720Skan } 599132720Skan 600132720Skan using _Base::get_allocator; 601132720Skan 602132720Skan size_type 603132720Skan find(const basic_string& __str, size_type __pos = 0) const 604132720Skan { return _Base::find(__str, __pos); } 605132720Skan 606132720Skan size_type 607132720Skan find(const _CharT* __s, size_type __pos, size_type __n) const 608132720Skan { 609132720Skan __glibcxx_check_string(__s); 610132720Skan return _Base::find(__s, __pos, __n); 611132720Skan } 612132720Skan 613132720Skan size_type 614132720Skan find(const _CharT* __s, size_type __pos = 0) const 615132720Skan { 616132720Skan __glibcxx_check_string(__s); 617132720Skan return _Base::find(__s, __pos); 618132720Skan } 619132720Skan 620132720Skan size_type 621132720Skan find(_CharT __c, size_type __pos = 0) const 622132720Skan { return _Base::find(__c, __pos); } 623132720Skan 624132720Skan size_type 625132720Skan rfind(const basic_string& __str, size_type __pos = _Base::npos) const 626132720Skan { return _Base::rfind(__str, __pos); } 627132720Skan 628132720Skan size_type 629132720Skan rfind(const _CharT* __s, size_type __pos, size_type __n) const 630132720Skan { 631132720Skan __glibcxx_check_string_len(__s, __n); 632132720Skan return _Base::rfind(__s, __pos, __n); 633132720Skan } 634132720Skan 635132720Skan size_type 636132720Skan rfind(const _CharT* __s, size_type __pos = _Base::npos) const 637132720Skan { 638132720Skan __glibcxx_check_string(__s); 639132720Skan return _Base::rfind(__s, __pos); 640132720Skan } 641132720Skan 642132720Skan size_type 643132720Skan rfind(_CharT __c, size_type __pos = _Base::npos) const 644132720Skan { return _Base::rfind(__c, __pos); } 645132720Skan 646132720Skan size_type 647132720Skan find_first_of(const basic_string& __str, size_type __pos = 0) const 648132720Skan { return _Base::find_first_of(__str, __pos); } 649132720Skan 650132720Skan size_type 651132720Skan find_first_of(const _CharT* __s, size_type __pos, size_type __n) const 652132720Skan { 653132720Skan __glibcxx_check_string(__s); 654132720Skan return _Base::find_first_of(__s, __pos, __n); 655132720Skan } 656132720Skan 657132720Skan size_type 658132720Skan find_first_of(const _CharT* __s, size_type __pos = 0) const 659132720Skan { 660132720Skan __glibcxx_check_string(__s); 661132720Skan return _Base::find_first_of(__s, __pos); 662132720Skan } 663132720Skan 664132720Skan size_type 665132720Skan find_first_of(_CharT __c, size_type __pos = 0) const 666132720Skan { return _Base::find_first_of(__c, __pos); } 667132720Skan 668132720Skan size_type 669169691Skan find_last_of(const basic_string& __str, 670169691Skan size_type __pos = _Base::npos) const 671132720Skan { return _Base::find_last_of(__str, __pos); } 672132720Skan 673132720Skan size_type 674132720Skan find_last_of(const _CharT* __s, size_type __pos, size_type __n) const 675132720Skan { 676132720Skan __glibcxx_check_string(__s); 677132720Skan return _Base::find_last_of(__s, __pos, __n); 678132720Skan } 679132720Skan 680132720Skan size_type 681132720Skan find_last_of(const _CharT* __s, size_type __pos = _Base::npos) const 682132720Skan { 683132720Skan __glibcxx_check_string(__s); 684132720Skan return _Base::find_last_of(__s, __pos); 685132720Skan } 686132720Skan 687132720Skan size_type 688132720Skan find_last_of(_CharT __c, size_type __pos = _Base::npos) const 689132720Skan { return _Base::find_last_of(__c, __pos); } 690132720Skan 691132720Skan size_type 692132720Skan find_first_not_of(const basic_string& __str, size_type __pos = 0) const 693132720Skan { return _Base::find_first_not_of(__str, __pos); } 694132720Skan 695132720Skan size_type 696132720Skan find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const 697132720Skan { 698132720Skan __glibcxx_check_string_len(__s, __n); 699132720Skan return _Base::find_first_not_of(__s, __pos, __n); 700132720Skan } 701132720Skan 702132720Skan size_type 703132720Skan find_first_not_of(const _CharT* __s, size_type __pos = 0) const 704132720Skan { 705132720Skan __glibcxx_check_string(__s); 706132720Skan return _Base::find_first_not_of(__s, __pos); 707132720Skan } 708132720Skan 709132720Skan size_type 710132720Skan find_first_not_of(_CharT __c, size_type __pos = 0) const 711132720Skan { return _Base::find_first_not_of(__c, __pos); } 712132720Skan 713132720Skan size_type 714132720Skan find_last_not_of(const basic_string& __str, 715132720Skan size_type __pos = _Base::npos) const 716132720Skan { return _Base::find_last_not_of(__str, __pos); } 717132720Skan 718132720Skan size_type 719132720Skan find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const 720132720Skan { 721132720Skan __glibcxx_check_string(__s); 722132720Skan return _Base::find_last_not_of(__s, __pos, __n); 723132720Skan } 724132720Skan 725132720Skan size_type 726132720Skan find_last_not_of(const _CharT* __s, size_type __pos = _Base::npos) const 727132720Skan { 728132720Skan __glibcxx_check_string(__s); 729132720Skan return _Base::find_last_not_of(__s, __pos); 730132720Skan } 731132720Skan 732132720Skan size_type 733132720Skan find_last_not_of(_CharT __c, size_type __pos = _Base::npos) const 734132720Skan { return _Base::find_last_not_of(__c, __pos); } 735132720Skan 736132720Skan basic_string 737132720Skan substr(size_type __pos = 0, size_type __n = _Base::npos) const 738132720Skan { return basic_string(_Base::substr(__pos, __n)); } 739132720Skan 740132720Skan int 741132720Skan compare(const basic_string& __str) const 742132720Skan { return _Base::compare(__str); } 743132720Skan 744132720Skan int 745132720Skan compare(size_type __pos1, size_type __n1, 746132720Skan const basic_string& __str) const 747132720Skan { return _Base::compare(__pos1, __n1, __str); } 748132720Skan 749132720Skan int 750132720Skan compare(size_type __pos1, size_type __n1, const basic_string& __str, 751132720Skan size_type __pos2, size_type __n2) const 752132720Skan { return _Base::compare(__pos1, __n1, __str, __pos2, __n2); } 753132720Skan 754132720Skan int 755132720Skan compare(const _CharT* __s) const 756132720Skan { 757132720Skan __glibcxx_check_string(__s); 758132720Skan return _Base::compare(__s); 759132720Skan } 760132720Skan 761132720Skan // _GLIBCXX_RESOLVE_LIB_DEFECTS 762132720Skan // 5. string::compare specification questionable 763132720Skan int 764132720Skan compare(size_type __pos1, size_type __n1, const _CharT* __s) const 765132720Skan { 766132720Skan __glibcxx_check_string(__s); 767132720Skan return _Base::compare(__pos1, __n1, __s); 768132720Skan } 769132720Skan 770132720Skan // _GLIBCXX_RESOLVE_LIB_DEFECTS 771132720Skan // 5. string::compare specification questionable 772132720Skan int 773132720Skan compare(size_type __pos1, size_type __n1,const _CharT* __s, 774132720Skan size_type __n2) const 775132720Skan { 776132720Skan __glibcxx_check_string_len(__s, __n2); 777132720Skan return _Base::compare(__pos1, __n1, __s, __n2); 778132720Skan } 779132720Skan 780132720Skan _Base& 781132720Skan _M_base() { return *this; } 782132720Skan 783132720Skan const _Base& 784132720Skan _M_base() const { return *this; } 785132720Skan 786132720Skan using _Safe_base::_M_invalidate_all; 787132720Skan }; 788132720Skan 789132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 790132720Skan inline basic_string<_CharT,_Traits,_Allocator> 791132720Skan operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 792132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 793132720Skan { return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; } 794132720Skan 795132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 796132720Skan inline basic_string<_CharT,_Traits,_Allocator> 797132720Skan operator+(const _CharT* __lhs, 798132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 799132720Skan { 800132720Skan __glibcxx_check_string(__lhs); 801132720Skan return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; 802132720Skan } 803132720Skan 804132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 805132720Skan inline basic_string<_CharT,_Traits,_Allocator> 806132720Skan operator+(_CharT __lhs, 807132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 808132720Skan { return basic_string<_CharT,_Traits,_Allocator>(1, __lhs) += __rhs; } 809132720Skan 810132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 811132720Skan inline basic_string<_CharT,_Traits,_Allocator> 812132720Skan operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 813132720Skan const _CharT* __rhs) 814132720Skan { 815132720Skan __glibcxx_check_string(__rhs); 816132720Skan return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; 817132720Skan } 818132720Skan 819132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 820132720Skan inline basic_string<_CharT,_Traits,_Allocator> 821132720Skan operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 822132720Skan _CharT __rhs) 823132720Skan { return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; } 824132720Skan 825132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 826132720Skan inline bool 827132720Skan operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 828132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 829132720Skan { return __lhs._M_base() == __rhs._M_base(); } 830132720Skan 831132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 832132720Skan inline bool 833132720Skan operator==(const _CharT* __lhs, 834132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 835132720Skan { 836132720Skan __glibcxx_check_string(__lhs); 837132720Skan return __lhs == __rhs._M_base(); 838132720Skan } 839132720Skan 840132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 841132720Skan inline bool 842132720Skan operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 843132720Skan const _CharT* __rhs) 844132720Skan { 845132720Skan __glibcxx_check_string(__rhs); 846132720Skan return __lhs._M_base() == __rhs; 847132720Skan } 848132720Skan 849132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 850132720Skan inline bool 851132720Skan operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 852132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 853132720Skan { return __lhs._M_base() != __rhs._M_base(); } 854132720Skan 855132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 856132720Skan inline bool 857132720Skan operator!=(const _CharT* __lhs, 858132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 859132720Skan { 860132720Skan __glibcxx_check_string(__lhs); 861132720Skan return __lhs != __rhs._M_base(); 862132720Skan } 863132720Skan 864132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 865132720Skan inline bool 866132720Skan operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 867132720Skan const _CharT* __rhs) 868132720Skan { 869132720Skan __glibcxx_check_string(__rhs); 870132720Skan return __lhs._M_base() != __rhs; 871132720Skan } 872132720Skan 873132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 874132720Skan inline bool 875132720Skan operator<(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 876132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 877132720Skan { return __lhs._M_base() < __rhs._M_base(); } 878132720Skan 879132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 880132720Skan inline bool 881132720Skan operator<(const _CharT* __lhs, 882132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 883132720Skan { 884132720Skan __glibcxx_check_string(__lhs); 885132720Skan return __lhs < __rhs._M_base(); 886132720Skan } 887132720Skan 888132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 889132720Skan inline bool 890132720Skan operator<(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 891132720Skan const _CharT* __rhs) 892132720Skan { 893132720Skan __glibcxx_check_string(__rhs); 894132720Skan return __lhs._M_base() < __rhs; 895132720Skan } 896132720Skan 897132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 898132720Skan inline bool 899132720Skan operator<=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 900132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 901132720Skan { return __lhs._M_base() <= __rhs._M_base(); } 902132720Skan 903132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 904132720Skan inline bool 905132720Skan operator<=(const _CharT* __lhs, 906132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 907132720Skan { 908132720Skan __glibcxx_check_string(__lhs); 909132720Skan return __lhs <= __rhs._M_base(); 910132720Skan } 911132720Skan 912132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 913132720Skan inline bool 914132720Skan operator<=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 915132720Skan const _CharT* __rhs) 916132720Skan { 917132720Skan __glibcxx_check_string(__rhs); 918132720Skan return __lhs._M_base() <= __rhs; 919132720Skan } 920132720Skan 921132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 922132720Skan inline bool 923132720Skan operator>=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 924132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 925132720Skan { return __lhs._M_base() >= __rhs._M_base(); } 926132720Skan 927132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 928132720Skan inline bool 929132720Skan operator>=(const _CharT* __lhs, 930132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 931132720Skan { 932132720Skan __glibcxx_check_string(__lhs); 933132720Skan return __lhs >= __rhs._M_base(); 934132720Skan } 935132720Skan 936132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 937132720Skan inline bool 938132720Skan operator>=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 939132720Skan const _CharT* __rhs) 940132720Skan { 941132720Skan __glibcxx_check_string(__rhs); 942132720Skan return __lhs._M_base() >= __rhs; 943132720Skan } 944132720Skan 945132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 946132720Skan inline bool 947132720Skan operator>(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 948132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 949132720Skan { return __lhs._M_base() > __rhs._M_base(); } 950132720Skan 951132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 952132720Skan inline bool 953132720Skan operator>(const _CharT* __lhs, 954132720Skan const basic_string<_CharT,_Traits,_Allocator>& __rhs) 955132720Skan { 956132720Skan __glibcxx_check_string(__lhs); 957132720Skan return __lhs > __rhs._M_base(); 958132720Skan } 959132720Skan 960132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 961132720Skan inline bool 962132720Skan operator>(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 963132720Skan const _CharT* __rhs) 964132720Skan { 965132720Skan __glibcxx_check_string(__rhs); 966132720Skan return __lhs._M_base() > __rhs; 967132720Skan } 968132720Skan 969132720Skan // 21.3.7.8: 970132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 971132720Skan inline void 972132720Skan swap(basic_string<_CharT,_Traits,_Allocator>& __lhs, 973132720Skan basic_string<_CharT,_Traits,_Allocator>& __rhs) 974132720Skan { __lhs.swap(__rhs); } 975132720Skan 976132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 977132720Skan std::basic_ostream<_CharT, _Traits>& 978132720Skan operator<<(std::basic_ostream<_CharT, _Traits>& __os, 979132720Skan const basic_string<_CharT, _Traits, _Allocator>& __str) 980132720Skan { return __os << __str._M_base(); } 981132720Skan 982132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 983132720Skan std::basic_istream<_CharT,_Traits>& 984132720Skan operator>>(std::basic_istream<_CharT,_Traits>& __is, 985132720Skan basic_string<_CharT,_Traits,_Allocator>& __str) 986132720Skan { 987132720Skan std::basic_istream<_CharT,_Traits>& __res = __is >> __str._M_base(); 988132720Skan __str._M_invalidate_all(); 989132720Skan return __res; 990132720Skan } 991132720Skan 992132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 993132720Skan std::basic_istream<_CharT,_Traits>& 994132720Skan getline(std::basic_istream<_CharT,_Traits>& __is, 995132720Skan basic_string<_CharT,_Traits,_Allocator>& __str, _CharT __delim) 996132720Skan { 997132720Skan std::basic_istream<_CharT,_Traits>& __res = getline(__is, 998132720Skan __str._M_base(), 999132720Skan __delim); 1000132720Skan __str._M_invalidate_all(); 1001132720Skan return __res; 1002132720Skan } 1003132720Skan 1004132720Skan template<typename _CharT, typename _Traits, typename _Allocator> 1005132720Skan std::basic_istream<_CharT,_Traits>& 1006132720Skan getline(std::basic_istream<_CharT,_Traits>& __is, 1007132720Skan basic_string<_CharT,_Traits,_Allocator>& __str) 1008132720Skan { 1009132720Skan std::basic_istream<_CharT,_Traits>& __res = getline(__is, 1010132720Skan __str._M_base()); 1011132720Skan __str._M_invalidate_all(); 1012132720Skan return __res; 1013132720Skan } 1014169691Skan 1015169691Skan typedef basic_string<char> string; 1016169691Skan 1017169691Skan#ifdef _GLIBCXX_USE_WCHAR_T 1018169691Skan typedef basic_string<wchar_t> wstring; 1019169691Skan#endif 1020169691Skan 1021132720Skan} // namespace __gnu_debug 1022132720Skan 1023132720Skan#endif 1024