1132720Skan// Debugging string implementation -*- C++ -*-
2132720Skan
3169691Skan// Copyright (C) 2003, 2005, 2006
4132720Skan// Free Software Foundation, Inc.
5132720Skan//
6132720Skan// This file is part of the GNU ISO C++ Library.  This library is free
7132720Skan// software; you can redistribute it and/or modify it under the
8132720Skan// terms of the GNU General Public License as published by the
9132720Skan// Free Software Foundation; either version 2, or (at your option)
10132720Skan// any later version.
11132720Skan
12132720Skan// This library is distributed in the hope that it will be useful,
13132720Skan// but WITHOUT ANY WARRANTY; without even the implied warranty of
14132720Skan// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15132720Skan// GNU General Public License for more details.
16132720Skan
17132720Skan// You should have received a copy of the GNU General Public License along
18132720Skan// with this library; see the file COPYING.  If not, write to the Free
19169691Skan// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20132720Skan// USA.
21132720Skan
22132720Skan// As a special exception, you may use this file as part of a free software
23132720Skan// library without restriction.  Specifically, if other files instantiate
24132720Skan// templates or use macros or inline functions from this file, or you compile
25132720Skan// this file and link it with other files to produce an executable, this
26132720Skan// file does not by itself cause the resulting executable to be covered by
27132720Skan// the GNU General Public License.  This exception does not however
28132720Skan// invalidate any other reasons why the executable file might be covered by
29132720Skan// the GNU General Public License.
30132720Skan
31169691Skan/** @file debug/string
32169691Skan *  This file is a GNU debug extension to the Standard C++ Library.
33169691Skan */
34169691Skan
35132720Skan#ifndef _GLIBCXX_DEBUG_STRING
36132720Skan#define _GLIBCXX_DEBUG_STRING 1
37132720Skan
38132720Skan#include <string>
39132720Skan#include <debug/safe_sequence.h>
40132720Skan#include <debug/safe_iterator.h>
41132720Skan
42132720Skannamespace __gnu_debug
43132720Skan{
44169691Skan  template<typename _CharT, typename _Traits = std::char_traits<_CharT>,
45169691Skan            typename _Allocator = std::allocator<_CharT> >
46132720Skan    class basic_string
47132720Skan    : public std::basic_string<_CharT, _Traits, _Allocator>,
48132720Skan      public __gnu_debug::_Safe_sequence<basic_string<_CharT, _Traits,
49132720Skan						      _Allocator> >
50132720Skan    {
51132720Skan      typedef std::basic_string<_CharT, _Traits, _Allocator> _Base;
52132720Skan      typedef __gnu_debug::_Safe_sequence<basic_string>     _Safe_base;
53132720Skan
54132720Skan  public:
55132720Skan    // types:
56132720Skan    typedef _Traits				       traits_type;
57132720Skan    typedef typename _Traits::char_type		       value_type;
58132720Skan    typedef _Allocator				       allocator_type;
59169691Skan    typedef typename _Base::size_type                  size_type;
60169691Skan    typedef typename _Base::difference_type            difference_type;
61169691Skan    typedef typename _Base::reference                  reference;
62169691Skan    typedef typename _Base::const_reference            const_reference;
63169691Skan    typedef typename _Base::pointer                    pointer;
64169691Skan    typedef typename _Base::const_pointer              const_pointer;
65132720Skan
66132720Skan    typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, basic_string>
67132720Skan                                                       iterator;
68132720Skan    typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,
69132720Skan                                         basic_string> const_iterator;
70132720Skan
71132720Skan    typedef std::reverse_iterator<iterator>            reverse_iterator;
72132720Skan    typedef std::reverse_iterator<const_iterator>      const_reverse_iterator;
73132720Skan
74132720Skan    using _Base::npos;
75132720Skan
76132720Skan    // 21.3.1 construct/copy/destroy:
77132720Skan    explicit basic_string(const _Allocator& __a = _Allocator())
78132720Skan    : _Base(__a)
79132720Skan    { }
80132720Skan
81132720Skan    // Provides conversion from a release-mode string to a debug-mode string
82132720Skan    basic_string(const _Base& __base) : _Base(__base), _Safe_base() { }
83132720Skan
84132720Skan    // _GLIBCXX_RESOLVE_LIB_DEFECTS
85132720Skan    // 42. string ctors specify wrong default allocator
86132720Skan    basic_string(const basic_string& __str)
87132720Skan    : _Base(__str, 0, _Base::npos, __str.get_allocator()), _Safe_base()
88132720Skan    { }
89132720Skan
90132720Skan    // _GLIBCXX_RESOLVE_LIB_DEFECTS
91132720Skan    // 42. string ctors specify wrong default allocator
92132720Skan    basic_string(const basic_string& __str, size_type __pos,
93132720Skan		   size_type __n = _Base::npos,
94132720Skan		   const _Allocator& __a = _Allocator())
95132720Skan    : _Base(__str, __pos, __n, __a)
96132720Skan    { }
97132720Skan
98132720Skan    basic_string(const _CharT* __s, size_type __n,
99132720Skan		   const _Allocator& __a = _Allocator())
100132720Skan    : _Base(__gnu_debug::__check_string(__s, __n), __n, __a)
101132720Skan    { }
102132720Skan
103132720Skan    basic_string(const _CharT* __s, const _Allocator& __a = _Allocator())
104132720Skan    : _Base(__gnu_debug::__check_string(__s), __a)
105132720Skan    { this->assign(__s); }
106132720Skan
107132720Skan    basic_string(size_type __n, _CharT __c,
108132720Skan		   const _Allocator& __a = _Allocator())
109132720Skan    : _Base(__n, __c, __a)
110132720Skan    { }
111132720Skan
112132720Skan    template<typename _InputIterator>
113132720Skan      basic_string(_InputIterator __begin, _InputIterator __end,
114132720Skan		     const _Allocator& __a = _Allocator())
115132720Skan      : _Base(__gnu_debug::__check_valid_range(__begin, __end), __end, __a)
116132720Skan      { }
117132720Skan
118132720Skan    ~basic_string() { }
119132720Skan
120132720Skan    basic_string&
121132720Skan    operator=(const basic_string& __str)
122132720Skan    {
123132720Skan      *static_cast<_Base*>(this) = __str;
124132720Skan      this->_M_invalidate_all();
125132720Skan      return *this;
126132720Skan    }
127132720Skan
128132720Skan    basic_string&
129132720Skan    operator=(const _CharT* __s)
130132720Skan    {
131132720Skan      __glibcxx_check_string(__s);
132132720Skan      *static_cast<_Base*>(this) = __s;
133132720Skan      this->_M_invalidate_all();
134132720Skan      return *this;
135132720Skan    }
136132720Skan
137132720Skan    basic_string&
138132720Skan    operator=(_CharT __c)
139132720Skan    {
140132720Skan      *static_cast<_Base*>(this) = __c;
141132720Skan      this->_M_invalidate_all();
142132720Skan      return *this;
143132720Skan    }
144132720Skan
145132720Skan    // 21.3.2 iterators:
146132720Skan    iterator
147132720Skan    begin()
148132720Skan    { return iterator(_Base::begin(), this); }
149132720Skan
150132720Skan    const_iterator
151132720Skan    begin() const
152132720Skan    { return const_iterator(_Base::begin(), this); }
153132720Skan
154132720Skan    iterator
155132720Skan    end()
156132720Skan    { return iterator(_Base::end(), this); }
157132720Skan
158132720Skan    const_iterator
159132720Skan    end() const
160132720Skan    { return const_iterator(_Base::end(), this); }
161132720Skan
162132720Skan    reverse_iterator
163132720Skan    rbegin()
164132720Skan    { return reverse_iterator(end()); }
165132720Skan
166132720Skan    const_reverse_iterator
167132720Skan    rbegin() const
168132720Skan    { return const_reverse_iterator(end()); }
169132720Skan
170132720Skan    reverse_iterator
171132720Skan    rend()
172132720Skan    { return reverse_iterator(begin()); }
173132720Skan
174132720Skan    const_reverse_iterator
175132720Skan    rend() const
176132720Skan    { return const_reverse_iterator(begin()); }
177132720Skan
178132720Skan    // 21.3.3 capacity:
179132720Skan    using _Base::size;
180132720Skan    using _Base::length;
181132720Skan    using _Base::max_size;
182132720Skan
183132720Skan    void
184132720Skan    resize(size_type __n, _CharT __c)
185132720Skan    {
186132720Skan      _Base::resize(__n, __c);
187132720Skan      this->_M_invalidate_all();
188132720Skan    }
189132720Skan
190132720Skan    void
191132720Skan    resize(size_type __n)
192132720Skan    { this->resize(__n, _CharT()); }
193132720Skan
194132720Skan    using _Base::capacity;
195132720Skan    using _Base::reserve;
196132720Skan
197132720Skan    void
198132720Skan    clear()
199132720Skan    {
200132720Skan      _Base::clear();
201132720Skan      this->_M_invalidate_all();
202132720Skan    }
203132720Skan
204132720Skan    using _Base::empty;
205132720Skan
206132720Skan    // 21.3.4 element access:
207132720Skan    const_reference
208132720Skan    operator[](size_type __pos) const
209132720Skan    {
210132720Skan      _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(),
211169691Skan			    _M_message(__gnu_debug::__msg_subscript_oob)
212132720Skan			    ._M_sequence(*this, "this")
213132720Skan			    ._M_integer(__pos, "__pos")
214132720Skan			    ._M_integer(this->size(), "size"));
215132720Skan      return _M_base()[__pos];
216132720Skan    }
217132720Skan
218132720Skan    reference
219132720Skan    operator[](size_type __pos)
220132720Skan    {
221169691Skan#ifdef _GLIBCXX_DEBUG_PEDANTIC
222132720Skan      __glibcxx_check_subscript(__pos);
223169691Skan#else
224169691Skan      // as an extension v3 allows s[s.size()] when s is non-const.
225169691Skan      _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(),
226169691Skan			    _M_message(__gnu_debug::__msg_subscript_oob)
227169691Skan			    ._M_sequence(*this, "this")
228169691Skan			    ._M_integer(__pos, "__pos")
229169691Skan			    ._M_integer(this->size(), "size"));
230169691Skan#endif
231132720Skan      return _M_base()[__pos];
232132720Skan    }
233132720Skan
234132720Skan    using _Base::at;
235132720Skan
236132720Skan    // 21.3.5 modifiers:
237132720Skan    basic_string&
238132720Skan    operator+=(const basic_string& __str)
239132720Skan    {
240132720Skan      _M_base() += __str;
241132720Skan      this->_M_invalidate_all();
242132720Skan      return *this;
243132720Skan    }
244132720Skan
245132720Skan    basic_string&
246132720Skan    operator+=(const _CharT* __s)
247132720Skan    {
248132720Skan      __glibcxx_check_string(__s);
249132720Skan      _M_base() += __s;
250132720Skan      this->_M_invalidate_all();
251132720Skan      return *this;
252132720Skan    }
253132720Skan
254132720Skan    basic_string&
255132720Skan    operator+=(_CharT __c)
256132720Skan    {
257132720Skan      _M_base() += __c;
258132720Skan      this->_M_invalidate_all();
259132720Skan      return *this;
260132720Skan    }
261132720Skan
262132720Skan    basic_string&
263132720Skan    append(const basic_string& __str)
264132720Skan    {
265132720Skan      _Base::append(__str);
266132720Skan      this->_M_invalidate_all();
267132720Skan      return *this;
268132720Skan    }
269132720Skan
270132720Skan    basic_string&
271132720Skan    append(const basic_string& __str, size_type __pos, size_type __n)
272132720Skan    {
273132720Skan      _Base::append(__str, __pos, __n);
274132720Skan      this->_M_invalidate_all();
275132720Skan      return *this;
276132720Skan    }
277132720Skan
278132720Skan    basic_string&
279132720Skan    append(const _CharT* __s, size_type __n)
280132720Skan    {
281132720Skan      __glibcxx_check_string_len(__s, __n);
282132720Skan      _Base::append(__s, __n);
283132720Skan      this->_M_invalidate_all();
284132720Skan      return *this;
285132720Skan    }
286132720Skan
287132720Skan    basic_string&
288132720Skan    append(const _CharT* __s)
289132720Skan    {
290132720Skan      __glibcxx_check_string(__s);
291132720Skan      _Base::append(__s);
292132720Skan      this->_M_invalidate_all();
293132720Skan      return *this;
294132720Skan    }
295132720Skan
296132720Skan    basic_string&
297132720Skan    append(size_type __n, _CharT __c)
298132720Skan    {
299132720Skan      _Base::append(__n, __c);
300132720Skan      this->_M_invalidate_all();
301132720Skan      return *this;
302132720Skan    }
303132720Skan
304132720Skan    template<typename _InputIterator>
305132720Skan      basic_string&
306132720Skan      append(_InputIterator __first, _InputIterator __last)
307132720Skan      {
308132720Skan	__glibcxx_check_valid_range(__first, __last);
309132720Skan	_Base::append(__first, __last);
310132720Skan	this->_M_invalidate_all();
311132720Skan	return *this;
312132720Skan      }
313132720Skan
314132720Skan    // _GLIBCXX_RESOLVE_LIB_DEFECTS
315132720Skan    // 7. string clause minor problems
316132720Skan    void
317132720Skan    push_back(_CharT __c)
318132720Skan    {
319132720Skan      _Base::push_back(__c);
320132720Skan      this->_M_invalidate_all();
321132720Skan    }
322132720Skan
323132720Skan    basic_string&
324132720Skan    assign(const basic_string& __x)
325132720Skan    {
326132720Skan      _Base::assign(__x);
327132720Skan      this->_M_invalidate_all();
328132720Skan      return *this;
329132720Skan    }
330132720Skan
331132720Skan    basic_string&
332132720Skan    assign(const basic_string& __str, size_type __pos, size_type __n)
333132720Skan    {
334132720Skan      _Base::assign(__str, __pos, __n);
335132720Skan      this->_M_invalidate_all();
336132720Skan      return *this;
337132720Skan    }
338132720Skan
339132720Skan    basic_string&
340132720Skan    assign(const _CharT* __s, size_type __n)
341132720Skan    {
342132720Skan      __glibcxx_check_string_len(__s, __n);
343132720Skan      _Base::assign(__s, __n);
344132720Skan      this->_M_invalidate_all();
345132720Skan      return *this;
346132720Skan    }
347132720Skan
348132720Skan    basic_string&
349132720Skan    assign(const _CharT* __s)
350132720Skan    {
351132720Skan      __glibcxx_check_string(__s);
352132720Skan      _Base::assign(__s);
353132720Skan      this->_M_invalidate_all();
354132720Skan      return *this;
355132720Skan    }
356132720Skan
357132720Skan    basic_string&
358132720Skan    assign(size_type __n, _CharT __c)
359132720Skan    {
360132720Skan      _Base::assign(__n, __c);
361132720Skan      this->_M_invalidate_all();
362132720Skan      return *this;
363132720Skan    }
364132720Skan
365132720Skan    template<typename _InputIterator>
366132720Skan      basic_string&
367132720Skan      assign(_InputIterator __first, _InputIterator __last)
368132720Skan      {
369132720Skan	__glibcxx_check_valid_range(__first, __last);
370132720Skan	_Base::assign(__first, __last);
371132720Skan	this->_M_invalidate_all();
372132720Skan	return *this;
373132720Skan      }
374132720Skan
375132720Skan    basic_string&
376132720Skan    insert(size_type __pos1, const basic_string& __str)
377132720Skan    {
378132720Skan      _Base::insert(__pos1, __str);
379132720Skan      this->_M_invalidate_all();
380132720Skan      return *this;
381132720Skan    }
382132720Skan
383132720Skan    basic_string&
384132720Skan    insert(size_type __pos1, const basic_string& __str,
385132720Skan	   size_type __pos2, size_type __n)
386132720Skan    {
387132720Skan      _Base::insert(__pos1, __str, __pos2, __n);
388132720Skan      this->_M_invalidate_all();
389132720Skan      return *this;
390132720Skan    }
391132720Skan
392132720Skan    basic_string&
393132720Skan    insert(size_type __pos, const _CharT* __s, size_type __n)
394132720Skan    {
395132720Skan      __glibcxx_check_string(__s);
396132720Skan      _Base::insert(__pos, __s, __n);
397132720Skan      this->_M_invalidate_all();
398132720Skan      return *this;
399132720Skan    }
400132720Skan
401132720Skan    basic_string&
402132720Skan    insert(size_type __pos, const _CharT* __s)
403132720Skan    {
404132720Skan      __glibcxx_check_string(__s);
405132720Skan      _Base::insert(__pos, __s);
406132720Skan      this->_M_invalidate_all();
407132720Skan      return *this;
408132720Skan    }
409132720Skan
410132720Skan    basic_string&
411132720Skan    insert(size_type __pos, size_type __n, _CharT __c)
412132720Skan    {
413132720Skan      _Base::insert(__pos, __n, __c);
414132720Skan      this->_M_invalidate_all();
415132720Skan      return *this;
416132720Skan    }
417132720Skan
418132720Skan    iterator
419132720Skan    insert(iterator __p, _CharT __c)
420132720Skan    {
421132720Skan      __glibcxx_check_insert(__p);
422132720Skan      typename _Base::iterator __res = _Base::insert(__p.base(), __c);
423132720Skan      this->_M_invalidate_all();
424132720Skan      return iterator(__res, this);
425132720Skan    }
426132720Skan
427132720Skan    void
428132720Skan    insert(iterator __p, size_type __n, _CharT __c)
429132720Skan    {
430132720Skan      __glibcxx_check_insert(__p);
431132720Skan      _Base::insert(__p.base(), __n, __c);
432132720Skan      this->_M_invalidate_all();
433132720Skan    }
434132720Skan
435132720Skan    template<typename _InputIterator>
436132720Skan      void
437132720Skan      insert(iterator __p, _InputIterator __first, _InputIterator __last)
438132720Skan      {
439132720Skan	__glibcxx_check_insert_range(__p, __first, __last);
440132720Skan	_Base::insert(__p.base(), __first, __last);
441132720Skan	this->_M_invalidate_all();
442132720Skan      }
443132720Skan
444132720Skan    basic_string&
445132720Skan    erase(size_type __pos = 0, size_type __n = _Base::npos)
446132720Skan    {
447132720Skan      _Base::erase(__pos, __n);
448132720Skan      this->_M_invalidate_all();
449132720Skan      return *this;
450132720Skan    }
451132720Skan
452132720Skan    iterator
453132720Skan    erase(iterator __position)
454132720Skan    {
455132720Skan      __glibcxx_check_erase(__position);
456132720Skan      typename _Base::iterator __res = _Base::erase(__position.base());
457132720Skan      this->_M_invalidate_all();
458132720Skan      return iterator(__res, this);
459132720Skan    }
460132720Skan
461132720Skan    iterator
462132720Skan    erase(iterator __first, iterator __last)
463132720Skan    {
464132720Skan      // _GLIBCXX_RESOLVE_LIB_DEFECTS
465132720Skan      // 151. can't currently clear() empty container
466132720Skan      __glibcxx_check_erase_range(__first, __last);
467132720Skan      typename _Base::iterator __res = _Base::erase(__first.base(),
468132720Skan						       __last.base());
469132720Skan      this->_M_invalidate_all();
470132720Skan      return iterator(__res, this);
471132720Skan    }
472132720Skan
473132720Skan    basic_string&
474132720Skan    replace(size_type __pos1, size_type __n1, const basic_string& __str)
475132720Skan    {
476132720Skan      _Base::replace(__pos1, __n1, __str);
477132720Skan      this->_M_invalidate_all();
478132720Skan      return *this;
479132720Skan    }
480132720Skan
481132720Skan    basic_string&
482132720Skan    replace(size_type __pos1, size_type __n1, const basic_string& __str,
483132720Skan	    size_type __pos2, size_type __n2)
484132720Skan    {
485132720Skan      _Base::replace(__pos1, __n1, __str, __pos2, __n2);
486132720Skan      this->_M_invalidate_all();
487132720Skan      return *this;
488132720Skan    }
489132720Skan
490132720Skan    basic_string&
491132720Skan    replace(size_type __pos, size_type __n1, const _CharT* __s,
492132720Skan	    size_type __n2)
493132720Skan    {
494132720Skan      __glibcxx_check_string_len(__s, __n2);
495132720Skan      _Base::replace(__pos, __n1, __s, __n2);
496132720Skan      this->_M_invalidate_all();
497132720Skan      return *this;
498132720Skan    }
499132720Skan
500132720Skan    basic_string&
501132720Skan    replace(size_type __pos, size_type __n1, const _CharT* __s)
502132720Skan    {
503132720Skan      __glibcxx_check_string(__s);
504132720Skan      _Base::replace(__pos, __n1, __s);
505132720Skan      this->_M_invalidate_all();
506132720Skan      return *this;
507132720Skan    }
508132720Skan
509132720Skan    basic_string&
510132720Skan    replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
511132720Skan    {
512132720Skan      _Base::replace(__pos, __n1, __n2, __c);
513132720Skan      this->_M_invalidate_all();
514132720Skan      return *this;
515132720Skan    }
516132720Skan
517132720Skan    basic_string&
518132720Skan    replace(iterator __i1, iterator __i2, const basic_string& __str)
519132720Skan    {
520132720Skan      __glibcxx_check_erase_range(__i1, __i2);
521132720Skan      _Base::replace(__i1.base(), __i2.base(), __str);
522132720Skan      this->_M_invalidate_all();
523132720Skan      return *this;
524132720Skan    }
525132720Skan
526132720Skan    basic_string&
527132720Skan    replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
528132720Skan    {
529132720Skan      __glibcxx_check_erase_range(__i1, __i2);
530132720Skan      __glibcxx_check_string_len(__s, __n);
531132720Skan      _Base::replace(__i1.base(), __i2.base(), __s, __n);
532132720Skan      this->_M_invalidate_all();
533132720Skan      return *this;
534132720Skan    }
535132720Skan
536132720Skan    basic_string&
537132720Skan    replace(iterator __i1, iterator __i2, const _CharT* __s)
538132720Skan    {
539132720Skan      __glibcxx_check_erase_range(__i1, __i2);
540132720Skan      __glibcxx_check_string(__s);
541132720Skan      _Base::replace(__i1.base(), __i2.base(), __s);
542132720Skan      this->_M_invalidate_all();
543132720Skan      return *this;
544132720Skan    }
545132720Skan
546132720Skan    basic_string&
547132720Skan    replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
548132720Skan    {
549132720Skan      __glibcxx_check_erase_range(__i1, __i2);
550132720Skan      _Base::replace(__i1.base(), __i2.base(), __n, __c);
551132720Skan      this->_M_invalidate_all();
552132720Skan      return *this;
553132720Skan    }
554132720Skan
555132720Skan    template<typename _InputIterator>
556132720Skan      basic_string&
557132720Skan      replace(iterator __i1, iterator __i2,
558132720Skan	      _InputIterator __j1, _InputIterator __j2)
559132720Skan      {
560132720Skan	__glibcxx_check_erase_range(__i1, __i2);
561132720Skan	__glibcxx_check_valid_range(__j1, __j2);
562132720Skan	_Base::replace(__i1.base(), __i2.base(), __j1, __j2);
563132720Skan	this->_M_invalidate_all();
564132720Skan	return *this;
565132720Skan      }
566132720Skan
567132720Skan    size_type
568132720Skan    copy(_CharT* __s, size_type __n, size_type __pos = 0) const
569132720Skan    {
570132720Skan      __glibcxx_check_string_len(__s, __n);
571132720Skan      return _Base::copy(__s, __n, __pos);
572132720Skan    }
573132720Skan
574132720Skan    void
575132720Skan    swap(basic_string<_CharT,_Traits,_Allocator>& __x)
576132720Skan    {
577132720Skan      _Base::swap(__x);
578132720Skan      this->_M_swap(__x);
579132720Skan      this->_M_invalidate_all();
580132720Skan      __x._M_invalidate_all();
581132720Skan    }
582132720Skan
583132720Skan    // 21.3.6 string operations:
584132720Skan    const _CharT*
585132720Skan    c_str() const
586132720Skan    {
587132720Skan      const _CharT* __res = _Base::c_str();
588132720Skan      this->_M_invalidate_all();
589132720Skan      return __res;
590132720Skan    }
591132720Skan
592132720Skan    const _CharT*
593132720Skan    data() const
594132720Skan    {
595132720Skan      const _CharT* __res = _Base::data();
596132720Skan      this->_M_invalidate_all();
597132720Skan      return __res;
598132720Skan    }
599132720Skan
600132720Skan    using _Base::get_allocator;
601132720Skan
602132720Skan    size_type
603132720Skan    find(const basic_string& __str, size_type __pos = 0) const
604132720Skan    { return _Base::find(__str, __pos); }
605132720Skan
606132720Skan    size_type
607132720Skan    find(const _CharT* __s, size_type __pos, size_type __n) const
608132720Skan    {
609132720Skan      __glibcxx_check_string(__s);
610132720Skan      return _Base::find(__s, __pos, __n);
611132720Skan    }
612132720Skan
613132720Skan    size_type
614132720Skan    find(const _CharT* __s, size_type __pos = 0) const
615132720Skan    {
616132720Skan      __glibcxx_check_string(__s);
617132720Skan      return _Base::find(__s, __pos);
618132720Skan    }
619132720Skan
620132720Skan    size_type
621132720Skan    find(_CharT __c, size_type __pos = 0) const
622132720Skan    { return _Base::find(__c, __pos); }
623132720Skan
624132720Skan    size_type
625132720Skan    rfind(const basic_string& __str, size_type __pos = _Base::npos) const
626132720Skan    { return _Base::rfind(__str, __pos); }
627132720Skan
628132720Skan    size_type
629132720Skan    rfind(const _CharT* __s, size_type __pos, size_type __n) const
630132720Skan    {
631132720Skan      __glibcxx_check_string_len(__s, __n);
632132720Skan      return _Base::rfind(__s, __pos, __n);
633132720Skan    }
634132720Skan
635132720Skan    size_type
636132720Skan    rfind(const _CharT* __s, size_type __pos = _Base::npos) const
637132720Skan    {
638132720Skan      __glibcxx_check_string(__s);
639132720Skan      return _Base::rfind(__s, __pos);
640132720Skan    }
641132720Skan
642132720Skan    size_type
643132720Skan    rfind(_CharT __c, size_type __pos = _Base::npos) const
644132720Skan    { return _Base::rfind(__c, __pos); }
645132720Skan
646132720Skan    size_type
647132720Skan    find_first_of(const basic_string& __str, size_type __pos = 0) const
648132720Skan    { return _Base::find_first_of(__str, __pos); }
649132720Skan
650132720Skan    size_type
651132720Skan    find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
652132720Skan    {
653132720Skan      __glibcxx_check_string(__s);
654132720Skan      return _Base::find_first_of(__s, __pos, __n);
655132720Skan    }
656132720Skan
657132720Skan    size_type
658132720Skan    find_first_of(const _CharT* __s, size_type __pos = 0) const
659132720Skan    {
660132720Skan      __glibcxx_check_string(__s);
661132720Skan      return _Base::find_first_of(__s, __pos);
662132720Skan    }
663132720Skan
664132720Skan    size_type
665132720Skan    find_first_of(_CharT __c, size_type __pos = 0) const
666132720Skan    { return _Base::find_first_of(__c, __pos); }
667132720Skan
668132720Skan    size_type
669169691Skan    find_last_of(const basic_string& __str, 
670169691Skan		 size_type __pos = _Base::npos) const
671132720Skan    { return _Base::find_last_of(__str, __pos); }
672132720Skan
673132720Skan    size_type
674132720Skan    find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
675132720Skan    {
676132720Skan      __glibcxx_check_string(__s);
677132720Skan      return _Base::find_last_of(__s, __pos, __n);
678132720Skan    }
679132720Skan
680132720Skan    size_type
681132720Skan    find_last_of(const _CharT* __s, size_type __pos = _Base::npos) const
682132720Skan    {
683132720Skan      __glibcxx_check_string(__s);
684132720Skan      return _Base::find_last_of(__s, __pos);
685132720Skan    }
686132720Skan
687132720Skan    size_type
688132720Skan    find_last_of(_CharT __c, size_type __pos = _Base::npos) const
689132720Skan    { return _Base::find_last_of(__c, __pos); }
690132720Skan
691132720Skan    size_type
692132720Skan    find_first_not_of(const basic_string& __str, size_type __pos = 0) const
693132720Skan    { return _Base::find_first_not_of(__str, __pos); }
694132720Skan
695132720Skan    size_type
696132720Skan    find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
697132720Skan    {
698132720Skan      __glibcxx_check_string_len(__s, __n);
699132720Skan      return _Base::find_first_not_of(__s, __pos, __n);
700132720Skan    }
701132720Skan
702132720Skan    size_type
703132720Skan    find_first_not_of(const _CharT* __s, size_type __pos = 0) const
704132720Skan    {
705132720Skan      __glibcxx_check_string(__s);
706132720Skan      return _Base::find_first_not_of(__s, __pos);
707132720Skan    }
708132720Skan
709132720Skan    size_type
710132720Skan    find_first_not_of(_CharT __c, size_type __pos = 0) const
711132720Skan    { return _Base::find_first_not_of(__c, __pos); }
712132720Skan
713132720Skan    size_type
714132720Skan    find_last_not_of(const basic_string& __str,
715132720Skan				  size_type __pos = _Base::npos) const
716132720Skan    { return _Base::find_last_not_of(__str, __pos); }
717132720Skan
718132720Skan    size_type
719132720Skan    find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
720132720Skan    {
721132720Skan      __glibcxx_check_string(__s);
722132720Skan      return _Base::find_last_not_of(__s, __pos, __n);
723132720Skan    }
724132720Skan
725132720Skan    size_type
726132720Skan    find_last_not_of(const _CharT* __s, size_type __pos = _Base::npos) const
727132720Skan    {
728132720Skan      __glibcxx_check_string(__s);
729132720Skan      return _Base::find_last_not_of(__s, __pos);
730132720Skan    }
731132720Skan
732132720Skan    size_type
733132720Skan    find_last_not_of(_CharT __c, size_type __pos = _Base::npos) const
734132720Skan    { return _Base::find_last_not_of(__c, __pos); }
735132720Skan
736132720Skan    basic_string
737132720Skan    substr(size_type __pos = 0, size_type __n = _Base::npos) const
738132720Skan    { return basic_string(_Base::substr(__pos, __n)); }
739132720Skan
740132720Skan    int
741132720Skan    compare(const basic_string& __str) const
742132720Skan    { return _Base::compare(__str); }
743132720Skan
744132720Skan    int
745132720Skan    compare(size_type __pos1, size_type __n1,
746132720Skan		  const basic_string& __str) const
747132720Skan    { return _Base::compare(__pos1, __n1, __str); }
748132720Skan
749132720Skan    int
750132720Skan    compare(size_type __pos1, size_type __n1, const basic_string& __str,
751132720Skan	      size_type __pos2, size_type __n2) const
752132720Skan    { return _Base::compare(__pos1, __n1, __str, __pos2, __n2); }
753132720Skan
754132720Skan    int
755132720Skan    compare(const _CharT* __s) const
756132720Skan    {
757132720Skan      __glibcxx_check_string(__s);
758132720Skan      return _Base::compare(__s);
759132720Skan    }
760132720Skan
761132720Skan    //  _GLIBCXX_RESOLVE_LIB_DEFECTS
762132720Skan    //  5. string::compare specification questionable
763132720Skan    int
764132720Skan    compare(size_type __pos1, size_type __n1, const _CharT* __s) const
765132720Skan    {
766132720Skan      __glibcxx_check_string(__s);
767132720Skan      return _Base::compare(__pos1, __n1, __s);
768132720Skan    }
769132720Skan
770132720Skan    //  _GLIBCXX_RESOLVE_LIB_DEFECTS
771132720Skan    //  5. string::compare specification questionable
772132720Skan    int
773132720Skan    compare(size_type __pos1, size_type __n1,const _CharT* __s,
774132720Skan	      size_type __n2) const
775132720Skan    {
776132720Skan      __glibcxx_check_string_len(__s, __n2);
777132720Skan      return _Base::compare(__pos1, __n1, __s, __n2);
778132720Skan    }
779132720Skan
780132720Skan    _Base&
781132720Skan    _M_base() { return *this; }
782132720Skan
783132720Skan    const _Base&
784132720Skan    _M_base() const { return *this; }
785132720Skan
786132720Skan    using _Safe_base::_M_invalidate_all;
787132720Skan  };
788132720Skan
789132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
790132720Skan    inline basic_string<_CharT,_Traits,_Allocator>
791132720Skan    operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
792132720Skan	      const basic_string<_CharT,_Traits,_Allocator>& __rhs)
793132720Skan    { return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; }
794132720Skan
795132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
796132720Skan    inline basic_string<_CharT,_Traits,_Allocator>
797132720Skan    operator+(const _CharT* __lhs,
798132720Skan	      const basic_string<_CharT,_Traits,_Allocator>& __rhs)
799132720Skan    {
800132720Skan      __glibcxx_check_string(__lhs);
801132720Skan      return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs;
802132720Skan    }
803132720Skan
804132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
805132720Skan    inline basic_string<_CharT,_Traits,_Allocator>
806132720Skan    operator+(_CharT __lhs,
807132720Skan	      const basic_string<_CharT,_Traits,_Allocator>& __rhs)
808132720Skan    { return basic_string<_CharT,_Traits,_Allocator>(1, __lhs) += __rhs; }
809132720Skan
810132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
811132720Skan    inline basic_string<_CharT,_Traits,_Allocator>
812132720Skan    operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
813132720Skan	      const _CharT* __rhs)
814132720Skan    {
815132720Skan      __glibcxx_check_string(__rhs);
816132720Skan      return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs;
817132720Skan    }
818132720Skan
819132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
820132720Skan    inline basic_string<_CharT,_Traits,_Allocator>
821132720Skan    operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
822132720Skan	      _CharT __rhs)
823132720Skan    { return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; }
824132720Skan
825132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
826132720Skan    inline bool
827132720Skan    operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
828132720Skan	       const basic_string<_CharT,_Traits,_Allocator>& __rhs)
829132720Skan    { return __lhs._M_base() == __rhs._M_base(); }
830132720Skan
831132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
832132720Skan    inline bool
833132720Skan    operator==(const _CharT* __lhs,
834132720Skan	       const basic_string<_CharT,_Traits,_Allocator>& __rhs)
835132720Skan    {
836132720Skan      __glibcxx_check_string(__lhs);
837132720Skan      return __lhs == __rhs._M_base();
838132720Skan    }
839132720Skan
840132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
841132720Skan    inline bool
842132720Skan    operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
843132720Skan	       const _CharT* __rhs)
844132720Skan    {
845132720Skan      __glibcxx_check_string(__rhs);
846132720Skan      return __lhs._M_base() == __rhs;
847132720Skan    }
848132720Skan
849132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
850132720Skan    inline bool
851132720Skan    operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
852132720Skan	       const basic_string<_CharT,_Traits,_Allocator>& __rhs)
853132720Skan    { return __lhs._M_base() != __rhs._M_base(); }
854132720Skan
855132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
856132720Skan    inline bool
857132720Skan    operator!=(const _CharT* __lhs,
858132720Skan	       const basic_string<_CharT,_Traits,_Allocator>& __rhs)
859132720Skan    {
860132720Skan      __glibcxx_check_string(__lhs);
861132720Skan      return __lhs != __rhs._M_base();
862132720Skan    }
863132720Skan
864132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
865132720Skan    inline bool
866132720Skan    operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
867132720Skan	       const _CharT* __rhs)
868132720Skan    {
869132720Skan      __glibcxx_check_string(__rhs);
870132720Skan      return __lhs._M_base() != __rhs;
871132720Skan    }
872132720Skan
873132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
874132720Skan    inline bool
875132720Skan    operator<(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
876132720Skan	      const basic_string<_CharT,_Traits,_Allocator>& __rhs)
877132720Skan    { return __lhs._M_base() < __rhs._M_base(); }
878132720Skan
879132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
880132720Skan    inline bool
881132720Skan    operator<(const _CharT* __lhs,
882132720Skan	      const basic_string<_CharT,_Traits,_Allocator>& __rhs)
883132720Skan    {
884132720Skan      __glibcxx_check_string(__lhs);
885132720Skan      return __lhs < __rhs._M_base();
886132720Skan    }
887132720Skan
888132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
889132720Skan    inline bool
890132720Skan    operator<(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
891132720Skan	      const _CharT* __rhs)
892132720Skan    {
893132720Skan      __glibcxx_check_string(__rhs);
894132720Skan      return __lhs._M_base() < __rhs;
895132720Skan    }
896132720Skan
897132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
898132720Skan    inline bool
899132720Skan    operator<=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
900132720Skan	       const basic_string<_CharT,_Traits,_Allocator>& __rhs)
901132720Skan    { return __lhs._M_base() <= __rhs._M_base(); }
902132720Skan
903132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
904132720Skan    inline bool
905132720Skan    operator<=(const _CharT* __lhs,
906132720Skan	       const basic_string<_CharT,_Traits,_Allocator>& __rhs)
907132720Skan    {
908132720Skan      __glibcxx_check_string(__lhs);
909132720Skan      return __lhs <= __rhs._M_base();
910132720Skan    }
911132720Skan
912132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
913132720Skan    inline bool
914132720Skan    operator<=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
915132720Skan	       const _CharT* __rhs)
916132720Skan    {
917132720Skan      __glibcxx_check_string(__rhs);
918132720Skan      return __lhs._M_base() <= __rhs;
919132720Skan    }
920132720Skan
921132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
922132720Skan    inline bool
923132720Skan    operator>=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
924132720Skan	       const basic_string<_CharT,_Traits,_Allocator>& __rhs)
925132720Skan    { return __lhs._M_base() >= __rhs._M_base(); }
926132720Skan
927132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
928132720Skan    inline bool
929132720Skan    operator>=(const _CharT* __lhs,
930132720Skan	       const basic_string<_CharT,_Traits,_Allocator>& __rhs)
931132720Skan    {
932132720Skan      __glibcxx_check_string(__lhs);
933132720Skan      return __lhs >= __rhs._M_base();
934132720Skan    }
935132720Skan
936132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
937132720Skan    inline bool
938132720Skan    operator>=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
939132720Skan	       const _CharT* __rhs)
940132720Skan    {
941132720Skan      __glibcxx_check_string(__rhs);
942132720Skan      return __lhs._M_base() >= __rhs;
943132720Skan    }
944132720Skan
945132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
946132720Skan    inline bool
947132720Skan    operator>(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
948132720Skan	      const basic_string<_CharT,_Traits,_Allocator>& __rhs)
949132720Skan    { return __lhs._M_base() > __rhs._M_base(); }
950132720Skan
951132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
952132720Skan    inline bool
953132720Skan    operator>(const _CharT* __lhs,
954132720Skan	      const basic_string<_CharT,_Traits,_Allocator>& __rhs)
955132720Skan    {
956132720Skan      __glibcxx_check_string(__lhs);
957132720Skan      return __lhs > __rhs._M_base();
958132720Skan    }
959132720Skan
960132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
961132720Skan    inline bool
962132720Skan    operator>(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
963132720Skan	      const _CharT* __rhs)
964132720Skan    {
965132720Skan      __glibcxx_check_string(__rhs);
966132720Skan      return __lhs._M_base() > __rhs;
967132720Skan    }
968132720Skan
969132720Skan  // 21.3.7.8:
970132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
971132720Skan    inline void
972132720Skan    swap(basic_string<_CharT,_Traits,_Allocator>& __lhs,
973132720Skan	 basic_string<_CharT,_Traits,_Allocator>& __rhs)
974132720Skan    { __lhs.swap(__rhs); }
975132720Skan
976132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
977132720Skan    std::basic_ostream<_CharT, _Traits>&
978132720Skan    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
979132720Skan	       const basic_string<_CharT, _Traits, _Allocator>& __str)
980132720Skan    { return __os << __str._M_base(); }
981132720Skan
982132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
983132720Skan    std::basic_istream<_CharT,_Traits>&
984132720Skan    operator>>(std::basic_istream<_CharT,_Traits>& __is,
985132720Skan	       basic_string<_CharT,_Traits,_Allocator>& __str)
986132720Skan    {
987132720Skan      std::basic_istream<_CharT,_Traits>& __res = __is >> __str._M_base();
988132720Skan      __str._M_invalidate_all();
989132720Skan      return __res;
990132720Skan    }
991132720Skan
992132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
993132720Skan    std::basic_istream<_CharT,_Traits>&
994132720Skan    getline(std::basic_istream<_CharT,_Traits>& __is,
995132720Skan	    basic_string<_CharT,_Traits,_Allocator>& __str, _CharT __delim)
996132720Skan    {
997132720Skan      std::basic_istream<_CharT,_Traits>& __res = getline(__is,
998132720Skan							  __str._M_base(),
999132720Skan							__delim);
1000132720Skan      __str._M_invalidate_all();
1001132720Skan      return __res;
1002132720Skan    }
1003132720Skan
1004132720Skan  template<typename _CharT, typename _Traits, typename _Allocator>
1005132720Skan    std::basic_istream<_CharT,_Traits>&
1006132720Skan    getline(std::basic_istream<_CharT,_Traits>& __is,
1007132720Skan	    basic_string<_CharT,_Traits,_Allocator>& __str)
1008132720Skan    {
1009132720Skan      std::basic_istream<_CharT,_Traits>& __res = getline(__is,
1010132720Skan							  __str._M_base());
1011132720Skan      __str._M_invalidate_all();
1012132720Skan      return __res;
1013132720Skan    }
1014169691Skan
1015169691Skan  typedef basic_string<char>    string;
1016169691Skan
1017169691Skan#ifdef _GLIBCXX_USE_WCHAR_T
1018169691Skan  typedef basic_string<wchar_t> wstring;
1019169691Skan#endif
1020169691Skan
1021132720Skan} // namespace __gnu_debug
1022132720Skan
1023132720Skan#endif
1024