138fd1498Szrj// Debugging string implementation -*- C++ -*- 238fd1498Szrj 338fd1498Szrj// Copyright (C) 2003-2018 Free Software Foundation, Inc. 438fd1498Szrj// 538fd1498Szrj// This file is part of the GNU ISO C++ Library. This library is free 638fd1498Szrj// software; you can redistribute it and/or modify it under the 738fd1498Szrj// terms of the GNU General Public License as published by the 838fd1498Szrj// Free Software Foundation; either version 3, or (at your option) 938fd1498Szrj// any later version. 1038fd1498Szrj 1138fd1498Szrj// This library is distributed in the hope that it will be useful, 1238fd1498Szrj// but WITHOUT ANY WARRANTY; without even the implied warranty of 1338fd1498Szrj// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1438fd1498Szrj// GNU General Public License for more details. 1538fd1498Szrj 1638fd1498Szrj// Under Section 7 of GPL version 3, you are granted additional 1738fd1498Szrj// permissions described in the GCC Runtime Library Exception, version 1838fd1498Szrj// 3.1, as published by the Free Software Foundation. 1938fd1498Szrj 2038fd1498Szrj// You should have received a copy of the GNU General Public License and 2138fd1498Szrj// a copy of the GCC Runtime Library Exception along with this program; 2238fd1498Szrj// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2338fd1498Szrj// <http://www.gnu.org/licenses/>. 2438fd1498Szrj 2538fd1498Szrj/** @file debug/string 2638fd1498Szrj * This file is a GNU debug extension to the Standard C++ Library. 2738fd1498Szrj */ 2838fd1498Szrj 2938fd1498Szrj#ifndef _GLIBCXX_DEBUG_STRING 3038fd1498Szrj#define _GLIBCXX_DEBUG_STRING 1 3138fd1498Szrj 3238fd1498Szrj#pragma GCC system_header 3338fd1498Szrj 3438fd1498Szrj#include <string> 3538fd1498Szrj#include <debug/safe_sequence.h> 3638fd1498Szrj#include <debug/safe_container.h> 3738fd1498Szrj#include <debug/safe_iterator.h> 3838fd1498Szrj 3938fd1498Szrjnamespace __gnu_debug 4038fd1498Szrj{ 4138fd1498Szrj/// Class std::basic_string with safety/checking/debug instrumentation. 4238fd1498Szrjtemplate<typename _CharT, typename _Traits = std::char_traits<_CharT>, 4338fd1498Szrj typename _Allocator = std::allocator<_CharT> > 4438fd1498Szrj class basic_string 4538fd1498Szrj : public __gnu_debug::_Safe_container< 4638fd1498Szrj basic_string<_CharT, _Traits, _Allocator>, 4738fd1498Szrj _Allocator, _Safe_sequence, bool(_GLIBCXX_USE_CXX11_ABI)>, 4838fd1498Szrj public std::basic_string<_CharT, _Traits, _Allocator> 4938fd1498Szrj { 5038fd1498Szrj typedef std::basic_string<_CharT, _Traits, _Allocator> _Base; 5138fd1498Szrj typedef __gnu_debug::_Safe_container< 5238fd1498Szrj basic_string, _Allocator, _Safe_sequence, bool(_GLIBCXX_USE_CXX11_ABI)> 5338fd1498Szrj _Safe; 5438fd1498Szrj 5538fd1498Szrj public: 5638fd1498Szrj // types: 5738fd1498Szrj typedef _Traits traits_type; 5838fd1498Szrj typedef typename _Traits::char_type value_type; 5938fd1498Szrj typedef _Allocator allocator_type; 6038fd1498Szrj typedef typename _Base::size_type size_type; 6138fd1498Szrj typedef typename _Base::difference_type difference_type; 6238fd1498Szrj typedef typename _Base::reference reference; 6338fd1498Szrj typedef typename _Base::const_reference const_reference; 6438fd1498Szrj typedef typename _Base::pointer pointer; 6538fd1498Szrj typedef typename _Base::const_pointer const_pointer; 6638fd1498Szrj 6738fd1498Szrj typedef __gnu_debug::_Safe_iterator< 6838fd1498Szrj typename _Base::iterator, basic_string> iterator; 6938fd1498Szrj typedef __gnu_debug::_Safe_iterator< 7038fd1498Szrj typename _Base::const_iterator, basic_string> const_iterator; 7138fd1498Szrj 7238fd1498Szrj typedef std::reverse_iterator<iterator> reverse_iterator; 7338fd1498Szrj typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 7438fd1498Szrj 7538fd1498Szrj using _Base::npos; 7638fd1498Szrj 7738fd1498Szrj basic_string() 7838fd1498Szrj _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_default_constructible<_Base>::value) 7938fd1498Szrj : _Base() { } 8038fd1498Szrj 8138fd1498Szrj // 21.3.1 construct/copy/destroy: 8238fd1498Szrj explicit 8338fd1498Szrj basic_string(const _Allocator& __a) _GLIBCXX_NOEXCEPT 8438fd1498Szrj : _Base(__a) { } 8538fd1498Szrj 8638fd1498Szrj#if __cplusplus < 201103L 8738fd1498Szrj basic_string(const basic_string& __str) 8838fd1498Szrj : _Base(__str) { } 8938fd1498Szrj 9038fd1498Szrj ~basic_string() { } 9138fd1498Szrj#else 9238fd1498Szrj basic_string(const basic_string&) = default; 9338fd1498Szrj basic_string(basic_string&&) = default; 9438fd1498Szrj 9538fd1498Szrj basic_string(std::initializer_list<_CharT> __l, 9638fd1498Szrj const _Allocator& __a = _Allocator()) 9738fd1498Szrj : _Base(__l, __a) 9838fd1498Szrj { } 9938fd1498Szrj 10038fd1498Szrj#if _GLIBCXX_USE_CXX11_ABI 10138fd1498Szrj basic_string(const basic_string& __s, const _Allocator& __a) 10238fd1498Szrj : _Base(__s, __a) { } 10338fd1498Szrj 10438fd1498Szrj basic_string(basic_string&& __s, const _Allocator& __a) 10538fd1498Szrj : _Base(std::move(__s), __a) { } 10638fd1498Szrj#endif 10738fd1498Szrj 10838fd1498Szrj ~basic_string() = default; 10938fd1498Szrj 11038fd1498Szrj // Provides conversion from a normal-mode string to a debug-mode string 11138fd1498Szrj basic_string(_Base&& __base) noexcept 11238fd1498Szrj : _Base(std::move(__base)) { } 11338fd1498Szrj#endif // C++11 11438fd1498Szrj 11538fd1498Szrj // Provides conversion from a normal-mode string to a debug-mode string 11638fd1498Szrj basic_string(const _Base& __base) 11738fd1498Szrj : _Base(__base) { } 11838fd1498Szrj 11938fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 12038fd1498Szrj // 42. string ctors specify wrong default allocator 12138fd1498Szrj basic_string(const basic_string& __str, size_type __pos, 12238fd1498Szrj size_type __n = _Base::npos, 12338fd1498Szrj const _Allocator& __a = _Allocator()) 12438fd1498Szrj : _Base(__str, __pos, __n, __a) { } 12538fd1498Szrj 12638fd1498Szrj basic_string(const _CharT* __s, size_type __n, 12738fd1498Szrj const _Allocator& __a = _Allocator()) 12838fd1498Szrj : _Base(__gnu_debug::__check_string(__s, __n), __n, __a) { } 12938fd1498Szrj 13038fd1498Szrj basic_string(const _CharT* __s, const _Allocator& __a = _Allocator()) 13138fd1498Szrj : _Base(__gnu_debug::__check_string(__s), __a) 13238fd1498Szrj { this->assign(__s); } 13338fd1498Szrj 13438fd1498Szrj basic_string(size_type __n, _CharT __c, 13538fd1498Szrj const _Allocator& __a = _Allocator()) 13638fd1498Szrj : _Base(__n, __c, __a) { } 13738fd1498Szrj 13838fd1498Szrj template<typename _InputIterator> 13938fd1498Szrj basic_string(_InputIterator __begin, _InputIterator __end, 14038fd1498Szrj const _Allocator& __a = _Allocator()) 14138fd1498Szrj : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__begin, 14238fd1498Szrj __end)), 14338fd1498Szrj __gnu_debug::__base(__end), __a) { } 14438fd1498Szrj 14538fd1498Szrj#if __cplusplus < 201103L 14638fd1498Szrj basic_string& 14738fd1498Szrj operator=(const basic_string& __str) 14838fd1498Szrj { 14938fd1498Szrj this->_M_safe() = __str; 15038fd1498Szrj _M_base() = __str; 15138fd1498Szrj return *this; 15238fd1498Szrj } 15338fd1498Szrj#else 15438fd1498Szrj basic_string& 15538fd1498Szrj operator=(const basic_string&) = default; 15638fd1498Szrj 15738fd1498Szrj basic_string& 15838fd1498Szrj operator=(basic_string&&) = default; 15938fd1498Szrj#endif 16038fd1498Szrj 16138fd1498Szrj basic_string& 16238fd1498Szrj operator=(const _CharT* __s) 16338fd1498Szrj { 16438fd1498Szrj __glibcxx_check_string(__s); 16538fd1498Szrj _M_base() = __s; 16638fd1498Szrj this->_M_invalidate_all(); 16738fd1498Szrj return *this; 16838fd1498Szrj } 16938fd1498Szrj 17038fd1498Szrj basic_string& 17138fd1498Szrj operator=(_CharT __c) 17238fd1498Szrj { 17338fd1498Szrj _M_base() = __c; 17438fd1498Szrj this->_M_invalidate_all(); 17538fd1498Szrj return *this; 17638fd1498Szrj } 17738fd1498Szrj 17838fd1498Szrj#if __cplusplus >= 201103L 17938fd1498Szrj basic_string& 18038fd1498Szrj operator=(std::initializer_list<_CharT> __l) 18138fd1498Szrj { 18238fd1498Szrj _M_base() = __l; 18338fd1498Szrj this->_M_invalidate_all(); 18438fd1498Szrj return *this; 18538fd1498Szrj } 18638fd1498Szrj#endif // C++11 18738fd1498Szrj 18838fd1498Szrj // 21.3.2 iterators: 18938fd1498Szrj iterator 19038fd1498Szrj begin() // _GLIBCXX_NOEXCEPT 19138fd1498Szrj { return iterator(_Base::begin(), this); } 19238fd1498Szrj 19338fd1498Szrj const_iterator 19438fd1498Szrj begin() const _GLIBCXX_NOEXCEPT 19538fd1498Szrj { return const_iterator(_Base::begin(), this); } 19638fd1498Szrj 19738fd1498Szrj iterator 19838fd1498Szrj end() // _GLIBCXX_NOEXCEPT 19938fd1498Szrj { return iterator(_Base::end(), this); } 20038fd1498Szrj 20138fd1498Szrj const_iterator 20238fd1498Szrj end() const _GLIBCXX_NOEXCEPT 20338fd1498Szrj { return const_iterator(_Base::end(), this); } 20438fd1498Szrj 20538fd1498Szrj reverse_iterator 20638fd1498Szrj rbegin() // _GLIBCXX_NOEXCEPT 20738fd1498Szrj { return reverse_iterator(end()); } 20838fd1498Szrj 20938fd1498Szrj const_reverse_iterator 21038fd1498Szrj rbegin() const _GLIBCXX_NOEXCEPT 21138fd1498Szrj { return const_reverse_iterator(end()); } 21238fd1498Szrj 21338fd1498Szrj reverse_iterator 21438fd1498Szrj rend() // _GLIBCXX_NOEXCEPT 21538fd1498Szrj { return reverse_iterator(begin()); } 21638fd1498Szrj 21738fd1498Szrj const_reverse_iterator 21838fd1498Szrj rend() const _GLIBCXX_NOEXCEPT 21938fd1498Szrj { return const_reverse_iterator(begin()); } 22038fd1498Szrj 22138fd1498Szrj#if __cplusplus >= 201103L 22238fd1498Szrj const_iterator 22338fd1498Szrj cbegin() const noexcept 22438fd1498Szrj { return const_iterator(_Base::begin(), this); } 22538fd1498Szrj 22638fd1498Szrj const_iterator 22738fd1498Szrj cend() const noexcept 22838fd1498Szrj { return const_iterator(_Base::end(), this); } 22938fd1498Szrj 23038fd1498Szrj const_reverse_iterator 23138fd1498Szrj crbegin() const noexcept 23238fd1498Szrj { return const_reverse_iterator(end()); } 23338fd1498Szrj 23438fd1498Szrj const_reverse_iterator 23538fd1498Szrj crend() const noexcept 23638fd1498Szrj { return const_reverse_iterator(begin()); } 23738fd1498Szrj#endif 23838fd1498Szrj 23938fd1498Szrj // 21.3.3 capacity: 24038fd1498Szrj using _Base::size; 24138fd1498Szrj using _Base::length; 24238fd1498Szrj using _Base::max_size; 24338fd1498Szrj 24438fd1498Szrj void 24538fd1498Szrj resize(size_type __n, _CharT __c) 24638fd1498Szrj { 24738fd1498Szrj _Base::resize(__n, __c); 24838fd1498Szrj this->_M_invalidate_all(); 24938fd1498Szrj } 25038fd1498Szrj 25138fd1498Szrj void 25238fd1498Szrj resize(size_type __n) 25338fd1498Szrj { this->resize(__n, _CharT()); } 25438fd1498Szrj 25538fd1498Szrj#if __cplusplus >= 201103L 25638fd1498Szrj void 25738fd1498Szrj shrink_to_fit() noexcept 25838fd1498Szrj { 25938fd1498Szrj if (capacity() > size()) 26038fd1498Szrj { 26138fd1498Szrj __try 26238fd1498Szrj { 26338fd1498Szrj reserve(0); 26438fd1498Szrj this->_M_invalidate_all(); 26538fd1498Szrj } 26638fd1498Szrj __catch(...) 26738fd1498Szrj { } 26838fd1498Szrj } 26938fd1498Szrj } 27038fd1498Szrj#endif 27138fd1498Szrj 27238fd1498Szrj using _Base::capacity; 27338fd1498Szrj using _Base::reserve; 27438fd1498Szrj 27538fd1498Szrj void 27638fd1498Szrj clear() // _GLIBCXX_NOEXCEPT 27738fd1498Szrj { 27838fd1498Szrj _Base::clear(); 27938fd1498Szrj this->_M_invalidate_all(); 28038fd1498Szrj } 28138fd1498Szrj 28238fd1498Szrj using _Base::empty; 28338fd1498Szrj 28438fd1498Szrj // 21.3.4 element access: 28538fd1498Szrj const_reference 28638fd1498Szrj operator[](size_type __pos) const _GLIBCXX_NOEXCEPT 28738fd1498Szrj { 28838fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(), 28938fd1498Szrj _M_message(__gnu_debug::__msg_subscript_oob) 29038fd1498Szrj ._M_sequence(*this, "this") 29138fd1498Szrj ._M_integer(__pos, "__pos") 29238fd1498Szrj ._M_integer(this->size(), "size")); 29338fd1498Szrj return _M_base()[__pos]; 29438fd1498Szrj } 29538fd1498Szrj 29638fd1498Szrj reference 29738fd1498Szrj operator[](size_type __pos) // _GLIBCXX_NOEXCEPT 29838fd1498Szrj { 29938fd1498Szrj#if __cplusplus < 201103L && defined(_GLIBCXX_DEBUG_PEDANTIC) 30038fd1498Szrj __glibcxx_check_subscript(__pos); 30138fd1498Szrj#else 30238fd1498Szrj // as an extension v3 allows s[s.size()] when s is non-const. 30338fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(), 30438fd1498Szrj _M_message(__gnu_debug::__msg_subscript_oob) 30538fd1498Szrj ._M_sequence(*this, "this") 30638fd1498Szrj ._M_integer(__pos, "__pos") 30738fd1498Szrj ._M_integer(this->size(), "size")); 30838fd1498Szrj#endif 30938fd1498Szrj return _M_base()[__pos]; 31038fd1498Szrj } 31138fd1498Szrj 31238fd1498Szrj using _Base::at; 31338fd1498Szrj 31438fd1498Szrj#if __cplusplus >= 201103L 31538fd1498Szrj using _Base::front; 31638fd1498Szrj using _Base::back; 31738fd1498Szrj#endif 31838fd1498Szrj 31938fd1498Szrj // 21.3.5 modifiers: 32038fd1498Szrj basic_string& 32138fd1498Szrj operator+=(const basic_string& __str) 32238fd1498Szrj { 32338fd1498Szrj _M_base() += __str; 32438fd1498Szrj this->_M_invalidate_all(); 32538fd1498Szrj return *this; 32638fd1498Szrj } 32738fd1498Szrj 32838fd1498Szrj basic_string& 32938fd1498Szrj operator+=(const _CharT* __s) 33038fd1498Szrj { 33138fd1498Szrj __glibcxx_check_string(__s); 33238fd1498Szrj _M_base() += __s; 33338fd1498Szrj this->_M_invalidate_all(); 33438fd1498Szrj return *this; 33538fd1498Szrj } 33638fd1498Szrj 33738fd1498Szrj basic_string& 33838fd1498Szrj operator+=(_CharT __c) 33938fd1498Szrj { 34038fd1498Szrj _M_base() += __c; 34138fd1498Szrj this->_M_invalidate_all(); 34238fd1498Szrj return *this; 34338fd1498Szrj } 34438fd1498Szrj 34538fd1498Szrj#if __cplusplus >= 201103L 34638fd1498Szrj basic_string& 34738fd1498Szrj operator+=(std::initializer_list<_CharT> __l) 34838fd1498Szrj { 34938fd1498Szrj _M_base() += __l; 35038fd1498Szrj this->_M_invalidate_all(); 35138fd1498Szrj return *this; 35238fd1498Szrj } 35338fd1498Szrj#endif // C++11 35438fd1498Szrj 35538fd1498Szrj basic_string& 35638fd1498Szrj append(const basic_string& __str) 35738fd1498Szrj { 35838fd1498Szrj _Base::append(__str); 35938fd1498Szrj this->_M_invalidate_all(); 36038fd1498Szrj return *this; 36138fd1498Szrj } 36238fd1498Szrj 36338fd1498Szrj basic_string& 36438fd1498Szrj append(const basic_string& __str, size_type __pos, size_type __n) 36538fd1498Szrj { 36638fd1498Szrj _Base::append(__str, __pos, __n); 36738fd1498Szrj this->_M_invalidate_all(); 36838fd1498Szrj return *this; 36938fd1498Szrj } 37038fd1498Szrj 37138fd1498Szrj basic_string& 37238fd1498Szrj append(const _CharT* __s, size_type __n) 37338fd1498Szrj { 37438fd1498Szrj __glibcxx_check_string_len(__s, __n); 37538fd1498Szrj _Base::append(__s, __n); 37638fd1498Szrj this->_M_invalidate_all(); 37738fd1498Szrj return *this; 37838fd1498Szrj } 37938fd1498Szrj 38038fd1498Szrj basic_string& 38138fd1498Szrj append(const _CharT* __s) 38238fd1498Szrj { 38338fd1498Szrj __glibcxx_check_string(__s); 38438fd1498Szrj _Base::append(__s); 38538fd1498Szrj this->_M_invalidate_all(); 38638fd1498Szrj return *this; 38738fd1498Szrj } 38838fd1498Szrj 38938fd1498Szrj basic_string& 39038fd1498Szrj append(size_type __n, _CharT __c) 39138fd1498Szrj { 39238fd1498Szrj _Base::append(__n, __c); 39338fd1498Szrj this->_M_invalidate_all(); 39438fd1498Szrj return *this; 39538fd1498Szrj } 39638fd1498Szrj 39738fd1498Szrj template<typename _InputIterator> 39838fd1498Szrj basic_string& 39938fd1498Szrj append(_InputIterator __first, _InputIterator __last) 40038fd1498Szrj { 40138fd1498Szrj typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 40238fd1498Szrj __glibcxx_check_valid_range2(__first, __last, __dist); 40338fd1498Szrj 40438fd1498Szrj if (__dist.second >= __dp_sign) 40538fd1498Szrj _Base::append(__gnu_debug::__unsafe(__first), 40638fd1498Szrj __gnu_debug::__unsafe(__last)); 40738fd1498Szrj else 40838fd1498Szrj _Base::append(__first, __last); 40938fd1498Szrj 41038fd1498Szrj this->_M_invalidate_all(); 41138fd1498Szrj return *this; 41238fd1498Szrj } 41338fd1498Szrj 41438fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 41538fd1498Szrj // 7. string clause minor problems 41638fd1498Szrj void 41738fd1498Szrj push_back(_CharT __c) 41838fd1498Szrj { 41938fd1498Szrj _Base::push_back(__c); 42038fd1498Szrj this->_M_invalidate_all(); 42138fd1498Szrj } 42238fd1498Szrj 42338fd1498Szrj basic_string& 42438fd1498Szrj assign(const basic_string& __x) 42538fd1498Szrj { 42638fd1498Szrj _Base::assign(__x); 42738fd1498Szrj this->_M_invalidate_all(); 42838fd1498Szrj return *this; 42938fd1498Szrj } 43038fd1498Szrj 43138fd1498Szrj#if __cplusplus >= 201103L 43238fd1498Szrj basic_string& 43338fd1498Szrj assign(basic_string&& __x) 43438fd1498Szrj noexcept(noexcept(std::declval<_Base&>().assign(std::move(__x)))) 43538fd1498Szrj { 43638fd1498Szrj _Base::assign(std::move(__x)); 43738fd1498Szrj this->_M_invalidate_all(); 43838fd1498Szrj return *this; 43938fd1498Szrj } 44038fd1498Szrj#endif // C++11 44138fd1498Szrj 44238fd1498Szrj basic_string& 44338fd1498Szrj assign(const basic_string& __str, size_type __pos, size_type __n) 44438fd1498Szrj { 44538fd1498Szrj _Base::assign(__str, __pos, __n); 44638fd1498Szrj this->_M_invalidate_all(); 44738fd1498Szrj return *this; 44838fd1498Szrj } 44938fd1498Szrj 45038fd1498Szrj basic_string& 45138fd1498Szrj assign(const _CharT* __s, size_type __n) 45238fd1498Szrj { 45338fd1498Szrj __glibcxx_check_string_len(__s, __n); 45438fd1498Szrj _Base::assign(__s, __n); 45538fd1498Szrj this->_M_invalidate_all(); 45638fd1498Szrj return *this; 45738fd1498Szrj } 45838fd1498Szrj 45938fd1498Szrj basic_string& 46038fd1498Szrj assign(const _CharT* __s) 46138fd1498Szrj { 46238fd1498Szrj __glibcxx_check_string(__s); 46338fd1498Szrj _Base::assign(__s); 46438fd1498Szrj this->_M_invalidate_all(); 46538fd1498Szrj return *this; 46638fd1498Szrj } 46738fd1498Szrj 46838fd1498Szrj basic_string& 46938fd1498Szrj assign(size_type __n, _CharT __c) 47038fd1498Szrj { 47138fd1498Szrj _Base::assign(__n, __c); 47238fd1498Szrj this->_M_invalidate_all(); 47338fd1498Szrj return *this; 47438fd1498Szrj } 47538fd1498Szrj 47638fd1498Szrj template<typename _InputIterator> 47738fd1498Szrj basic_string& 47838fd1498Szrj assign(_InputIterator __first, _InputIterator __last) 47938fd1498Szrj { 48038fd1498Szrj typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 48138fd1498Szrj __glibcxx_check_valid_range2(__first, __last, __dist); 48238fd1498Szrj 48338fd1498Szrj if (__dist.second >= __dp_sign) 48438fd1498Szrj _Base::assign(__gnu_debug::__unsafe(__first), 48538fd1498Szrj __gnu_debug::__unsafe(__last)); 48638fd1498Szrj else 48738fd1498Szrj _Base::assign(__first, __last); 48838fd1498Szrj 48938fd1498Szrj this->_M_invalidate_all(); 49038fd1498Szrj return *this; 49138fd1498Szrj } 49238fd1498Szrj 49338fd1498Szrj#if __cplusplus >= 201103L 49438fd1498Szrj basic_string& 49538fd1498Szrj assign(std::initializer_list<_CharT> __l) 49638fd1498Szrj { 49738fd1498Szrj _Base::assign(__l); 49838fd1498Szrj this->_M_invalidate_all(); 49938fd1498Szrj return *this; 50038fd1498Szrj } 50138fd1498Szrj#endif // C++11 50238fd1498Szrj 50338fd1498Szrj basic_string& 50438fd1498Szrj insert(size_type __pos1, const basic_string& __str) 50538fd1498Szrj { 50638fd1498Szrj _Base::insert(__pos1, __str); 50738fd1498Szrj this->_M_invalidate_all(); 50838fd1498Szrj return *this; 50938fd1498Szrj } 51038fd1498Szrj 51138fd1498Szrj basic_string& 51238fd1498Szrj insert(size_type __pos1, const basic_string& __str, 51338fd1498Szrj size_type __pos2, size_type __n) 51438fd1498Szrj { 51538fd1498Szrj _Base::insert(__pos1, __str, __pos2, __n); 51638fd1498Szrj this->_M_invalidate_all(); 51738fd1498Szrj return *this; 51838fd1498Szrj } 51938fd1498Szrj 52038fd1498Szrj basic_string& 52138fd1498Szrj insert(size_type __pos, const _CharT* __s, size_type __n) 52238fd1498Szrj { 52338fd1498Szrj __glibcxx_check_string(__s); 52438fd1498Szrj _Base::insert(__pos, __s, __n); 52538fd1498Szrj this->_M_invalidate_all(); 52638fd1498Szrj return *this; 52738fd1498Szrj } 52838fd1498Szrj 52938fd1498Szrj basic_string& 53038fd1498Szrj insert(size_type __pos, const _CharT* __s) 53138fd1498Szrj { 53238fd1498Szrj __glibcxx_check_string(__s); 53338fd1498Szrj _Base::insert(__pos, __s); 53438fd1498Szrj this->_M_invalidate_all(); 53538fd1498Szrj return *this; 53638fd1498Szrj } 53738fd1498Szrj 53838fd1498Szrj basic_string& 53938fd1498Szrj insert(size_type __pos, size_type __n, _CharT __c) 54038fd1498Szrj { 54138fd1498Szrj _Base::insert(__pos, __n, __c); 54238fd1498Szrj this->_M_invalidate_all(); 54338fd1498Szrj return *this; 54438fd1498Szrj } 54538fd1498Szrj 54638fd1498Szrj iterator 54738fd1498Szrj insert(iterator __p, _CharT __c) 54838fd1498Szrj { 54938fd1498Szrj __glibcxx_check_insert(__p); 55038fd1498Szrj typename _Base::iterator __res = _Base::insert(__p.base(), __c); 55138fd1498Szrj this->_M_invalidate_all(); 55238fd1498Szrj return iterator(__res, this); 55338fd1498Szrj } 55438fd1498Szrj 55538fd1498Szrj void 55638fd1498Szrj insert(iterator __p, size_type __n, _CharT __c) 55738fd1498Szrj { 55838fd1498Szrj __glibcxx_check_insert(__p); 55938fd1498Szrj _Base::insert(__p.base(), __n, __c); 56038fd1498Szrj this->_M_invalidate_all(); 56138fd1498Szrj } 56238fd1498Szrj 56338fd1498Szrj template<typename _InputIterator> 56438fd1498Szrj void 56538fd1498Szrj insert(iterator __p, _InputIterator __first, _InputIterator __last) 56638fd1498Szrj { 56738fd1498Szrj typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 568*58e805e6Szrj __glibcxx_check_insert_range(__p, __first, __last, __dist); 56938fd1498Szrj 57038fd1498Szrj if (__dist.second >= __dp_sign) 57138fd1498Szrj _Base::insert(__p.base(), __gnu_debug::__unsafe(__first), 57238fd1498Szrj __gnu_debug::__unsafe(__last)); 57338fd1498Szrj else 57438fd1498Szrj _Base::insert(__p.base(), __first, __last); 57538fd1498Szrj 57638fd1498Szrj this->_M_invalidate_all(); 57738fd1498Szrj } 57838fd1498Szrj 57938fd1498Szrj#if __cplusplus >= 201103L 58038fd1498Szrj void 58138fd1498Szrj insert(iterator __p, std::initializer_list<_CharT> __l) 58238fd1498Szrj { 58338fd1498Szrj __glibcxx_check_insert(__p); 58438fd1498Szrj _Base::insert(__p.base(), __l); 58538fd1498Szrj this->_M_invalidate_all(); 58638fd1498Szrj } 58738fd1498Szrj#endif // C++11 58838fd1498Szrj 58938fd1498Szrj basic_string& 59038fd1498Szrj erase(size_type __pos = 0, size_type __n = _Base::npos) 59138fd1498Szrj { 59238fd1498Szrj _Base::erase(__pos, __n); 59338fd1498Szrj this->_M_invalidate_all(); 59438fd1498Szrj return *this; 59538fd1498Szrj } 59638fd1498Szrj 59738fd1498Szrj iterator 59838fd1498Szrj erase(iterator __position) 59938fd1498Szrj { 60038fd1498Szrj __glibcxx_check_erase(__position); 60138fd1498Szrj typename _Base::iterator __res = _Base::erase(__position.base()); 60238fd1498Szrj this->_M_invalidate_all(); 60338fd1498Szrj return iterator(__res, this); 60438fd1498Szrj } 60538fd1498Szrj 60638fd1498Szrj iterator 60738fd1498Szrj erase(iterator __first, iterator __last) 60838fd1498Szrj { 60938fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 61038fd1498Szrj // 151. can't currently clear() empty container 61138fd1498Szrj __glibcxx_check_erase_range(__first, __last); 61238fd1498Szrj typename _Base::iterator __res = _Base::erase(__first.base(), 61338fd1498Szrj __last.base()); 61438fd1498Szrj this->_M_invalidate_all(); 61538fd1498Szrj return iterator(__res, this); 61638fd1498Szrj } 61738fd1498Szrj 61838fd1498Szrj#if __cplusplus >= 201103L 61938fd1498Szrj void 62038fd1498Szrj pop_back() // noexcept 62138fd1498Szrj { 62238fd1498Szrj __glibcxx_check_nonempty(); 62338fd1498Szrj _Base::pop_back(); 62438fd1498Szrj this->_M_invalidate_all(); 62538fd1498Szrj } 62638fd1498Szrj#endif // C++11 62738fd1498Szrj 62838fd1498Szrj basic_string& 62938fd1498Szrj replace(size_type __pos1, size_type __n1, const basic_string& __str) 63038fd1498Szrj { 63138fd1498Szrj _Base::replace(__pos1, __n1, __str); 63238fd1498Szrj this->_M_invalidate_all(); 63338fd1498Szrj return *this; 63438fd1498Szrj } 63538fd1498Szrj 63638fd1498Szrj basic_string& 63738fd1498Szrj replace(size_type __pos1, size_type __n1, const basic_string& __str, 63838fd1498Szrj size_type __pos2, size_type __n2) 63938fd1498Szrj { 64038fd1498Szrj _Base::replace(__pos1, __n1, __str, __pos2, __n2); 64138fd1498Szrj this->_M_invalidate_all(); 64238fd1498Szrj return *this; 64338fd1498Szrj } 64438fd1498Szrj 64538fd1498Szrj basic_string& 64638fd1498Szrj replace(size_type __pos, size_type __n1, const _CharT* __s, 64738fd1498Szrj size_type __n2) 64838fd1498Szrj { 64938fd1498Szrj __glibcxx_check_string_len(__s, __n2); 65038fd1498Szrj _Base::replace(__pos, __n1, __s, __n2); 65138fd1498Szrj this->_M_invalidate_all(); 65238fd1498Szrj return *this; 65338fd1498Szrj } 65438fd1498Szrj 65538fd1498Szrj basic_string& 65638fd1498Szrj replace(size_type __pos, size_type __n1, const _CharT* __s) 65738fd1498Szrj { 65838fd1498Szrj __glibcxx_check_string(__s); 65938fd1498Szrj _Base::replace(__pos, __n1, __s); 66038fd1498Szrj this->_M_invalidate_all(); 66138fd1498Szrj return *this; 66238fd1498Szrj } 66338fd1498Szrj 66438fd1498Szrj basic_string& 66538fd1498Szrj replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) 66638fd1498Szrj { 66738fd1498Szrj _Base::replace(__pos, __n1, __n2, __c); 66838fd1498Szrj this->_M_invalidate_all(); 66938fd1498Szrj return *this; 67038fd1498Szrj } 67138fd1498Szrj 67238fd1498Szrj basic_string& 67338fd1498Szrj replace(iterator __i1, iterator __i2, const basic_string& __str) 67438fd1498Szrj { 67538fd1498Szrj __glibcxx_check_erase_range(__i1, __i2); 67638fd1498Szrj _Base::replace(__i1.base(), __i2.base(), __str); 67738fd1498Szrj this->_M_invalidate_all(); 67838fd1498Szrj return *this; 67938fd1498Szrj } 68038fd1498Szrj 68138fd1498Szrj basic_string& 68238fd1498Szrj replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n) 68338fd1498Szrj { 68438fd1498Szrj __glibcxx_check_erase_range(__i1, __i2); 68538fd1498Szrj __glibcxx_check_string_len(__s, __n); 68638fd1498Szrj _Base::replace(__i1.base(), __i2.base(), __s, __n); 68738fd1498Szrj this->_M_invalidate_all(); 68838fd1498Szrj return *this; 68938fd1498Szrj } 69038fd1498Szrj 69138fd1498Szrj basic_string& 69238fd1498Szrj replace(iterator __i1, iterator __i2, const _CharT* __s) 69338fd1498Szrj { 69438fd1498Szrj __glibcxx_check_erase_range(__i1, __i2); 69538fd1498Szrj __glibcxx_check_string(__s); 69638fd1498Szrj _Base::replace(__i1.base(), __i2.base(), __s); 69738fd1498Szrj this->_M_invalidate_all(); 69838fd1498Szrj return *this; 69938fd1498Szrj } 70038fd1498Szrj 70138fd1498Szrj basic_string& 70238fd1498Szrj replace(iterator __i1, iterator __i2, size_type __n, _CharT __c) 70338fd1498Szrj { 70438fd1498Szrj __glibcxx_check_erase_range(__i1, __i2); 70538fd1498Szrj _Base::replace(__i1.base(), __i2.base(), __n, __c); 70638fd1498Szrj this->_M_invalidate_all(); 70738fd1498Szrj return *this; 70838fd1498Szrj } 70938fd1498Szrj 71038fd1498Szrj template<typename _InputIterator> 71138fd1498Szrj basic_string& 71238fd1498Szrj replace(iterator __i1, iterator __i2, 71338fd1498Szrj _InputIterator __j1, _InputIterator __j2) 71438fd1498Szrj { 71538fd1498Szrj __glibcxx_check_erase_range(__i1, __i2); 71638fd1498Szrj 71738fd1498Szrj typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 71838fd1498Szrj __glibcxx_check_valid_range2(__j1, __j2, __dist); 71938fd1498Szrj 72038fd1498Szrj if (__dist.second >= __dp_sign) 72138fd1498Szrj _Base::replace(__i1.base(), __i2.base(), 72238fd1498Szrj __gnu_debug::__unsafe(__j1), 72338fd1498Szrj __gnu_debug::__unsafe(__j2)); 72438fd1498Szrj else 72538fd1498Szrj _Base::replace(__i1.base(), __i2.base(), __j1, __j2); 72638fd1498Szrj 72738fd1498Szrj this->_M_invalidate_all(); 72838fd1498Szrj return *this; 72938fd1498Szrj } 73038fd1498Szrj 73138fd1498Szrj#if __cplusplus >= 201103L 73238fd1498Szrj basic_string& replace(iterator __i1, iterator __i2, 73338fd1498Szrj std::initializer_list<_CharT> __l) 73438fd1498Szrj { 73538fd1498Szrj __glibcxx_check_erase_range(__i1, __i2); 73638fd1498Szrj _Base::replace(__i1.base(), __i2.base(), __l); 73738fd1498Szrj this->_M_invalidate_all(); 73838fd1498Szrj return *this; 73938fd1498Szrj } 74038fd1498Szrj#endif // C++11 74138fd1498Szrj 74238fd1498Szrj size_type 74338fd1498Szrj copy(_CharT* __s, size_type __n, size_type __pos = 0) const 74438fd1498Szrj { 74538fd1498Szrj __glibcxx_check_string_len(__s, __n); 74638fd1498Szrj return _Base::copy(__s, __n, __pos); 74738fd1498Szrj } 74838fd1498Szrj 74938fd1498Szrj void 75038fd1498Szrj swap(basic_string& __x) 75138fd1498Szrj _GLIBCXX_NOEXCEPT_IF(std::__is_nothrow_swappable<_Base>::value) 75238fd1498Szrj { 75338fd1498Szrj _Safe::_M_swap(__x); 75438fd1498Szrj _Base::swap(__x); 75538fd1498Szrj } 75638fd1498Szrj 75738fd1498Szrj // 21.3.6 string operations: 75838fd1498Szrj const _CharT* 75938fd1498Szrj c_str() const _GLIBCXX_NOEXCEPT 76038fd1498Szrj { 76138fd1498Szrj const _CharT* __res = _Base::c_str(); 76238fd1498Szrj this->_M_invalidate_all(); 76338fd1498Szrj return __res; 76438fd1498Szrj } 76538fd1498Szrj 76638fd1498Szrj const _CharT* 76738fd1498Szrj data() const _GLIBCXX_NOEXCEPT 76838fd1498Szrj { 76938fd1498Szrj const _CharT* __res = _Base::data(); 77038fd1498Szrj this->_M_invalidate_all(); 77138fd1498Szrj return __res; 77238fd1498Szrj } 77338fd1498Szrj 77438fd1498Szrj using _Base::get_allocator; 77538fd1498Szrj 77638fd1498Szrj size_type 77738fd1498Szrj find(const basic_string& __str, size_type __pos = 0) const 77838fd1498Szrj _GLIBCXX_NOEXCEPT 77938fd1498Szrj { return _Base::find(__str, __pos); } 78038fd1498Szrj 78138fd1498Szrj size_type 78238fd1498Szrj find(const _CharT* __s, size_type __pos, size_type __n) const 78338fd1498Szrj { 78438fd1498Szrj __glibcxx_check_string(__s); 78538fd1498Szrj return _Base::find(__s, __pos, __n); 78638fd1498Szrj } 78738fd1498Szrj 78838fd1498Szrj size_type 78938fd1498Szrj find(const _CharT* __s, size_type __pos = 0) const 79038fd1498Szrj { 79138fd1498Szrj __glibcxx_check_string(__s); 79238fd1498Szrj return _Base::find(__s, __pos); 79338fd1498Szrj } 79438fd1498Szrj 79538fd1498Szrj size_type 79638fd1498Szrj find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT 79738fd1498Szrj { return _Base::find(__c, __pos); } 79838fd1498Szrj 79938fd1498Szrj size_type 80038fd1498Szrj rfind(const basic_string& __str, size_type __pos = _Base::npos) const 80138fd1498Szrj _GLIBCXX_NOEXCEPT 80238fd1498Szrj { return _Base::rfind(__str, __pos); } 80338fd1498Szrj 80438fd1498Szrj size_type 80538fd1498Szrj rfind(const _CharT* __s, size_type __pos, size_type __n) const 80638fd1498Szrj { 80738fd1498Szrj __glibcxx_check_string_len(__s, __n); 80838fd1498Szrj return _Base::rfind(__s, __pos, __n); 80938fd1498Szrj } 81038fd1498Szrj 81138fd1498Szrj size_type 81238fd1498Szrj rfind(const _CharT* __s, size_type __pos = _Base::npos) const 81338fd1498Szrj { 81438fd1498Szrj __glibcxx_check_string(__s); 81538fd1498Szrj return _Base::rfind(__s, __pos); 81638fd1498Szrj } 81738fd1498Szrj 81838fd1498Szrj size_type 81938fd1498Szrj rfind(_CharT __c, size_type __pos = _Base::npos) const _GLIBCXX_NOEXCEPT 82038fd1498Szrj { return _Base::rfind(__c, __pos); } 82138fd1498Szrj 82238fd1498Szrj size_type 82338fd1498Szrj find_first_of(const basic_string& __str, size_type __pos = 0) const 82438fd1498Szrj _GLIBCXX_NOEXCEPT 82538fd1498Szrj { return _Base::find_first_of(__str, __pos); } 82638fd1498Szrj 82738fd1498Szrj size_type 82838fd1498Szrj find_first_of(const _CharT* __s, size_type __pos, size_type __n) const 82938fd1498Szrj { 83038fd1498Szrj __glibcxx_check_string(__s); 83138fd1498Szrj return _Base::find_first_of(__s, __pos, __n); 83238fd1498Szrj } 83338fd1498Szrj 83438fd1498Szrj size_type 83538fd1498Szrj find_first_of(const _CharT* __s, size_type __pos = 0) const 83638fd1498Szrj { 83738fd1498Szrj __glibcxx_check_string(__s); 83838fd1498Szrj return _Base::find_first_of(__s, __pos); 83938fd1498Szrj } 84038fd1498Szrj 84138fd1498Szrj size_type 84238fd1498Szrj find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT 84338fd1498Szrj { return _Base::find_first_of(__c, __pos); } 84438fd1498Szrj 84538fd1498Szrj size_type 84638fd1498Szrj find_last_of(const basic_string& __str, 84738fd1498Szrj size_type __pos = _Base::npos) const _GLIBCXX_NOEXCEPT 84838fd1498Szrj { return _Base::find_last_of(__str, __pos); } 84938fd1498Szrj 85038fd1498Szrj size_type 85138fd1498Szrj find_last_of(const _CharT* __s, size_type __pos, size_type __n) const 85238fd1498Szrj { 85338fd1498Szrj __glibcxx_check_string(__s); 85438fd1498Szrj return _Base::find_last_of(__s, __pos, __n); 85538fd1498Szrj } 85638fd1498Szrj 85738fd1498Szrj size_type 85838fd1498Szrj find_last_of(const _CharT* __s, size_type __pos = _Base::npos) const 85938fd1498Szrj { 86038fd1498Szrj __glibcxx_check_string(__s); 86138fd1498Szrj return _Base::find_last_of(__s, __pos); 86238fd1498Szrj } 86338fd1498Szrj 86438fd1498Szrj size_type 86538fd1498Szrj find_last_of(_CharT __c, size_type __pos = _Base::npos) const 86638fd1498Szrj _GLIBCXX_NOEXCEPT 86738fd1498Szrj { return _Base::find_last_of(__c, __pos); } 86838fd1498Szrj 86938fd1498Szrj size_type 87038fd1498Szrj find_first_not_of(const basic_string& __str, size_type __pos = 0) const 87138fd1498Szrj _GLIBCXX_NOEXCEPT 87238fd1498Szrj { return _Base::find_first_not_of(__str, __pos); } 87338fd1498Szrj 87438fd1498Szrj size_type 87538fd1498Szrj find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const 87638fd1498Szrj { 87738fd1498Szrj __glibcxx_check_string_len(__s, __n); 87838fd1498Szrj return _Base::find_first_not_of(__s, __pos, __n); 87938fd1498Szrj } 88038fd1498Szrj 88138fd1498Szrj size_type 88238fd1498Szrj find_first_not_of(const _CharT* __s, size_type __pos = 0) const 88338fd1498Szrj { 88438fd1498Szrj __glibcxx_check_string(__s); 88538fd1498Szrj return _Base::find_first_not_of(__s, __pos); 88638fd1498Szrj } 88738fd1498Szrj 88838fd1498Szrj size_type 88938fd1498Szrj find_first_not_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT 89038fd1498Szrj { return _Base::find_first_not_of(__c, __pos); } 89138fd1498Szrj 89238fd1498Szrj size_type 89338fd1498Szrj find_last_not_of(const basic_string& __str, 89438fd1498Szrj size_type __pos = _Base::npos) const 89538fd1498Szrj _GLIBCXX_NOEXCEPT 89638fd1498Szrj { return _Base::find_last_not_of(__str, __pos); } 89738fd1498Szrj 89838fd1498Szrj size_type 89938fd1498Szrj find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const 90038fd1498Szrj { 90138fd1498Szrj __glibcxx_check_string(__s); 90238fd1498Szrj return _Base::find_last_not_of(__s, __pos, __n); 90338fd1498Szrj } 90438fd1498Szrj 90538fd1498Szrj size_type 90638fd1498Szrj find_last_not_of(const _CharT* __s, size_type __pos = _Base::npos) const 90738fd1498Szrj { 90838fd1498Szrj __glibcxx_check_string(__s); 90938fd1498Szrj return _Base::find_last_not_of(__s, __pos); 91038fd1498Szrj } 91138fd1498Szrj 91238fd1498Szrj size_type 91338fd1498Szrj find_last_not_of(_CharT __c, size_type __pos = _Base::npos) const 91438fd1498Szrj _GLIBCXX_NOEXCEPT 91538fd1498Szrj { return _Base::find_last_not_of(__c, __pos); } 91638fd1498Szrj 91738fd1498Szrj basic_string 91838fd1498Szrj substr(size_type __pos = 0, size_type __n = _Base::npos) const 91938fd1498Szrj { return basic_string(_Base::substr(__pos, __n)); } 92038fd1498Szrj 92138fd1498Szrj int 92238fd1498Szrj compare(const basic_string& __str) const 92338fd1498Szrj { return _Base::compare(__str); } 92438fd1498Szrj 92538fd1498Szrj int 92638fd1498Szrj compare(size_type __pos1, size_type __n1, 92738fd1498Szrj const basic_string& __str) const 92838fd1498Szrj { return _Base::compare(__pos1, __n1, __str); } 92938fd1498Szrj 93038fd1498Szrj int 93138fd1498Szrj compare(size_type __pos1, size_type __n1, const basic_string& __str, 93238fd1498Szrj size_type __pos2, size_type __n2) const 93338fd1498Szrj { return _Base::compare(__pos1, __n1, __str, __pos2, __n2); } 93438fd1498Szrj 93538fd1498Szrj int 93638fd1498Szrj compare(const _CharT* __s) const 93738fd1498Szrj { 93838fd1498Szrj __glibcxx_check_string(__s); 93938fd1498Szrj return _Base::compare(__s); 94038fd1498Szrj } 94138fd1498Szrj 94238fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 94338fd1498Szrj // 5. string::compare specification questionable 94438fd1498Szrj int 94538fd1498Szrj compare(size_type __pos1, size_type __n1, const _CharT* __s) const 94638fd1498Szrj { 94738fd1498Szrj __glibcxx_check_string(__s); 94838fd1498Szrj return _Base::compare(__pos1, __n1, __s); 94938fd1498Szrj } 95038fd1498Szrj 95138fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 95238fd1498Szrj // 5. string::compare specification questionable 95338fd1498Szrj int 95438fd1498Szrj compare(size_type __pos1, size_type __n1,const _CharT* __s, 95538fd1498Szrj size_type __n2) const 95638fd1498Szrj { 95738fd1498Szrj __glibcxx_check_string_len(__s, __n2); 95838fd1498Szrj return _Base::compare(__pos1, __n1, __s, __n2); 95938fd1498Szrj } 96038fd1498Szrj 96138fd1498Szrj _Base& 96238fd1498Szrj _M_base() _GLIBCXX_NOEXCEPT { return *this; } 96338fd1498Szrj 96438fd1498Szrj const _Base& 96538fd1498Szrj _M_base() const _GLIBCXX_NOEXCEPT { return *this; } 96638fd1498Szrj 96738fd1498Szrj using _Safe::_M_invalidate_all; 96838fd1498Szrj }; 96938fd1498Szrj 97038fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 97138fd1498Szrj inline basic_string<_CharT,_Traits,_Allocator> 97238fd1498Szrj operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 97338fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 97438fd1498Szrj { return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; } 97538fd1498Szrj 97638fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 97738fd1498Szrj inline basic_string<_CharT,_Traits,_Allocator> 97838fd1498Szrj operator+(const _CharT* __lhs, 97938fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 98038fd1498Szrj { 98138fd1498Szrj __glibcxx_check_string(__lhs); 98238fd1498Szrj return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; 98338fd1498Szrj } 98438fd1498Szrj 98538fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 98638fd1498Szrj inline basic_string<_CharT,_Traits,_Allocator> 98738fd1498Szrj operator+(_CharT __lhs, 98838fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 98938fd1498Szrj { return basic_string<_CharT,_Traits,_Allocator>(1, __lhs) += __rhs; } 99038fd1498Szrj 99138fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 99238fd1498Szrj inline basic_string<_CharT,_Traits,_Allocator> 99338fd1498Szrj operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 99438fd1498Szrj const _CharT* __rhs) 99538fd1498Szrj { 99638fd1498Szrj __glibcxx_check_string(__rhs); 99738fd1498Szrj return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; 99838fd1498Szrj } 99938fd1498Szrj 100038fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 100138fd1498Szrj inline basic_string<_CharT,_Traits,_Allocator> 100238fd1498Szrj operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 100338fd1498Szrj _CharT __rhs) 100438fd1498Szrj { return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; } 100538fd1498Szrj 100638fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 100738fd1498Szrj inline bool 100838fd1498Szrj operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 100938fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 101038fd1498Szrj { return __lhs._M_base() == __rhs._M_base(); } 101138fd1498Szrj 101238fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 101338fd1498Szrj inline bool 101438fd1498Szrj operator==(const _CharT* __lhs, 101538fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 101638fd1498Szrj { 101738fd1498Szrj __glibcxx_check_string(__lhs); 101838fd1498Szrj return __lhs == __rhs._M_base(); 101938fd1498Szrj } 102038fd1498Szrj 102138fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 102238fd1498Szrj inline bool 102338fd1498Szrj operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 102438fd1498Szrj const _CharT* __rhs) 102538fd1498Szrj { 102638fd1498Szrj __glibcxx_check_string(__rhs); 102738fd1498Szrj return __lhs._M_base() == __rhs; 102838fd1498Szrj } 102938fd1498Szrj 103038fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 103138fd1498Szrj inline bool 103238fd1498Szrj operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 103338fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 103438fd1498Szrj { return __lhs._M_base() != __rhs._M_base(); } 103538fd1498Szrj 103638fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 103738fd1498Szrj inline bool 103838fd1498Szrj operator!=(const _CharT* __lhs, 103938fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 104038fd1498Szrj { 104138fd1498Szrj __glibcxx_check_string(__lhs); 104238fd1498Szrj return __lhs != __rhs._M_base(); 104338fd1498Szrj } 104438fd1498Szrj 104538fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 104638fd1498Szrj inline bool 104738fd1498Szrj operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 104838fd1498Szrj const _CharT* __rhs) 104938fd1498Szrj { 105038fd1498Szrj __glibcxx_check_string(__rhs); 105138fd1498Szrj return __lhs._M_base() != __rhs; 105238fd1498Szrj } 105338fd1498Szrj 105438fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 105538fd1498Szrj inline bool 105638fd1498Szrj operator<(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 105738fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 105838fd1498Szrj { return __lhs._M_base() < __rhs._M_base(); } 105938fd1498Szrj 106038fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 106138fd1498Szrj inline bool 106238fd1498Szrj operator<(const _CharT* __lhs, 106338fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 106438fd1498Szrj { 106538fd1498Szrj __glibcxx_check_string(__lhs); 106638fd1498Szrj return __lhs < __rhs._M_base(); 106738fd1498Szrj } 106838fd1498Szrj 106938fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 107038fd1498Szrj inline bool 107138fd1498Szrj operator<(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 107238fd1498Szrj const _CharT* __rhs) 107338fd1498Szrj { 107438fd1498Szrj __glibcxx_check_string(__rhs); 107538fd1498Szrj return __lhs._M_base() < __rhs; 107638fd1498Szrj } 107738fd1498Szrj 107838fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 107938fd1498Szrj inline bool 108038fd1498Szrj operator<=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 108138fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 108238fd1498Szrj { return __lhs._M_base() <= __rhs._M_base(); } 108338fd1498Szrj 108438fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 108538fd1498Szrj inline bool 108638fd1498Szrj operator<=(const _CharT* __lhs, 108738fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 108838fd1498Szrj { 108938fd1498Szrj __glibcxx_check_string(__lhs); 109038fd1498Szrj return __lhs <= __rhs._M_base(); 109138fd1498Szrj } 109238fd1498Szrj 109338fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 109438fd1498Szrj inline bool 109538fd1498Szrj operator<=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 109638fd1498Szrj const _CharT* __rhs) 109738fd1498Szrj { 109838fd1498Szrj __glibcxx_check_string(__rhs); 109938fd1498Szrj return __lhs._M_base() <= __rhs; 110038fd1498Szrj } 110138fd1498Szrj 110238fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 110338fd1498Szrj inline bool 110438fd1498Szrj operator>=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 110538fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 110638fd1498Szrj { return __lhs._M_base() >= __rhs._M_base(); } 110738fd1498Szrj 110838fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 110938fd1498Szrj inline bool 111038fd1498Szrj operator>=(const _CharT* __lhs, 111138fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 111238fd1498Szrj { 111338fd1498Szrj __glibcxx_check_string(__lhs); 111438fd1498Szrj return __lhs >= __rhs._M_base(); 111538fd1498Szrj } 111638fd1498Szrj 111738fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 111838fd1498Szrj inline bool 111938fd1498Szrj operator>=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 112038fd1498Szrj const _CharT* __rhs) 112138fd1498Szrj { 112238fd1498Szrj __glibcxx_check_string(__rhs); 112338fd1498Szrj return __lhs._M_base() >= __rhs; 112438fd1498Szrj } 112538fd1498Szrj 112638fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 112738fd1498Szrj inline bool 112838fd1498Szrj operator>(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 112938fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 113038fd1498Szrj { return __lhs._M_base() > __rhs._M_base(); } 113138fd1498Szrj 113238fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 113338fd1498Szrj inline bool 113438fd1498Szrj operator>(const _CharT* __lhs, 113538fd1498Szrj const basic_string<_CharT,_Traits,_Allocator>& __rhs) 113638fd1498Szrj { 113738fd1498Szrj __glibcxx_check_string(__lhs); 113838fd1498Szrj return __lhs > __rhs._M_base(); 113938fd1498Szrj } 114038fd1498Szrj 114138fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 114238fd1498Szrj inline bool 114338fd1498Szrj operator>(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 114438fd1498Szrj const _CharT* __rhs) 114538fd1498Szrj { 114638fd1498Szrj __glibcxx_check_string(__rhs); 114738fd1498Szrj return __lhs._M_base() > __rhs; 114838fd1498Szrj } 114938fd1498Szrj 115038fd1498Szrj // 21.3.7.8: 115138fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 115238fd1498Szrj inline void 115338fd1498Szrj swap(basic_string<_CharT,_Traits,_Allocator>& __lhs, 115438fd1498Szrj basic_string<_CharT,_Traits,_Allocator>& __rhs) 115538fd1498Szrj { __lhs.swap(__rhs); } 115638fd1498Szrj 115738fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 115838fd1498Szrj std::basic_ostream<_CharT, _Traits>& 115938fd1498Szrj operator<<(std::basic_ostream<_CharT, _Traits>& __os, 116038fd1498Szrj const basic_string<_CharT, _Traits, _Allocator>& __str) 116138fd1498Szrj { return __os << __str._M_base(); } 116238fd1498Szrj 116338fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 116438fd1498Szrj std::basic_istream<_CharT,_Traits>& 116538fd1498Szrj operator>>(std::basic_istream<_CharT,_Traits>& __is, 116638fd1498Szrj basic_string<_CharT,_Traits,_Allocator>& __str) 116738fd1498Szrj { 116838fd1498Szrj std::basic_istream<_CharT,_Traits>& __res = __is >> __str._M_base(); 116938fd1498Szrj __str._M_invalidate_all(); 117038fd1498Szrj return __res; 117138fd1498Szrj } 117238fd1498Szrj 117338fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 117438fd1498Szrj std::basic_istream<_CharT,_Traits>& 117538fd1498Szrj getline(std::basic_istream<_CharT,_Traits>& __is, 117638fd1498Szrj basic_string<_CharT,_Traits,_Allocator>& __str, _CharT __delim) 117738fd1498Szrj { 117838fd1498Szrj std::basic_istream<_CharT,_Traits>& __res = getline(__is, 117938fd1498Szrj __str._M_base(), 118038fd1498Szrj __delim); 118138fd1498Szrj __str._M_invalidate_all(); 118238fd1498Szrj return __res; 118338fd1498Szrj } 118438fd1498Szrj 118538fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 118638fd1498Szrj std::basic_istream<_CharT,_Traits>& 118738fd1498Szrj getline(std::basic_istream<_CharT,_Traits>& __is, 118838fd1498Szrj basic_string<_CharT,_Traits,_Allocator>& __str) 118938fd1498Szrj { 119038fd1498Szrj std::basic_istream<_CharT,_Traits>& __res = getline(__is, 119138fd1498Szrj __str._M_base()); 119238fd1498Szrj __str._M_invalidate_all(); 119338fd1498Szrj return __res; 119438fd1498Szrj } 119538fd1498Szrj 119638fd1498Szrj typedef basic_string<char> string; 119738fd1498Szrj 119838fd1498Szrj#ifdef _GLIBCXX_USE_WCHAR_T 119938fd1498Szrj typedef basic_string<wchar_t> wstring; 120038fd1498Szrj#endif 120138fd1498Szrj 120238fd1498Szrj template<typename _CharT, typename _Traits, typename _Allocator> 120338fd1498Szrj struct _Insert_range_from_self_is_safe< 120438fd1498Szrj __gnu_debug::basic_string<_CharT, _Traits, _Allocator> > 120538fd1498Szrj { enum { __value = 1 }; }; 120638fd1498Szrj 120738fd1498Szrj} // namespace __gnu_debug 120838fd1498Szrj 120938fd1498Szrj#endif 1210