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