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