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