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