xref: /dflybsd-src/contrib/gcc-8.0/libstdc++-v3/include/debug/string (revision 95059079af47f9a66a175f374f2da1a5020e3255)
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