100db7afdSDavid E. O'Brien // Components for manipulating sequences of characters -*- C++ -*-
200db7afdSDavid E. O'Brien 
3f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4f8a1b7d9SAlexander Kabaev // 2006, 2007
500db7afdSDavid E. O'Brien // Free Software Foundation, Inc.
600db7afdSDavid E. O'Brien //
700db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
800db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
900db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
1000db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1100db7afdSDavid E. O'Brien // any later version.
1200db7afdSDavid E. O'Brien 
1300db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1400db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1500db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1600db7afdSDavid E. O'Brien // GNU General Public License for more details.
1700db7afdSDavid E. O'Brien 
1800db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1900db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
20f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2100db7afdSDavid E. O'Brien // USA.
2200db7afdSDavid E. O'Brien 
2300db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2400db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2500db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2600db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2700db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2800db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2900db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
3000db7afdSDavid E. O'Brien // the GNU General Public License.
3100db7afdSDavid E. O'Brien 
3200db7afdSDavid E. O'Brien /** @file basic_string.h
3300db7afdSDavid E. O'Brien  *  This is an internal header file, included by other library headers.
3400db7afdSDavid E. O'Brien  *  You should not attempt to use it directly.
3500db7afdSDavid E. O'Brien  */
3600db7afdSDavid E. O'Brien 
37f8a1b7d9SAlexander Kabaev //
38f8a1b7d9SAlexander Kabaev // ISO C++ 14882: 21 Strings library
39f8a1b7d9SAlexander Kabaev //
40f8a1b7d9SAlexander Kabaev 
41ffeaf689SAlexander Kabaev #ifndef _BASIC_STRING_H
42ffeaf689SAlexander Kabaev #define _BASIC_STRING_H 1
4300db7afdSDavid E. O'Brien 
4400db7afdSDavid E. O'Brien #pragma GCC system_header
4500db7afdSDavid E. O'Brien 
46f8a1b7d9SAlexander Kabaev #include <ext/atomicity.h>
47ffeaf689SAlexander Kabaev #include <debug/debug.h>
4800db7afdSDavid E. O'Brien 
_GLIBCXX_BEGIN_NAMESPACE(std)49f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
50f8a1b7d9SAlexander Kabaev 
511b86b14eSAlexander Kabaev   /**
521b86b14eSAlexander Kabaev    *  @class basic_string basic_string.h <string>
531b86b14eSAlexander Kabaev    *  @brief  Managing sequences of characters and character-like objects.
541b86b14eSAlexander Kabaev    *
551b86b14eSAlexander Kabaev    *  @ingroup Containers
561b86b14eSAlexander Kabaev    *  @ingroup Sequences
571b86b14eSAlexander Kabaev    *
581b86b14eSAlexander Kabaev    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
591b86b14eSAlexander Kabaev    *  <a href="tables.html#66">reversible container</a>, and a
601b86b14eSAlexander Kabaev    *  <a href="tables.html#67">sequence</a>.  Of the
611b86b14eSAlexander Kabaev    *  <a href="tables.html#68">optional sequence requirements</a>, only
621b86b14eSAlexander Kabaev    *  @c push_back, @c at, and array access are supported.
631b86b14eSAlexander Kabaev    *
641b86b14eSAlexander Kabaev    *  @doctodo
651b86b14eSAlexander Kabaev    *
661b86b14eSAlexander Kabaev    *
671b86b14eSAlexander Kabaev    *  @if maint
681b86b14eSAlexander Kabaev    *  Documentation?  What's that?
691b86b14eSAlexander Kabaev    *  Nathan Myers <[email protected]>.
701b86b14eSAlexander Kabaev    *
711b86b14eSAlexander Kabaev    *  A string looks like this:
721b86b14eSAlexander Kabaev    *
731b86b14eSAlexander Kabaev    *  @code
741b86b14eSAlexander Kabaev    *                                        [_Rep]
751b86b14eSAlexander Kabaev    *                                        _M_length
761b86b14eSAlexander Kabaev    *   [basic_string<char_type>]            _M_capacity
77ffeaf689SAlexander Kabaev    *   _M_dataplus                          _M_refcount
781b86b14eSAlexander Kabaev    *   _M_p ---------------->               unnamed array of char_type
791b86b14eSAlexander Kabaev    *  @endcode
801b86b14eSAlexander Kabaev    *
811b86b14eSAlexander Kabaev    *  Where the _M_p points to the first character in the string, and
821b86b14eSAlexander Kabaev    *  you cast it to a pointer-to-_Rep and subtract 1 to get a
831b86b14eSAlexander Kabaev    *  pointer to the header.
841b86b14eSAlexander Kabaev    *
851b86b14eSAlexander Kabaev    *  This approach has the enormous advantage that a string object
861b86b14eSAlexander Kabaev    *  requires only one allocation.  All the ugliness is confined
871b86b14eSAlexander Kabaev    *  within a single pair of inline functions, which each compile to
881b86b14eSAlexander Kabaev    *  a single "add" instruction: _Rep::_M_data(), and
891b86b14eSAlexander Kabaev    *  string::_M_rep(); and the allocation function which gets a
901b86b14eSAlexander Kabaev    *  block of raw bytes and with room enough and constructs a _Rep
911b86b14eSAlexander Kabaev    *  object at the front.
921b86b14eSAlexander Kabaev    *
931b86b14eSAlexander Kabaev    *  The reason you want _M_data pointing to the character array and
941b86b14eSAlexander Kabaev    *  not the _Rep is so that the debugger can see the string
951b86b14eSAlexander Kabaev    *  contents. (Probably we should add a non-inline member to get
961b86b14eSAlexander Kabaev    *  the _Rep for the debugger to use, so users can check the actual
971b86b14eSAlexander Kabaev    *  string length.)
981b86b14eSAlexander Kabaev    *
991b86b14eSAlexander Kabaev    *  Note that the _Rep object is a POD so that you can have a
1001b86b14eSAlexander Kabaev    *  static "empty string" _Rep object already "constructed" before
1011b86b14eSAlexander Kabaev    *  static constructors have run.  The reference-count encoding is
1021b86b14eSAlexander Kabaev    *  chosen so that a 0 indicates one reference, so you never try to
1031b86b14eSAlexander Kabaev    *  destroy the empty-string _Rep object.
1041b86b14eSAlexander Kabaev    *
1051b86b14eSAlexander Kabaev    *  All but the last paragraph is considered pretty conventional
1061b86b14eSAlexander Kabaev    *  for a C++ string implementation.
1071b86b14eSAlexander Kabaev    *  @endif
1081b86b14eSAlexander Kabaev   */
10900db7afdSDavid E. O'Brien   // 21.3  Template class basic_string
11000db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
11100db7afdSDavid E. O'Brien     class basic_string
11200db7afdSDavid E. O'Brien     {
113f8a1b7d9SAlexander Kabaev       typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
114f8a1b7d9SAlexander Kabaev 
11500db7afdSDavid E. O'Brien       // Types:
11600db7afdSDavid E. O'Brien     public:
11700db7afdSDavid E. O'Brien       typedef _Traits					    traits_type;
11800db7afdSDavid E. O'Brien       typedef typename _Traits::char_type		    value_type;
11900db7afdSDavid E. O'Brien       typedef _Alloc					    allocator_type;
120f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::size_type	    size_type;
121f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::difference_type   difference_type;
122f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::reference	    reference;
123f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::const_reference   const_reference;
124f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::pointer	    pointer;
125f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::const_pointer	    const_pointer;
12600db7afdSDavid E. O'Brien       typedef __gnu_cxx::__normal_iterator<pointer, basic_string>  iterator;
12700db7afdSDavid E. O'Brien       typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
12800db7afdSDavid E. O'Brien                                                             const_iterator;
1291b86b14eSAlexander Kabaev       typedef std::reverse_iterator<const_iterator>	const_reverse_iterator;
1301b86b14eSAlexander Kabaev       typedef std::reverse_iterator<iterator>		    reverse_iterator;
13100db7afdSDavid E. O'Brien 
13200db7afdSDavid E. O'Brien     private:
13300db7afdSDavid E. O'Brien       // _Rep: string representation
13400db7afdSDavid E. O'Brien       //   Invariants:
135ffeaf689SAlexander Kabaev       //   1. String really contains _M_length + 1 characters: due to 21.3.4
136ffeaf689SAlexander Kabaev       //      must be kept null-terminated.
13700db7afdSDavid E. O'Brien       //   2. _M_capacity >= _M_length
138ffeaf689SAlexander Kabaev       //      Allocated memory is always (_M_capacity + 1) * sizeof(_CharT).
139ffeaf689SAlexander Kabaev       //   3. _M_refcount has three states:
14000db7afdSDavid E. O'Brien       //      -1: leaked, one reference, no ref-copies allowed, non-const.
14100db7afdSDavid E. O'Brien       //       0: one reference, non-const.
14200db7afdSDavid E. O'Brien       //     n>0: n + 1 references, operations require a lock, const.
14300db7afdSDavid E. O'Brien       //   4. All fields==0 is an empty string, given the extra storage
14400db7afdSDavid E. O'Brien       //      beyond-the-end for a null terminator; thus, the shared
14500db7afdSDavid E. O'Brien       //      empty string representation needs no constructor.
146ffeaf689SAlexander Kabaev 
147ffeaf689SAlexander Kabaev       struct _Rep_base
148ffeaf689SAlexander Kabaev       {
149ffeaf689SAlexander Kabaev 	size_type		_M_length;
150ffeaf689SAlexander Kabaev 	size_type		_M_capacity;
151ffeaf689SAlexander Kabaev 	_Atomic_word		_M_refcount;
152ffeaf689SAlexander Kabaev       };
153ffeaf689SAlexander Kabaev 
154ffeaf689SAlexander Kabaev       struct _Rep : _Rep_base
15500db7afdSDavid E. O'Brien       {
15600db7afdSDavid E. O'Brien 	// Types:
15700db7afdSDavid E. O'Brien 	typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
15800db7afdSDavid E. O'Brien 
15900db7afdSDavid E. O'Brien 	// (Public) Data members:
16000db7afdSDavid E. O'Brien 
16100db7afdSDavid E. O'Brien 	// The maximum number of individual char_type elements of an
16200db7afdSDavid E. O'Brien 	// individual string is determined by _S_max_size. This is the
16300db7afdSDavid E. O'Brien 	// value that will be returned by max_size().  (Whereas npos
16400db7afdSDavid E. O'Brien 	// is the maximum number of bytes the allocator can allocate.)
16500db7afdSDavid E. O'Brien 	// If one was to divvy up the theoretical largest size string,
16600db7afdSDavid E. O'Brien 	// with a terminating character and m _CharT elements, it'd
16700db7afdSDavid E. O'Brien 	// look like this:
16800db7afdSDavid E. O'Brien 	// npos = sizeof(_Rep) + (m * sizeof(_CharT)) + sizeof(_CharT)
16900db7afdSDavid E. O'Brien 	// Solving for m:
17000db7afdSDavid E. O'Brien 	// m = ((npos - sizeof(_Rep))/sizeof(CharT)) - 1
171ffeaf689SAlexander Kabaev 	// In addition, this implementation quarters this amount.
17200db7afdSDavid E. O'Brien 	static const size_type	_S_max_size;
17300db7afdSDavid E. O'Brien 	static const _CharT	_S_terminal;
17400db7afdSDavid E. O'Brien 
175ffeaf689SAlexander Kabaev 	// The following storage is init'd to 0 by the linker, resulting
176ffeaf689SAlexander Kabaev         // (carefully) in an empty string with one reference.
177ffeaf689SAlexander Kabaev         static size_type _S_empty_rep_storage[];
178ffeaf689SAlexander Kabaev 
179ffeaf689SAlexander Kabaev         static _Rep&
180ffeaf689SAlexander Kabaev         _S_empty_rep()
181f8a1b7d9SAlexander Kabaev         {
182f8a1b7d9SAlexander Kabaev 	  // NB: Mild hack to avoid strict-aliasing warnings.  Note that
183f8a1b7d9SAlexander Kabaev 	  // _S_empty_rep_storage is never modified and the punning should
184f8a1b7d9SAlexander Kabaev 	  // be reasonably safe in this case.
185f8a1b7d9SAlexander Kabaev 	  void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
186f8a1b7d9SAlexander Kabaev 	  return *reinterpret_cast<_Rep*>(__p);
187f8a1b7d9SAlexander Kabaev 	}
18800db7afdSDavid E. O'Brien 
18900db7afdSDavid E. O'Brien         bool
19000db7afdSDavid E. O'Brien 	_M_is_leaked() const
191ffeaf689SAlexander Kabaev         { return this->_M_refcount < 0; }
19200db7afdSDavid E. O'Brien 
19300db7afdSDavid E. O'Brien         bool
19400db7afdSDavid E. O'Brien 	_M_is_shared() const
195ffeaf689SAlexander Kabaev         { return this->_M_refcount > 0; }
19600db7afdSDavid E. O'Brien 
19700db7afdSDavid E. O'Brien         void
19800db7afdSDavid E. O'Brien 	_M_set_leaked()
199ffeaf689SAlexander Kabaev         { this->_M_refcount = -1; }
20000db7afdSDavid E. O'Brien 
20100db7afdSDavid E. O'Brien         void
20200db7afdSDavid E. O'Brien 	_M_set_sharable()
203ffeaf689SAlexander Kabaev         { this->_M_refcount = 0; }
20400db7afdSDavid E. O'Brien 
205f8a1b7d9SAlexander Kabaev 	void
206f8a1b7d9SAlexander Kabaev 	_M_set_length_and_sharable(size_type __n)
207f8a1b7d9SAlexander Kabaev 	{
208f8a1b7d9SAlexander Kabaev 	  this->_M_set_sharable();  // One reference.
209f8a1b7d9SAlexander Kabaev 	  this->_M_length = __n;
210f8a1b7d9SAlexander Kabaev 	  traits_type::assign(this->_M_refdata()[__n], _S_terminal);
211f8a1b7d9SAlexander Kabaev 	  // grrr. (per 21.3.4)
212f8a1b7d9SAlexander Kabaev 	  // You cannot leave those LWG people alone for a second.
213f8a1b7d9SAlexander Kabaev 	}
214f8a1b7d9SAlexander Kabaev 
21500db7afdSDavid E. O'Brien 	_CharT*
21600db7afdSDavid E. O'Brien 	_M_refdata() throw()
21700db7afdSDavid E. O'Brien 	{ return reinterpret_cast<_CharT*>(this + 1); }
21800db7afdSDavid E. O'Brien 
21900db7afdSDavid E. O'Brien 	_CharT*
22000db7afdSDavid E. O'Brien 	_M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
22100db7afdSDavid E. O'Brien 	{
22200db7afdSDavid E. O'Brien 	  return (!_M_is_leaked() && __alloc1 == __alloc2)
22300db7afdSDavid E. O'Brien 	          ? _M_refcopy() : _M_clone(__alloc1);
22400db7afdSDavid E. O'Brien 	}
22500db7afdSDavid E. O'Brien 
22600db7afdSDavid E. O'Brien 	// Create & Destroy
22700db7afdSDavid E. O'Brien 	static _Rep*
228ffeaf689SAlexander Kabaev 	_S_create(size_type, size_type, const _Alloc&);
22900db7afdSDavid E. O'Brien 
23000db7afdSDavid E. O'Brien 	void
23100db7afdSDavid E. O'Brien 	_M_dispose(const _Alloc& __a)
23200db7afdSDavid E. O'Brien 	{
233f260e61bSAlexander Kabaev #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
234ffeaf689SAlexander Kabaev 	  if (__builtin_expect(this != &_S_empty_rep(), false))
235f260e61bSAlexander Kabaev #endif
236f8a1b7d9SAlexander Kabaev 	    if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
237f8a1b7d9SAlexander Kabaev 						       -1) <= 0)
23800db7afdSDavid E. O'Brien 	      _M_destroy(__a);
23900db7afdSDavid E. O'Brien 	}  // XXX MT
24000db7afdSDavid E. O'Brien 
24100db7afdSDavid E. O'Brien 	void
24200db7afdSDavid E. O'Brien 	_M_destroy(const _Alloc&) throw();
24300db7afdSDavid E. O'Brien 
24400db7afdSDavid E. O'Brien 	_CharT*
24500db7afdSDavid E. O'Brien 	_M_refcopy() throw()
24600db7afdSDavid E. O'Brien 	{
247f260e61bSAlexander Kabaev #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
248ffeaf689SAlexander Kabaev 	  if (__builtin_expect(this != &_S_empty_rep(), false))
249f260e61bSAlexander Kabaev #endif
250f8a1b7d9SAlexander Kabaev             __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
25100db7afdSDavid E. O'Brien 	  return _M_refdata();
25200db7afdSDavid E. O'Brien 	}  // XXX MT
25300db7afdSDavid E. O'Brien 
25400db7afdSDavid E. O'Brien 	_CharT*
25500db7afdSDavid E. O'Brien 	_M_clone(const _Alloc&, size_type __res = 0);
25600db7afdSDavid E. O'Brien       };
25700db7afdSDavid E. O'Brien 
25800db7afdSDavid E. O'Brien       // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
25900db7afdSDavid E. O'Brien       struct _Alloc_hider : _Alloc
26000db7afdSDavid E. O'Brien       {
26100db7afdSDavid E. O'Brien 	_Alloc_hider(_CharT* __dat, const _Alloc& __a)
26200db7afdSDavid E. O'Brien 	: _Alloc(__a), _M_p(__dat) { }
26300db7afdSDavid E. O'Brien 
26400db7afdSDavid E. O'Brien 	_CharT* _M_p; // The actual data.
26500db7afdSDavid E. O'Brien       };
26600db7afdSDavid E. O'Brien 
26700db7afdSDavid E. O'Brien     public:
26800db7afdSDavid E. O'Brien       // Data Members (public):
26900db7afdSDavid E. O'Brien       // NB: This is an unsigned type, and thus represents the maximum
27000db7afdSDavid E. O'Brien       // size that the allocator can hold.
271ffeaf689SAlexander Kabaev       ///  Value returned by various member functions when they fail.
27200db7afdSDavid E. O'Brien       static const size_type	npos = static_cast<size_type>(-1);
27300db7afdSDavid E. O'Brien 
27400db7afdSDavid E. O'Brien     private:
27500db7afdSDavid E. O'Brien       // Data Members (private):
27600db7afdSDavid E. O'Brien       mutable _Alloc_hider	_M_dataplus;
27700db7afdSDavid E. O'Brien 
27800db7afdSDavid E. O'Brien       _CharT*
27900db7afdSDavid E. O'Brien       _M_data() const
28000db7afdSDavid E. O'Brien       { return  _M_dataplus._M_p; }
28100db7afdSDavid E. O'Brien 
28200db7afdSDavid E. O'Brien       _CharT*
28300db7afdSDavid E. O'Brien       _M_data(_CharT* __p)
28400db7afdSDavid E. O'Brien       { return (_M_dataplus._M_p = __p); }
28500db7afdSDavid E. O'Brien 
28600db7afdSDavid E. O'Brien       _Rep*
28700db7afdSDavid E. O'Brien       _M_rep() const
28800db7afdSDavid E. O'Brien       { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
28900db7afdSDavid E. O'Brien 
29000db7afdSDavid E. O'Brien       // For the internal use we have functions similar to `begin'/`end'
29100db7afdSDavid E. O'Brien       // but they do not call _M_leak.
29200db7afdSDavid E. O'Brien       iterator
293f8a1b7d9SAlexander Kabaev       _M_ibegin() const
294f8a1b7d9SAlexander Kabaev       { return iterator(_M_data()); }
29500db7afdSDavid E. O'Brien 
29600db7afdSDavid E. O'Brien       iterator
297f8a1b7d9SAlexander Kabaev       _M_iend() const
298f8a1b7d9SAlexander Kabaev       { return iterator(_M_data() + this->size()); }
29900db7afdSDavid E. O'Brien 
30000db7afdSDavid E. O'Brien       void
30100db7afdSDavid E. O'Brien       _M_leak()    // for use in begin() & non-const op[]
30200db7afdSDavid E. O'Brien       {
30300db7afdSDavid E. O'Brien 	if (!_M_rep()->_M_is_leaked())
30400db7afdSDavid E. O'Brien 	  _M_leak_hard();
30500db7afdSDavid E. O'Brien       }
30600db7afdSDavid E. O'Brien 
307ffeaf689SAlexander Kabaev       size_type
308ffeaf689SAlexander Kabaev       _M_check(size_type __pos, const char* __s) const
30900db7afdSDavid E. O'Brien       {
31000db7afdSDavid E. O'Brien 	if (__pos > this->size())
311ffeaf689SAlexander Kabaev 	  __throw_out_of_range(__N(__s));
312ffeaf689SAlexander Kabaev 	return __pos;
31300db7afdSDavid E. O'Brien       }
31400db7afdSDavid E. O'Brien 
315f8a1b7d9SAlexander Kabaev       void
316f8a1b7d9SAlexander Kabaev       _M_check_length(size_type __n1, size_type __n2, const char* __s) const
317f8a1b7d9SAlexander Kabaev       {
318f8a1b7d9SAlexander Kabaev 	if (this->max_size() - (this->size() - __n1) < __n2)
319f8a1b7d9SAlexander Kabaev 	  __throw_length_error(__N(__s));
320f8a1b7d9SAlexander Kabaev       }
321f8a1b7d9SAlexander Kabaev 
322ffeaf689SAlexander Kabaev       // NB: _M_limit doesn't check for a bad __pos value.
323ffeaf689SAlexander Kabaev       size_type
324ffeaf689SAlexander Kabaev       _M_limit(size_type __pos, size_type __off) const
32500db7afdSDavid E. O'Brien       {
326ffeaf689SAlexander Kabaev 	const bool __testoff =  __off < this->size() - __pos;
327ffeaf689SAlexander Kabaev 	return __testoff ? __off : this->size() - __pos;
32800db7afdSDavid E. O'Brien       }
32900db7afdSDavid E. O'Brien 
330f8a1b7d9SAlexander Kabaev       // True if _Rep and source do not overlap.
331f8a1b7d9SAlexander Kabaev       bool
332f8a1b7d9SAlexander Kabaev       _M_disjunct(const _CharT* __s) const
333f8a1b7d9SAlexander Kabaev       {
334f8a1b7d9SAlexander Kabaev 	return (less<const _CharT*>()(__s, _M_data())
335f8a1b7d9SAlexander Kabaev 		|| less<const _CharT*>()(_M_data() + this->size(), __s));
336f8a1b7d9SAlexander Kabaev       }
337f8a1b7d9SAlexander Kabaev 
338f8a1b7d9SAlexander Kabaev       // When __n = 1 way faster than the general multichar
339f8a1b7d9SAlexander Kabaev       // traits_type::copy/move/assign.
340f8a1b7d9SAlexander Kabaev       static void
341f8a1b7d9SAlexander Kabaev       _M_copy(_CharT* __d, const _CharT* __s, size_type __n)
342f8a1b7d9SAlexander Kabaev       {
343f8a1b7d9SAlexander Kabaev 	if (__n == 1)
344f8a1b7d9SAlexander Kabaev 	  traits_type::assign(*__d, *__s);
345f8a1b7d9SAlexander Kabaev 	else
346f8a1b7d9SAlexander Kabaev 	  traits_type::copy(__d, __s, __n);
347f8a1b7d9SAlexander Kabaev       }
348f8a1b7d9SAlexander Kabaev 
349f8a1b7d9SAlexander Kabaev       static void
350f8a1b7d9SAlexander Kabaev       _M_move(_CharT* __d, const _CharT* __s, size_type __n)
351f8a1b7d9SAlexander Kabaev       {
352f8a1b7d9SAlexander Kabaev 	if (__n == 1)
353f8a1b7d9SAlexander Kabaev 	  traits_type::assign(*__d, *__s);
354f8a1b7d9SAlexander Kabaev 	else
355f8a1b7d9SAlexander Kabaev 	  traits_type::move(__d, __s, __n);
356f8a1b7d9SAlexander Kabaev       }
357f8a1b7d9SAlexander Kabaev 
358f8a1b7d9SAlexander Kabaev       static void
359f8a1b7d9SAlexander Kabaev       _M_assign(_CharT* __d, size_type __n, _CharT __c)
360f8a1b7d9SAlexander Kabaev       {
361f8a1b7d9SAlexander Kabaev 	if (__n == 1)
362f8a1b7d9SAlexander Kabaev 	  traits_type::assign(*__d, __c);
363f8a1b7d9SAlexander Kabaev 	else
364f8a1b7d9SAlexander Kabaev 	  traits_type::assign(__d, __n, __c);
365f8a1b7d9SAlexander Kabaev       }
366f8a1b7d9SAlexander Kabaev 
36700db7afdSDavid E. O'Brien       // _S_copy_chars is a separate template to permit specialization
36800db7afdSDavid E. O'Brien       // to optimize for the common case of pointers as iterators.
36900db7afdSDavid E. O'Brien       template<class _Iterator>
37000db7afdSDavid E. O'Brien         static void
37100db7afdSDavid E. O'Brien         _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
37200db7afdSDavid E. O'Brien         {
37300db7afdSDavid E. O'Brien 	  for (; __k1 != __k2; ++__k1, ++__p)
37400db7afdSDavid E. O'Brien 	    traits_type::assign(*__p, *__k1); // These types are off.
37500db7afdSDavid E. O'Brien 	}
37600db7afdSDavid E. O'Brien 
37700db7afdSDavid E. O'Brien       static void
37800db7afdSDavid E. O'Brien       _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2)
37900db7afdSDavid E. O'Brien       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
38000db7afdSDavid E. O'Brien 
38100db7afdSDavid E. O'Brien       static void
38200db7afdSDavid E. O'Brien       _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
38300db7afdSDavid E. O'Brien       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
38400db7afdSDavid E. O'Brien 
38500db7afdSDavid E. O'Brien       static void
38600db7afdSDavid E. O'Brien       _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
387f8a1b7d9SAlexander Kabaev       { _M_copy(__p, __k1, __k2 - __k1); }
38800db7afdSDavid E. O'Brien 
38900db7afdSDavid E. O'Brien       static void
39000db7afdSDavid E. O'Brien       _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
391f8a1b7d9SAlexander Kabaev       { _M_copy(__p, __k1, __k2 - __k1); }
39200db7afdSDavid E. O'Brien 
393*096464d3SPedro F. Giffuni       static int
394*096464d3SPedro F. Giffuni       _S_compare(size_type __x, size_type __y)
395*096464d3SPedro F. Giffuni       {
396*096464d3SPedro F. Giffuni          if (__x > __y)
397*096464d3SPedro F. Giffuni             return 1;
398*096464d3SPedro F. Giffuni          if (__x < __y)
399*096464d3SPedro F. Giffuni             return -1;
400*096464d3SPedro F. Giffuni          return 0;
401*096464d3SPedro F. Giffuni       }
402*096464d3SPedro F. Giffuni 
40300db7afdSDavid E. O'Brien       void
40400db7afdSDavid E. O'Brien       _M_mutate(size_type __pos, size_type __len1, size_type __len2);
40500db7afdSDavid E. O'Brien 
40600db7afdSDavid E. O'Brien       void
40700db7afdSDavid E. O'Brien       _M_leak_hard();
40800db7afdSDavid E. O'Brien 
40900db7afdSDavid E. O'Brien       static _Rep&
41000db7afdSDavid E. O'Brien       _S_empty_rep()
411ffeaf689SAlexander Kabaev       { return _Rep::_S_empty_rep(); }
41200db7afdSDavid E. O'Brien 
41300db7afdSDavid E. O'Brien     public:
41400db7afdSDavid E. O'Brien       // Construct/copy/destroy:
41500db7afdSDavid E. O'Brien       // NB: We overload ctors in some cases instead of using default
41600db7afdSDavid E. O'Brien       // arguments, per 17.4.4.4 para. 2 item 2.
41700db7afdSDavid E. O'Brien 
418ffeaf689SAlexander Kabaev       /**
419ffeaf689SAlexander Kabaev        *  @brief  Default constructor creates an empty string.
420ffeaf689SAlexander Kabaev        */
42100db7afdSDavid E. O'Brien       inline
42200db7afdSDavid E. O'Brien       basic_string();
42300db7afdSDavid E. O'Brien 
424ffeaf689SAlexander Kabaev       /**
425f8a1b7d9SAlexander Kabaev        *  @brief  Construct an empty string using allocator @a a.
426ffeaf689SAlexander Kabaev        */
42700db7afdSDavid E. O'Brien       explicit
42800db7afdSDavid E. O'Brien       basic_string(const _Alloc& __a);
42900db7afdSDavid E. O'Brien 
43000db7afdSDavid E. O'Brien       // NB: per LWG issue 42, semantics different from IS:
431ffeaf689SAlexander Kabaev       /**
432ffeaf689SAlexander Kabaev        *  @brief  Construct string with copy of value of @a str.
433ffeaf689SAlexander Kabaev        *  @param  str  Source string.
434ffeaf689SAlexander Kabaev        */
43500db7afdSDavid E. O'Brien       basic_string(const basic_string& __str);
436ffeaf689SAlexander Kabaev       /**
437ffeaf689SAlexander Kabaev        *  @brief  Construct string as copy of a substring.
438ffeaf689SAlexander Kabaev        *  @param  str  Source string.
439ffeaf689SAlexander Kabaev        *  @param  pos  Index of first character to copy from.
440ffeaf689SAlexander Kabaev        *  @param  n  Number of characters to copy (default remainder).
441ffeaf689SAlexander Kabaev        */
44200db7afdSDavid E. O'Brien       basic_string(const basic_string& __str, size_type __pos,
44300db7afdSDavid E. O'Brien 		   size_type __n = npos);
444ffeaf689SAlexander Kabaev       /**
445ffeaf689SAlexander Kabaev        *  @brief  Construct string as copy of a substring.
446ffeaf689SAlexander Kabaev        *  @param  str  Source string.
447ffeaf689SAlexander Kabaev        *  @param  pos  Index of first character to copy from.
448ffeaf689SAlexander Kabaev        *  @param  n  Number of characters to copy.
449ffeaf689SAlexander Kabaev        *  @param  a  Allocator to use.
450ffeaf689SAlexander Kabaev        */
45100db7afdSDavid E. O'Brien       basic_string(const basic_string& __str, size_type __pos,
45200db7afdSDavid E. O'Brien 		   size_type __n, const _Alloc& __a);
45300db7afdSDavid E. O'Brien 
454ffeaf689SAlexander Kabaev       /**
455ffeaf689SAlexander Kabaev        *  @brief  Construct string initialized by a character array.
456ffeaf689SAlexander Kabaev        *  @param  s  Source character array.
457ffeaf689SAlexander Kabaev        *  @param  n  Number of characters to copy.
458ffeaf689SAlexander Kabaev        *  @param  a  Allocator to use (default is default allocator).
459ffeaf689SAlexander Kabaev        *
460f8a1b7d9SAlexander Kabaev        *  NB: @a s must have at least @a n characters, '\0' has no special
461ffeaf689SAlexander Kabaev        *  meaning.
462ffeaf689SAlexander Kabaev        */
46300db7afdSDavid E. O'Brien       basic_string(const _CharT* __s, size_type __n,
46400db7afdSDavid E. O'Brien 		   const _Alloc& __a = _Alloc());
465ffeaf689SAlexander Kabaev       /**
466ffeaf689SAlexander Kabaev        *  @brief  Construct string as copy of a C string.
467ffeaf689SAlexander Kabaev        *  @param  s  Source C string.
468ffeaf689SAlexander Kabaev        *  @param  a  Allocator to use (default is default allocator).
469ffeaf689SAlexander Kabaev        */
47000db7afdSDavid E. O'Brien       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
471ffeaf689SAlexander Kabaev       /**
472ffeaf689SAlexander Kabaev        *  @brief  Construct string as multiple characters.
473ffeaf689SAlexander Kabaev        *  @param  n  Number of characters.
474ffeaf689SAlexander Kabaev        *  @param  c  Character to use.
475ffeaf689SAlexander Kabaev        *  @param  a  Allocator to use (default is default allocator).
476ffeaf689SAlexander Kabaev        */
47700db7afdSDavid E. O'Brien       basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
47800db7afdSDavid E. O'Brien 
479ffeaf689SAlexander Kabaev       /**
480ffeaf689SAlexander Kabaev        *  @brief  Construct string as copy of a range.
481ffeaf689SAlexander Kabaev        *  @param  beg  Start of range.
482ffeaf689SAlexander Kabaev        *  @param  end  End of range.
483ffeaf689SAlexander Kabaev        *  @param  a  Allocator to use (default is default allocator).
484ffeaf689SAlexander Kabaev        */
48500db7afdSDavid E. O'Brien       template<class _InputIterator>
48600db7afdSDavid E. O'Brien         basic_string(_InputIterator __beg, _InputIterator __end,
48700db7afdSDavid E. O'Brien 		     const _Alloc& __a = _Alloc());
48800db7afdSDavid E. O'Brien 
489ffeaf689SAlexander Kabaev       /**
490ffeaf689SAlexander Kabaev        *  @brief  Destroy the string instance.
491ffeaf689SAlexander Kabaev        */
49200db7afdSDavid E. O'Brien       ~basic_string()
49300db7afdSDavid E. O'Brien       { _M_rep()->_M_dispose(this->get_allocator()); }
49400db7afdSDavid E. O'Brien 
495ffeaf689SAlexander Kabaev       /**
496ffeaf689SAlexander Kabaev        *  @brief  Assign the value of @a str to this string.
497ffeaf689SAlexander Kabaev        *  @param  str  Source string.
498ffeaf689SAlexander Kabaev        */
49900db7afdSDavid E. O'Brien       basic_string&
500ffeaf689SAlexander Kabaev       operator=(const basic_string& __str)
501f8a1b7d9SAlexander Kabaev       { return this->assign(__str); }
50200db7afdSDavid E. O'Brien 
503ffeaf689SAlexander Kabaev       /**
504ffeaf689SAlexander Kabaev        *  @brief  Copy contents of @a s into this string.
505ffeaf689SAlexander Kabaev        *  @param  s  Source null-terminated string.
506ffeaf689SAlexander Kabaev        */
50700db7afdSDavid E. O'Brien       basic_string&
508ffeaf689SAlexander Kabaev       operator=(const _CharT* __s)
509f8a1b7d9SAlexander Kabaev       { return this->assign(__s); }
51000db7afdSDavid E. O'Brien 
511ffeaf689SAlexander Kabaev       /**
512ffeaf689SAlexander Kabaev        *  @brief  Set value to string of length 1.
513ffeaf689SAlexander Kabaev        *  @param  c  Source character.
514ffeaf689SAlexander Kabaev        *
515ffeaf689SAlexander Kabaev        *  Assigning to a character makes this string length 1 and
516ffeaf689SAlexander Kabaev        *  (*this)[0] == @a c.
517ffeaf689SAlexander Kabaev        */
51800db7afdSDavid E. O'Brien       basic_string&
519ffeaf689SAlexander Kabaev       operator=(_CharT __c)
520ffeaf689SAlexander Kabaev       {
521ffeaf689SAlexander Kabaev 	this->assign(1, __c);
522ffeaf689SAlexander Kabaev 	return *this;
523ffeaf689SAlexander Kabaev       }
52400db7afdSDavid E. O'Brien 
52500db7afdSDavid E. O'Brien       // Iterators:
526ffeaf689SAlexander Kabaev       /**
527ffeaf689SAlexander Kabaev        *  Returns a read/write iterator that points to the first character in
528ffeaf689SAlexander Kabaev        *  the %string.  Unshares the string.
529ffeaf689SAlexander Kabaev        */
53000db7afdSDavid E. O'Brien       iterator
53100db7afdSDavid E. O'Brien       begin()
53200db7afdSDavid E. O'Brien       {
53300db7afdSDavid E. O'Brien 	_M_leak();
53400db7afdSDavid E. O'Brien 	return iterator(_M_data());
53500db7afdSDavid E. O'Brien       }
53600db7afdSDavid E. O'Brien 
537ffeaf689SAlexander Kabaev       /**
538ffeaf689SAlexander Kabaev        *  Returns a read-only (constant) iterator that points to the first
539ffeaf689SAlexander Kabaev        *  character in the %string.
540ffeaf689SAlexander Kabaev        */
54100db7afdSDavid E. O'Brien       const_iterator
54200db7afdSDavid E. O'Brien       begin() const
54300db7afdSDavid E. O'Brien       { return const_iterator(_M_data()); }
54400db7afdSDavid E. O'Brien 
545ffeaf689SAlexander Kabaev       /**
546ffeaf689SAlexander Kabaev        *  Returns a read/write iterator that points one past the last
547ffeaf689SAlexander Kabaev        *  character in the %string.  Unshares the string.
548ffeaf689SAlexander Kabaev        */
54900db7afdSDavid E. O'Brien       iterator
55000db7afdSDavid E. O'Brien       end()
55100db7afdSDavid E. O'Brien       {
55200db7afdSDavid E. O'Brien 	_M_leak();
55300db7afdSDavid E. O'Brien 	return iterator(_M_data() + this->size());
55400db7afdSDavid E. O'Brien       }
55500db7afdSDavid E. O'Brien 
556ffeaf689SAlexander Kabaev       /**
557ffeaf689SAlexander Kabaev        *  Returns a read-only (constant) iterator that points one past the
558ffeaf689SAlexander Kabaev        *  last character in the %string.
559ffeaf689SAlexander Kabaev        */
56000db7afdSDavid E. O'Brien       const_iterator
56100db7afdSDavid E. O'Brien       end() const
56200db7afdSDavid E. O'Brien       { return const_iterator(_M_data() + this->size()); }
56300db7afdSDavid E. O'Brien 
564ffeaf689SAlexander Kabaev       /**
565ffeaf689SAlexander Kabaev        *  Returns a read/write reverse iterator that points to the last
566ffeaf689SAlexander Kabaev        *  character in the %string.  Iteration is done in reverse element
567ffeaf689SAlexander Kabaev        *  order.  Unshares the string.
568ffeaf689SAlexander Kabaev        */
56900db7afdSDavid E. O'Brien       reverse_iterator
57000db7afdSDavid E. O'Brien       rbegin()
57100db7afdSDavid E. O'Brien       { return reverse_iterator(this->end()); }
57200db7afdSDavid E. O'Brien 
573ffeaf689SAlexander Kabaev       /**
574ffeaf689SAlexander Kabaev        *  Returns a read-only (constant) reverse iterator that points
575ffeaf689SAlexander Kabaev        *  to the last character in the %string.  Iteration is done in
576ffeaf689SAlexander Kabaev        *  reverse element order.
577ffeaf689SAlexander Kabaev        */
57800db7afdSDavid E. O'Brien       const_reverse_iterator
57900db7afdSDavid E. O'Brien       rbegin() const
58000db7afdSDavid E. O'Brien       { return const_reverse_iterator(this->end()); }
58100db7afdSDavid E. O'Brien 
582ffeaf689SAlexander Kabaev       /**
583ffeaf689SAlexander Kabaev        *  Returns a read/write reverse iterator that points to one before the
584ffeaf689SAlexander Kabaev        *  first character in the %string.  Iteration is done in reverse
585ffeaf689SAlexander Kabaev        *  element order.  Unshares the string.
586ffeaf689SAlexander Kabaev        */
58700db7afdSDavid E. O'Brien       reverse_iterator
58800db7afdSDavid E. O'Brien       rend()
58900db7afdSDavid E. O'Brien       { return reverse_iterator(this->begin()); }
59000db7afdSDavid E. O'Brien 
591ffeaf689SAlexander Kabaev       /**
592ffeaf689SAlexander Kabaev        *  Returns a read-only (constant) reverse iterator that points
593ffeaf689SAlexander Kabaev        *  to one before the first character in the %string.  Iteration
594ffeaf689SAlexander Kabaev        *  is done in reverse element order.
595ffeaf689SAlexander Kabaev        */
59600db7afdSDavid E. O'Brien       const_reverse_iterator
59700db7afdSDavid E. O'Brien       rend() const
59800db7afdSDavid E. O'Brien       { return const_reverse_iterator(this->begin()); }
59900db7afdSDavid E. O'Brien 
60000db7afdSDavid E. O'Brien     public:
60100db7afdSDavid E. O'Brien       // Capacity:
602ffeaf689SAlexander Kabaev       ///  Returns the number of characters in the string, not including any
603ffeaf689SAlexander Kabaev       ///  null-termination.
60400db7afdSDavid E. O'Brien       size_type
605f8a1b7d9SAlexander Kabaev       size() const
606f8a1b7d9SAlexander Kabaev       { return _M_rep()->_M_length; }
60700db7afdSDavid E. O'Brien 
608ffeaf689SAlexander Kabaev       ///  Returns the number of characters in the string, not including any
609ffeaf689SAlexander Kabaev       ///  null-termination.
61000db7afdSDavid E. O'Brien       size_type
611f8a1b7d9SAlexander Kabaev       length() const
612f8a1b7d9SAlexander Kabaev       { return _M_rep()->_M_length; }
61300db7afdSDavid E. O'Brien 
614ffeaf689SAlexander Kabaev       /// Returns the size() of the largest possible %string.
61500db7afdSDavid E. O'Brien       size_type
616f8a1b7d9SAlexander Kabaev       max_size() const
617f8a1b7d9SAlexander Kabaev       { return _Rep::_S_max_size; }
61800db7afdSDavid E. O'Brien 
619ffeaf689SAlexander Kabaev       /**
620ffeaf689SAlexander Kabaev        *  @brief  Resizes the %string to the specified number of characters.
621ffeaf689SAlexander Kabaev        *  @param  n  Number of characters the %string should contain.
622ffeaf689SAlexander Kabaev        *  @param  c  Character to fill any new elements.
623ffeaf689SAlexander Kabaev        *
624ffeaf689SAlexander Kabaev        *  This function will %resize the %string to the specified
625ffeaf689SAlexander Kabaev        *  number of characters.  If the number is smaller than the
626ffeaf689SAlexander Kabaev        *  %string's current size the %string is truncated, otherwise
627ffeaf689SAlexander Kabaev        *  the %string is extended and new elements are set to @a c.
628ffeaf689SAlexander Kabaev        */
62900db7afdSDavid E. O'Brien       void
63000db7afdSDavid E. O'Brien       resize(size_type __n, _CharT __c);
63100db7afdSDavid E. O'Brien 
632ffeaf689SAlexander Kabaev       /**
633ffeaf689SAlexander Kabaev        *  @brief  Resizes the %string to the specified number of characters.
634ffeaf689SAlexander Kabaev        *  @param  n  Number of characters the %string should contain.
635ffeaf689SAlexander Kabaev        *
636ffeaf689SAlexander Kabaev        *  This function will resize the %string to the specified length.  If
637ffeaf689SAlexander Kabaev        *  the new size is smaller than the %string's current size the %string
638ffeaf689SAlexander Kabaev        *  is truncated, otherwise the %string is extended and new characters
639ffeaf689SAlexander Kabaev        *  are default-constructed.  For basic types such as char, this means
640ffeaf689SAlexander Kabaev        *  setting them to 0.
641ffeaf689SAlexander Kabaev        */
64200db7afdSDavid E. O'Brien       void
643f8a1b7d9SAlexander Kabaev       resize(size_type __n)
644f8a1b7d9SAlexander Kabaev       { this->resize(__n, _CharT()); }
64500db7afdSDavid E. O'Brien 
646ffeaf689SAlexander Kabaev       /**
647ffeaf689SAlexander Kabaev        *  Returns the total number of characters that the %string can hold
648ffeaf689SAlexander Kabaev        *  before needing to allocate more memory.
649ffeaf689SAlexander Kabaev        */
65000db7afdSDavid E. O'Brien       size_type
651f8a1b7d9SAlexander Kabaev       capacity() const
652f8a1b7d9SAlexander Kabaev       { return _M_rep()->_M_capacity; }
65300db7afdSDavid E. O'Brien 
654ffeaf689SAlexander Kabaev       /**
655ffeaf689SAlexander Kabaev        *  @brief  Attempt to preallocate enough memory for specified number of
656ffeaf689SAlexander Kabaev        *          characters.
657f8a1b7d9SAlexander Kabaev        *  @param  res_arg  Number of characters required.
658f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If @a res_arg exceeds @c max_size().
659ffeaf689SAlexander Kabaev        *
660ffeaf689SAlexander Kabaev        *  This function attempts to reserve enough memory for the
661ffeaf689SAlexander Kabaev        *  %string to hold the specified number of characters.  If the
662ffeaf689SAlexander Kabaev        *  number requested is more than max_size(), length_error is
663ffeaf689SAlexander Kabaev        *  thrown.
664ffeaf689SAlexander Kabaev        *
665ffeaf689SAlexander Kabaev        *  The advantage of this function is that if optimal code is a
666ffeaf689SAlexander Kabaev        *  necessity and the user can determine the string length that will be
667ffeaf689SAlexander Kabaev        *  required, the user can reserve the memory in %advance, and thus
668ffeaf689SAlexander Kabaev        *  prevent a possible reallocation of memory and copying of %string
669ffeaf689SAlexander Kabaev        *  data.
670ffeaf689SAlexander Kabaev        */
67100db7afdSDavid E. O'Brien       void
67200db7afdSDavid E. O'Brien       reserve(size_type __res_arg = 0);
67300db7afdSDavid E. O'Brien 
674ffeaf689SAlexander Kabaev       /**
675ffeaf689SAlexander Kabaev        *  Erases the string, making it empty.
676ffeaf689SAlexander Kabaev        */
67700db7afdSDavid E. O'Brien       void
678f8a1b7d9SAlexander Kabaev       clear()
679f8a1b7d9SAlexander Kabaev       { _M_mutate(0, this->size(), 0); }
68000db7afdSDavid E. O'Brien 
681ffeaf689SAlexander Kabaev       /**
682ffeaf689SAlexander Kabaev        *  Returns true if the %string is empty.  Equivalent to *this == "".
683ffeaf689SAlexander Kabaev        */
68400db7afdSDavid E. O'Brien       bool
685f8a1b7d9SAlexander Kabaev       empty() const
686f8a1b7d9SAlexander Kabaev       { return this->size() == 0; }
68700db7afdSDavid E. O'Brien 
68800db7afdSDavid E. O'Brien       // Element access:
689ffeaf689SAlexander Kabaev       /**
690ffeaf689SAlexander Kabaev        *  @brief  Subscript access to the data contained in the %string.
691f8a1b7d9SAlexander Kabaev        *  @param  pos  The index of the character to access.
692ffeaf689SAlexander Kabaev        *  @return  Read-only (constant) reference to the character.
693ffeaf689SAlexander Kabaev        *
694ffeaf689SAlexander Kabaev        *  This operator allows for easy, array-style, data access.
695ffeaf689SAlexander Kabaev        *  Note that data access with this operator is unchecked and
696ffeaf689SAlexander Kabaev        *  out_of_range lookups are not defined. (For checked lookups
697ffeaf689SAlexander Kabaev        *  see at().)
698ffeaf689SAlexander Kabaev        */
69900db7afdSDavid E. O'Brien       const_reference
70000db7afdSDavid E. O'Brien       operator[] (size_type __pos) const
701ffeaf689SAlexander Kabaev       {
702ffeaf689SAlexander Kabaev 	_GLIBCXX_DEBUG_ASSERT(__pos <= size());
703ffeaf689SAlexander Kabaev 	return _M_data()[__pos];
704ffeaf689SAlexander Kabaev       }
70500db7afdSDavid E. O'Brien 
706ffeaf689SAlexander Kabaev       /**
707ffeaf689SAlexander Kabaev        *  @brief  Subscript access to the data contained in the %string.
708f8a1b7d9SAlexander Kabaev        *  @param  pos  The index of the character to access.
709ffeaf689SAlexander Kabaev        *  @return  Read/write reference to the character.
710ffeaf689SAlexander Kabaev        *
711ffeaf689SAlexander Kabaev        *  This operator allows for easy, array-style, data access.
712ffeaf689SAlexander Kabaev        *  Note that data access with this operator is unchecked and
713ffeaf689SAlexander Kabaev        *  out_of_range lookups are not defined. (For checked lookups
714ffeaf689SAlexander Kabaev        *  see at().)  Unshares the string.
715ffeaf689SAlexander Kabaev        */
71600db7afdSDavid E. O'Brien       reference
71700db7afdSDavid E. O'Brien       operator[](size_type __pos)
71800db7afdSDavid E. O'Brien       {
719f8a1b7d9SAlexander Kabaev         // allow pos == size() as v3 extension:
720f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_ASSERT(__pos <= size());
721f8a1b7d9SAlexander Kabaev         // but be strict in pedantic mode:
722f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(__pos < size());
72300db7afdSDavid E. O'Brien 	_M_leak();
72400db7afdSDavid E. O'Brien 	return _M_data()[__pos];
72500db7afdSDavid E. O'Brien       }
72600db7afdSDavid E. O'Brien 
727ffeaf689SAlexander Kabaev       /**
728ffeaf689SAlexander Kabaev        *  @brief  Provides access to the data contained in the %string.
729ffeaf689SAlexander Kabaev        *  @param n The index of the character to access.
730ffeaf689SAlexander Kabaev        *  @return  Read-only (const) reference to the character.
731ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a n is an invalid index.
732ffeaf689SAlexander Kabaev        *
733ffeaf689SAlexander Kabaev        *  This function provides for safer data access.  The parameter is
734ffeaf689SAlexander Kabaev        *  first checked that it is in the range of the string.  The function
735ffeaf689SAlexander Kabaev        *  throws out_of_range if the check fails.
736ffeaf689SAlexander Kabaev        */
73700db7afdSDavid E. O'Brien       const_reference
73800db7afdSDavid E. O'Brien       at(size_type __n) const
73900db7afdSDavid E. O'Brien       {
74000db7afdSDavid E. O'Brien 	if (__n >= this->size())
741ffeaf689SAlexander Kabaev 	  __throw_out_of_range(__N("basic_string::at"));
74200db7afdSDavid E. O'Brien 	return _M_data()[__n];
74300db7afdSDavid E. O'Brien       }
74400db7afdSDavid E. O'Brien 
745ffeaf689SAlexander Kabaev       /**
746ffeaf689SAlexander Kabaev        *  @brief  Provides access to the data contained in the %string.
747ffeaf689SAlexander Kabaev        *  @param n The index of the character to access.
748ffeaf689SAlexander Kabaev        *  @return  Read/write reference to the character.
749ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a n is an invalid index.
750ffeaf689SAlexander Kabaev        *
751ffeaf689SAlexander Kabaev        *  This function provides for safer data access.  The parameter is
752ffeaf689SAlexander Kabaev        *  first checked that it is in the range of the string.  The function
753ffeaf689SAlexander Kabaev        *  throws out_of_range if the check fails.  Success results in
754ffeaf689SAlexander Kabaev        *  unsharing the string.
755ffeaf689SAlexander Kabaev        */
75600db7afdSDavid E. O'Brien       reference
75700db7afdSDavid E. O'Brien       at(size_type __n)
75800db7afdSDavid E. O'Brien       {
75900db7afdSDavid E. O'Brien 	if (__n >= size())
760ffeaf689SAlexander Kabaev 	  __throw_out_of_range(__N("basic_string::at"));
76100db7afdSDavid E. O'Brien 	_M_leak();
76200db7afdSDavid E. O'Brien 	return _M_data()[__n];
76300db7afdSDavid E. O'Brien       }
76400db7afdSDavid E. O'Brien 
76500db7afdSDavid E. O'Brien       // Modifiers:
766ffeaf689SAlexander Kabaev       /**
767ffeaf689SAlexander Kabaev        *  @brief  Append a string to this string.
768ffeaf689SAlexander Kabaev        *  @param str  The string to append.
769ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
770ffeaf689SAlexander Kabaev        */
77100db7afdSDavid E. O'Brien       basic_string&
772f8a1b7d9SAlexander Kabaev       operator+=(const basic_string& __str)
773f8a1b7d9SAlexander Kabaev       { return this->append(__str); }
77400db7afdSDavid E. O'Brien 
775ffeaf689SAlexander Kabaev       /**
776ffeaf689SAlexander Kabaev        *  @brief  Append a C string.
777ffeaf689SAlexander Kabaev        *  @param s  The C string to append.
778ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
779ffeaf689SAlexander Kabaev        */
78000db7afdSDavid E. O'Brien       basic_string&
781f8a1b7d9SAlexander Kabaev       operator+=(const _CharT* __s)
782f8a1b7d9SAlexander Kabaev       { return this->append(__s); }
78300db7afdSDavid E. O'Brien 
784ffeaf689SAlexander Kabaev       /**
785ffeaf689SAlexander Kabaev        *  @brief  Append a character.
786f8a1b7d9SAlexander Kabaev        *  @param c  The character to append.
787ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
788ffeaf689SAlexander Kabaev        */
78900db7afdSDavid E. O'Brien       basic_string&
790f8a1b7d9SAlexander Kabaev       operator+=(_CharT __c)
791f8a1b7d9SAlexander Kabaev       {
792f8a1b7d9SAlexander Kabaev 	this->push_back(__c);
793f8a1b7d9SAlexander Kabaev 	return *this;
794f8a1b7d9SAlexander Kabaev       }
79500db7afdSDavid E. O'Brien 
796ffeaf689SAlexander Kabaev       /**
797ffeaf689SAlexander Kabaev        *  @brief  Append a string to this string.
798ffeaf689SAlexander Kabaev        *  @param str  The string to append.
799ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
800ffeaf689SAlexander Kabaev        */
80100db7afdSDavid E. O'Brien       basic_string&
80200db7afdSDavid E. O'Brien       append(const basic_string& __str);
80300db7afdSDavid E. O'Brien 
804ffeaf689SAlexander Kabaev       /**
805ffeaf689SAlexander Kabaev        *  @brief  Append a substring.
806ffeaf689SAlexander Kabaev        *  @param str  The string to append.
807ffeaf689SAlexander Kabaev        *  @param pos  Index of the first character of str to append.
808ffeaf689SAlexander Kabaev        *  @param n  The number of characters to append.
809ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
810ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range if @a pos is not a valid index.
811ffeaf689SAlexander Kabaev        *
812ffeaf689SAlexander Kabaev        *  This function appends @a n characters from @a str starting at @a pos
813ffeaf689SAlexander Kabaev        *  to this string.  If @a n is is larger than the number of available
814ffeaf689SAlexander Kabaev        *  characters in @a str, the remainder of @a str is appended.
815ffeaf689SAlexander Kabaev        */
81600db7afdSDavid E. O'Brien       basic_string&
81700db7afdSDavid E. O'Brien       append(const basic_string& __str, size_type __pos, size_type __n);
81800db7afdSDavid E. O'Brien 
819ffeaf689SAlexander Kabaev       /**
820ffeaf689SAlexander Kabaev        *  @brief  Append a C substring.
821ffeaf689SAlexander Kabaev        *  @param s  The C string to append.
822ffeaf689SAlexander Kabaev        *  @param n  The number of characters to append.
823ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
824ffeaf689SAlexander Kabaev        */
82500db7afdSDavid E. O'Brien       basic_string&
82600db7afdSDavid E. O'Brien       append(const _CharT* __s, size_type __n);
82700db7afdSDavid E. O'Brien 
828ffeaf689SAlexander Kabaev       /**
829ffeaf689SAlexander Kabaev        *  @brief  Append a C string.
830ffeaf689SAlexander Kabaev        *  @param s  The C string to append.
831ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
832ffeaf689SAlexander Kabaev        */
83300db7afdSDavid E. O'Brien       basic_string&
83400db7afdSDavid E. O'Brien       append(const _CharT* __s)
835ffeaf689SAlexander Kabaev       {
836ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
837ffeaf689SAlexander Kabaev 	return this->append(__s, traits_type::length(__s));
838ffeaf689SAlexander Kabaev       }
83900db7afdSDavid E. O'Brien 
840ffeaf689SAlexander Kabaev       /**
841ffeaf689SAlexander Kabaev        *  @brief  Append multiple characters.
842ffeaf689SAlexander Kabaev        *  @param n  The number of characters to append.
843ffeaf689SAlexander Kabaev        *  @param c  The character to use.
844ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
845ffeaf689SAlexander Kabaev        *
846ffeaf689SAlexander Kabaev        *  Appends n copies of c to this string.
847ffeaf689SAlexander Kabaev        */
84800db7afdSDavid E. O'Brien       basic_string&
849f8a1b7d9SAlexander Kabaev       append(size_type __n, _CharT __c);
85000db7afdSDavid E. O'Brien 
851ffeaf689SAlexander Kabaev       /**
852ffeaf689SAlexander Kabaev        *  @brief  Append a range of characters.
853ffeaf689SAlexander Kabaev        *  @param first  Iterator referencing the first character to append.
854ffeaf689SAlexander Kabaev        *  @param last  Iterator marking the end of the range.
855ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
856ffeaf689SAlexander Kabaev        *
857ffeaf689SAlexander Kabaev        *  Appends characters in the range [first,last) to this string.
858ffeaf689SAlexander Kabaev        */
85900db7afdSDavid E. O'Brien       template<class _InputIterator>
86000db7afdSDavid E. O'Brien         basic_string&
86100db7afdSDavid E. O'Brien         append(_InputIterator __first, _InputIterator __last)
86200db7afdSDavid E. O'Brien         { return this->replace(_M_iend(), _M_iend(), __first, __last); }
86300db7afdSDavid E. O'Brien 
864ffeaf689SAlexander Kabaev       /**
865ffeaf689SAlexander Kabaev        *  @brief  Append a single character.
866ffeaf689SAlexander Kabaev        *  @param c  Character to append.
867ffeaf689SAlexander Kabaev        */
86800db7afdSDavid E. O'Brien       void
86900db7afdSDavid E. O'Brien       push_back(_CharT __c)
870f8a1b7d9SAlexander Kabaev       {
871f8a1b7d9SAlexander Kabaev 	const size_type __len = 1 + this->size();
872f8a1b7d9SAlexander Kabaev 	if (__len > this->capacity() || _M_rep()->_M_is_shared())
873f8a1b7d9SAlexander Kabaev 	  this->reserve(__len);
874f8a1b7d9SAlexander Kabaev 	traits_type::assign(_M_data()[this->size()], __c);
875f8a1b7d9SAlexander Kabaev 	_M_rep()->_M_set_length_and_sharable(__len);
876f8a1b7d9SAlexander Kabaev       }
87700db7afdSDavid E. O'Brien 
878ffeaf689SAlexander Kabaev       /**
879ffeaf689SAlexander Kabaev        *  @brief  Set value to contents of another string.
880ffeaf689SAlexander Kabaev        *  @param  str  Source string to use.
881ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
882ffeaf689SAlexander Kabaev        */
88300db7afdSDavid E. O'Brien       basic_string&
88400db7afdSDavid E. O'Brien       assign(const basic_string& __str);
88500db7afdSDavid E. O'Brien 
886ffeaf689SAlexander Kabaev       /**
887ffeaf689SAlexander Kabaev        *  @brief  Set value to a substring of a string.
888ffeaf689SAlexander Kabaev        *  @param str  The string to use.
889ffeaf689SAlexander Kabaev        *  @param pos  Index of the first character of str.
890ffeaf689SAlexander Kabaev        *  @param n  Number of characters to use.
891ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
892ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range if @a pos is not a valid index.
893ffeaf689SAlexander Kabaev        *
894ffeaf689SAlexander Kabaev        *  This function sets this string to the substring of @a str consisting
895ffeaf689SAlexander Kabaev        *  of @a n characters at @a pos.  If @a n is is larger than the number
896ffeaf689SAlexander Kabaev        *  of available characters in @a str, the remainder of @a str is used.
897ffeaf689SAlexander Kabaev        */
89800db7afdSDavid E. O'Brien       basic_string&
899ffeaf689SAlexander Kabaev       assign(const basic_string& __str, size_type __pos, size_type __n)
900ffeaf689SAlexander Kabaev       { return this->assign(__str._M_data()
901ffeaf689SAlexander Kabaev 			    + __str._M_check(__pos, "basic_string::assign"),
902ffeaf689SAlexander Kabaev 			    __str._M_limit(__pos, __n)); }
90300db7afdSDavid E. O'Brien 
904ffeaf689SAlexander Kabaev       /**
905ffeaf689SAlexander Kabaev        *  @brief  Set value to a C substring.
906ffeaf689SAlexander Kabaev        *  @param s  The C string to use.
907ffeaf689SAlexander Kabaev        *  @param n  Number of characters to use.
908ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
909ffeaf689SAlexander Kabaev        *
910ffeaf689SAlexander Kabaev        *  This function sets the value of this string to the first @a n
911ffeaf689SAlexander Kabaev        *  characters of @a s.  If @a n is is larger than the number of
912ffeaf689SAlexander Kabaev        *  available characters in @a s, the remainder of @a s is used.
913ffeaf689SAlexander Kabaev        */
91400db7afdSDavid E. O'Brien       basic_string&
9151b86b14eSAlexander Kabaev       assign(const _CharT* __s, size_type __n);
91600db7afdSDavid E. O'Brien 
917ffeaf689SAlexander Kabaev       /**
918ffeaf689SAlexander Kabaev        *  @brief  Set value to contents of a C string.
919ffeaf689SAlexander Kabaev        *  @param s  The C string to use.
920ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
921ffeaf689SAlexander Kabaev        *
922ffeaf689SAlexander Kabaev        *  This function sets the value of this string to the value of @a s.
923ffeaf689SAlexander Kabaev        *  The data is copied, so there is no dependence on @a s once the
924ffeaf689SAlexander Kabaev        *  function returns.
925ffeaf689SAlexander Kabaev        */
92600db7afdSDavid E. O'Brien       basic_string&
92700db7afdSDavid E. O'Brien       assign(const _CharT* __s)
928ffeaf689SAlexander Kabaev       {
929ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
930ffeaf689SAlexander Kabaev 	return this->assign(__s, traits_type::length(__s));
931ffeaf689SAlexander Kabaev       }
93200db7afdSDavid E. O'Brien 
933ffeaf689SAlexander Kabaev       /**
934ffeaf689SAlexander Kabaev        *  @brief  Set value to multiple characters.
935ffeaf689SAlexander Kabaev        *  @param n  Length of the resulting string.
936ffeaf689SAlexander Kabaev        *  @param c  The character to use.
937ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
938ffeaf689SAlexander Kabaev        *
939ffeaf689SAlexander Kabaev        *  This function sets the value of this string to @a n copies of
940ffeaf689SAlexander Kabaev        *  character @a c.
941ffeaf689SAlexander Kabaev        */
94200db7afdSDavid E. O'Brien       basic_string&
94300db7afdSDavid E. O'Brien       assign(size_type __n, _CharT __c)
944ffeaf689SAlexander Kabaev       { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
94500db7afdSDavid E. O'Brien 
946ffeaf689SAlexander Kabaev       /**
947ffeaf689SAlexander Kabaev        *  @brief  Set value to a range of characters.
948ffeaf689SAlexander Kabaev        *  @param first  Iterator referencing the first character to append.
949ffeaf689SAlexander Kabaev        *  @param last  Iterator marking the end of the range.
950ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
951ffeaf689SAlexander Kabaev        *
952ffeaf689SAlexander Kabaev        *  Sets value of string to characters in the range [first,last).
953ffeaf689SAlexander Kabaev       */
95400db7afdSDavid E. O'Brien       template<class _InputIterator>
95500db7afdSDavid E. O'Brien         basic_string&
95600db7afdSDavid E. O'Brien         assign(_InputIterator __first, _InputIterator __last)
95700db7afdSDavid E. O'Brien         { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
95800db7afdSDavid E. O'Brien 
959ffeaf689SAlexander Kabaev       /**
960ffeaf689SAlexander Kabaev        *  @brief  Insert multiple characters.
961ffeaf689SAlexander Kabaev        *  @param p  Iterator referencing location in string to insert at.
962ffeaf689SAlexander Kabaev        *  @param n  Number of characters to insert
963ffeaf689SAlexander Kabaev        *  @param c  The character to insert.
964ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
965ffeaf689SAlexander Kabaev        *
966ffeaf689SAlexander Kabaev        *  Inserts @a n copies of character @a c starting at the position
967ffeaf689SAlexander Kabaev        *  referenced by iterator @a p.  If adding characters causes the length
968ffeaf689SAlexander Kabaev        *  to exceed max_size(), length_error is thrown.  The value of the
969ffeaf689SAlexander Kabaev        *  string doesn't change if an error is thrown.
970ffeaf689SAlexander Kabaev       */
97100db7afdSDavid E. O'Brien       void
97200db7afdSDavid E. O'Brien       insert(iterator __p, size_type __n, _CharT __c)
97300db7afdSDavid E. O'Brien       {	this->replace(__p, __p, __n, __c);  }
97400db7afdSDavid E. O'Brien 
975ffeaf689SAlexander Kabaev       /**
976ffeaf689SAlexander Kabaev        *  @brief  Insert a range of characters.
977ffeaf689SAlexander Kabaev        *  @param p  Iterator referencing location in string to insert at.
978ffeaf689SAlexander Kabaev        *  @param beg  Start of range.
979ffeaf689SAlexander Kabaev        *  @param end  End of range.
980ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
981ffeaf689SAlexander Kabaev        *
982ffeaf689SAlexander Kabaev        *  Inserts characters in range [beg,end).  If adding characters causes
983ffeaf689SAlexander Kabaev        *  the length to exceed max_size(), length_error is thrown.  The value
984ffeaf689SAlexander Kabaev        *  of the string doesn't change if an error is thrown.
985ffeaf689SAlexander Kabaev       */
98600db7afdSDavid E. O'Brien       template<class _InputIterator>
987f8a1b7d9SAlexander Kabaev         void
988f8a1b7d9SAlexander Kabaev         insert(iterator __p, _InputIterator __beg, _InputIterator __end)
98900db7afdSDavid E. O'Brien         { this->replace(__p, __p, __beg, __end); }
99000db7afdSDavid E. O'Brien 
991ffeaf689SAlexander Kabaev       /**
992ffeaf689SAlexander Kabaev        *  @brief  Insert value of a string.
993ffeaf689SAlexander Kabaev        *  @param pos1  Iterator referencing location in string to insert at.
994ffeaf689SAlexander Kabaev        *  @param str  The string to insert.
995ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
996ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
997ffeaf689SAlexander Kabaev        *
998ffeaf689SAlexander Kabaev        *  Inserts value of @a str starting at @a pos1.  If adding characters
999ffeaf689SAlexander Kabaev        *  causes the length to exceed max_size(), length_error is thrown.  The
1000ffeaf689SAlexander Kabaev        *  value of the string doesn't change if an error is thrown.
1001ffeaf689SAlexander Kabaev       */
100200db7afdSDavid E. O'Brien       basic_string&
100300db7afdSDavid E. O'Brien       insert(size_type __pos1, const basic_string& __str)
1004ffeaf689SAlexander Kabaev       { return this->insert(__pos1, __str, size_type(0), __str.size()); }
100500db7afdSDavid E. O'Brien 
1006ffeaf689SAlexander Kabaev       /**
1007ffeaf689SAlexander Kabaev        *  @brief  Insert a substring.
1008ffeaf689SAlexander Kabaev        *  @param pos1  Iterator referencing location in string to insert at.
1009ffeaf689SAlexander Kabaev        *  @param str  The string to insert.
1010ffeaf689SAlexander Kabaev        *  @param pos2  Start of characters in str to insert.
1011ffeaf689SAlexander Kabaev        *  @param n  Number of characters to insert.
1012ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1013ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1014ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos1 > size() or
1015ffeaf689SAlexander Kabaev        *  @a pos2 > @a str.size().
1016ffeaf689SAlexander Kabaev        *
1017ffeaf689SAlexander Kabaev        *  Starting at @a pos1, insert @a n character of @a str beginning with
1018ffeaf689SAlexander Kabaev        *  @a pos2.  If adding characters causes the length to exceed
1019ffeaf689SAlexander Kabaev        *  max_size(), length_error is thrown.  If @a pos1 is beyond the end of
1020ffeaf689SAlexander Kabaev        *  this string or @a pos2 is beyond the end of @a str, out_of_range is
1021ffeaf689SAlexander Kabaev        *  thrown.  The value of the string doesn't change if an error is
1022ffeaf689SAlexander Kabaev        *  thrown.
1023ffeaf689SAlexander Kabaev       */
102400db7afdSDavid E. O'Brien       basic_string&
102500db7afdSDavid E. O'Brien       insert(size_type __pos1, const basic_string& __str,
1026ffeaf689SAlexander Kabaev 	     size_type __pos2, size_type __n)
1027ffeaf689SAlexander Kabaev       { return this->insert(__pos1, __str._M_data()
1028ffeaf689SAlexander Kabaev 			    + __str._M_check(__pos2, "basic_string::insert"),
1029ffeaf689SAlexander Kabaev 			    __str._M_limit(__pos2, __n)); }
103000db7afdSDavid E. O'Brien 
1031ffeaf689SAlexander Kabaev       /**
1032ffeaf689SAlexander Kabaev        *  @brief  Insert a C substring.
1033ffeaf689SAlexander Kabaev        *  @param pos  Iterator referencing location in string to insert at.
1034ffeaf689SAlexander Kabaev        *  @param s  The C string to insert.
1035ffeaf689SAlexander Kabaev        *  @param n  The number of characters to insert.
1036ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1037ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1038ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos is beyond the end of this
1039ffeaf689SAlexander Kabaev        *  string.
1040ffeaf689SAlexander Kabaev        *
1041ffeaf689SAlexander Kabaev        *  Inserts the first @a n characters of @a s starting at @a pos.  If
1042ffeaf689SAlexander Kabaev        *  adding characters causes the length to exceed max_size(),
1043ffeaf689SAlexander Kabaev        *  length_error is thrown.  If @a pos is beyond end(), out_of_range is
1044ffeaf689SAlexander Kabaev        *  thrown.  The value of the string doesn't change if an error is
1045ffeaf689SAlexander Kabaev        *  thrown.
1046ffeaf689SAlexander Kabaev       */
104700db7afdSDavid E. O'Brien       basic_string&
10481b86b14eSAlexander Kabaev       insert(size_type __pos, const _CharT* __s, size_type __n);
104900db7afdSDavid E. O'Brien 
1050ffeaf689SAlexander Kabaev       /**
1051ffeaf689SAlexander Kabaev        *  @brief  Insert a C string.
1052ffeaf689SAlexander Kabaev        *  @param pos  Iterator referencing location in string to insert at.
1053ffeaf689SAlexander Kabaev        *  @param s  The C string to insert.
1054ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1055ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1056ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos is beyond the end of this
1057ffeaf689SAlexander Kabaev        *  string.
1058ffeaf689SAlexander Kabaev        *
1059ffeaf689SAlexander Kabaev        *  Inserts the first @a n characters of @a s starting at @a pos.  If
1060ffeaf689SAlexander Kabaev        *  adding characters causes the length to exceed max_size(),
1061ffeaf689SAlexander Kabaev        *  length_error is thrown.  If @a pos is beyond end(), out_of_range is
1062ffeaf689SAlexander Kabaev        *  thrown.  The value of the string doesn't change if an error is
1063ffeaf689SAlexander Kabaev        *  thrown.
1064ffeaf689SAlexander Kabaev       */
106500db7afdSDavid E. O'Brien       basic_string&
106600db7afdSDavid E. O'Brien       insert(size_type __pos, const _CharT* __s)
106700db7afdSDavid E. O'Brien       {
1068ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
1069ffeaf689SAlexander Kabaev 	return this->insert(__pos, __s, traits_type::length(__s));
107000db7afdSDavid E. O'Brien       }
107100db7afdSDavid E. O'Brien 
1072ffeaf689SAlexander Kabaev       /**
1073ffeaf689SAlexander Kabaev        *  @brief  Insert multiple characters.
1074ffeaf689SAlexander Kabaev        *  @param pos  Index in string to insert at.
1075ffeaf689SAlexander Kabaev        *  @param n  Number of characters to insert
1076ffeaf689SAlexander Kabaev        *  @param c  The character to insert.
1077ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1078ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1079ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos is beyond the end of this
1080ffeaf689SAlexander Kabaev        *  string.
1081ffeaf689SAlexander Kabaev        *
1082ffeaf689SAlexander Kabaev        *  Inserts @a n copies of character @a c starting at index @a pos.  If
1083ffeaf689SAlexander Kabaev        *  adding characters causes the length to exceed max_size(),
1084ffeaf689SAlexander Kabaev        *  length_error is thrown.  If @a pos > length(), out_of_range is
1085ffeaf689SAlexander Kabaev        *  thrown.  The value of the string doesn't change if an error is
1086ffeaf689SAlexander Kabaev        *  thrown.
1087ffeaf689SAlexander Kabaev       */
1088ffeaf689SAlexander Kabaev       basic_string&
1089ffeaf689SAlexander Kabaev       insert(size_type __pos, size_type __n, _CharT __c)
1090ffeaf689SAlexander Kabaev       { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
1091ffeaf689SAlexander Kabaev 			      size_type(0), __n, __c); }
1092ffeaf689SAlexander Kabaev 
1093ffeaf689SAlexander Kabaev       /**
1094ffeaf689SAlexander Kabaev        *  @brief  Insert one character.
1095ffeaf689SAlexander Kabaev        *  @param p  Iterator referencing position in string to insert at.
1096ffeaf689SAlexander Kabaev        *  @param c  The character to insert.
1097ffeaf689SAlexander Kabaev        *  @return  Iterator referencing newly inserted char.
1098ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1099ffeaf689SAlexander Kabaev        *
1100ffeaf689SAlexander Kabaev        *  Inserts character @a c at position referenced by @a p.  If adding
1101ffeaf689SAlexander Kabaev        *  character causes the length to exceed max_size(), length_error is
1102ffeaf689SAlexander Kabaev        *  thrown.  If @a p is beyond end of string, out_of_range is thrown.
1103ffeaf689SAlexander Kabaev        *  The value of the string doesn't change if an error is thrown.
1104ffeaf689SAlexander Kabaev       */
110500db7afdSDavid E. O'Brien       iterator
1106ffeaf689SAlexander Kabaev       insert(iterator __p, _CharT __c)
110700db7afdSDavid E. O'Brien       {
1108ffeaf689SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
1109ffeaf689SAlexander Kabaev 	const size_type __pos = __p - _M_ibegin();
1110ffeaf689SAlexander Kabaev 	_M_replace_aux(__pos, size_type(0), size_type(1), __c);
111100db7afdSDavid E. O'Brien 	_M_rep()->_M_set_leaked();
1112f8a1b7d9SAlexander Kabaev 	return iterator(_M_data() + __pos);
111300db7afdSDavid E. O'Brien       }
111400db7afdSDavid E. O'Brien 
1115ffeaf689SAlexander Kabaev       /**
1116ffeaf689SAlexander Kabaev        *  @brief  Remove characters.
1117ffeaf689SAlexander Kabaev        *  @param pos  Index of first character to remove (default 0).
1118ffeaf689SAlexander Kabaev        *  @param n  Number of characters to remove (default remainder).
1119ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1120ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos is beyond the end of this
1121ffeaf689SAlexander Kabaev        *  string.
1122ffeaf689SAlexander Kabaev        *
1123ffeaf689SAlexander Kabaev        *  Removes @a n characters from this string starting at @a pos.  The
1124ffeaf689SAlexander Kabaev        *  length of the string is reduced by @a n.  If there are < @a n
1125ffeaf689SAlexander Kabaev        *  characters to remove, the remainder of the string is truncated.  If
1126ffeaf689SAlexander Kabaev        *  @a p is beyond end of string, out_of_range is thrown.  The value of
1127ffeaf689SAlexander Kabaev        *  the string doesn't change if an error is thrown.
1128ffeaf689SAlexander Kabaev       */
112900db7afdSDavid E. O'Brien       basic_string&
113000db7afdSDavid E. O'Brien       erase(size_type __pos = 0, size_type __n = npos)
1131f8a1b7d9SAlexander Kabaev       {
1132f8a1b7d9SAlexander Kabaev 	_M_mutate(_M_check(__pos, "basic_string::erase"),
1133f8a1b7d9SAlexander Kabaev 		  _M_limit(__pos, __n), size_type(0));
1134f8a1b7d9SAlexander Kabaev 	return *this;
1135f8a1b7d9SAlexander Kabaev       }
113600db7afdSDavid E. O'Brien 
1137ffeaf689SAlexander Kabaev       /**
1138ffeaf689SAlexander Kabaev        *  @brief  Remove one character.
1139ffeaf689SAlexander Kabaev        *  @param position  Iterator referencing the character to remove.
1140ffeaf689SAlexander Kabaev        *  @return  iterator referencing same location after removal.
1141ffeaf689SAlexander Kabaev        *
1142ffeaf689SAlexander Kabaev        *  Removes the character at @a position from this string. The value
1143ffeaf689SAlexander Kabaev        *  of the string doesn't change if an error is thrown.
1144ffeaf689SAlexander Kabaev       */
114500db7afdSDavid E. O'Brien       iterator
114600db7afdSDavid E. O'Brien       erase(iterator __position)
114700db7afdSDavid E. O'Brien       {
1148ffeaf689SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
1149ffeaf689SAlexander Kabaev 				 && __position < _M_iend());
1150ffeaf689SAlexander Kabaev 	const size_type __pos = __position - _M_ibegin();
1151f8a1b7d9SAlexander Kabaev 	_M_mutate(__pos, size_type(1), size_type(0));
115200db7afdSDavid E. O'Brien 	_M_rep()->_M_set_leaked();
1153f8a1b7d9SAlexander Kabaev 	return iterator(_M_data() + __pos);
115400db7afdSDavid E. O'Brien       }
115500db7afdSDavid E. O'Brien 
1156ffeaf689SAlexander Kabaev       /**
1157ffeaf689SAlexander Kabaev        *  @brief  Remove a range of characters.
1158ffeaf689SAlexander Kabaev        *  @param first  Iterator referencing the first character to remove.
1159ffeaf689SAlexander Kabaev        *  @param last  Iterator referencing the end of the range.
1160ffeaf689SAlexander Kabaev        *  @return  Iterator referencing location of first after removal.
1161ffeaf689SAlexander Kabaev        *
1162ffeaf689SAlexander Kabaev        *  Removes the characters in the range [first,last) from this string.
1163ffeaf689SAlexander Kabaev        *  The value of the string doesn't change if an error is thrown.
1164ffeaf689SAlexander Kabaev       */
116500db7afdSDavid E. O'Brien       iterator
116600db7afdSDavid E. O'Brien       erase(iterator __first, iterator __last)
116700db7afdSDavid E. O'Brien       {
1168ffeaf689SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last
1169ffeaf689SAlexander Kabaev 				 && __last <= _M_iend());
1170ffeaf689SAlexander Kabaev         const size_type __pos = __first - _M_ibegin();
1171f8a1b7d9SAlexander Kabaev 	_M_mutate(__pos, __last - __first, size_type(0));
117200db7afdSDavid E. O'Brien 	_M_rep()->_M_set_leaked();
1173f8a1b7d9SAlexander Kabaev 	return iterator(_M_data() + __pos);
117400db7afdSDavid E. O'Brien       }
117500db7afdSDavid E. O'Brien 
1176ffeaf689SAlexander Kabaev       /**
1177ffeaf689SAlexander Kabaev        *  @brief  Replace characters with value from another string.
1178ffeaf689SAlexander Kabaev        *  @param pos  Index of first character to replace.
1179ffeaf689SAlexander Kabaev        *  @param n  Number of characters to be replaced.
1180ffeaf689SAlexander Kabaev        *  @param str  String to insert.
1181ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1182ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos is beyond the end of this
1183ffeaf689SAlexander Kabaev        *  string.
1184ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1185ffeaf689SAlexander Kabaev        *
1186ffeaf689SAlexander Kabaev        *  Removes the characters in the range [pos,pos+n) from this string.
1187ffeaf689SAlexander Kabaev        *  In place, the value of @a str is inserted.  If @a pos is beyond end
1188ffeaf689SAlexander Kabaev        *  of string, out_of_range is thrown.  If the length of the result
1189ffeaf689SAlexander Kabaev        *  exceeds max_size(), length_error is thrown.  The value of the string
1190ffeaf689SAlexander Kabaev        *  doesn't change if an error is thrown.
1191ffeaf689SAlexander Kabaev       */
119200db7afdSDavid E. O'Brien       basic_string&
119300db7afdSDavid E. O'Brien       replace(size_type __pos, size_type __n, const basic_string& __str)
119400db7afdSDavid E. O'Brien       { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
119500db7afdSDavid E. O'Brien 
1196ffeaf689SAlexander Kabaev       /**
1197ffeaf689SAlexander Kabaev        *  @brief  Replace characters with value from another string.
1198ffeaf689SAlexander Kabaev        *  @param pos1  Index of first character to replace.
1199ffeaf689SAlexander Kabaev        *  @param n1  Number of characters to be replaced.
1200ffeaf689SAlexander Kabaev        *  @param str  String to insert.
1201ffeaf689SAlexander Kabaev        *  @param pos2  Index of first character of str to use.
1202ffeaf689SAlexander Kabaev        *  @param n2  Number of characters from str to use.
1203ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1204ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos1 > size() or @a pos2 >
1205ffeaf689SAlexander Kabaev        *  str.size().
1206ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1207ffeaf689SAlexander Kabaev        *
1208ffeaf689SAlexander Kabaev        *  Removes the characters in the range [pos1,pos1 + n) from this
1209ffeaf689SAlexander Kabaev        *  string.  In place, the value of @a str is inserted.  If @a pos is
1210ffeaf689SAlexander Kabaev        *  beyond end of string, out_of_range is thrown.  If the length of the
1211ffeaf689SAlexander Kabaev        *  result exceeds max_size(), length_error is thrown.  The value of the
1212ffeaf689SAlexander Kabaev        *  string doesn't change if an error is thrown.
1213ffeaf689SAlexander Kabaev       */
121400db7afdSDavid E. O'Brien       basic_string&
121500db7afdSDavid E. O'Brien       replace(size_type __pos1, size_type __n1, const basic_string& __str,
1216ffeaf689SAlexander Kabaev 	      size_type __pos2, size_type __n2)
1217ffeaf689SAlexander Kabaev       { return this->replace(__pos1, __n1, __str._M_data()
1218ffeaf689SAlexander Kabaev 			     + __str._M_check(__pos2, "basic_string::replace"),
1219ffeaf689SAlexander Kabaev 			     __str._M_limit(__pos2, __n2)); }
122000db7afdSDavid E. O'Brien 
1221ffeaf689SAlexander Kabaev       /**
1222ffeaf689SAlexander Kabaev        *  @brief  Replace characters with value of a C substring.
1223ffeaf689SAlexander Kabaev        *  @param pos  Index of first character to replace.
1224ffeaf689SAlexander Kabaev        *  @param n1  Number of characters to be replaced.
1225f8a1b7d9SAlexander Kabaev        *  @param s  C string to insert.
1226f8a1b7d9SAlexander Kabaev        *  @param n2  Number of characters from @a s to use.
1227ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1228ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos1 > size().
1229ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1230ffeaf689SAlexander Kabaev        *
1231ffeaf689SAlexander Kabaev        *  Removes the characters in the range [pos,pos + n1) from this string.
1232f8a1b7d9SAlexander Kabaev        *  In place, the first @a n2 characters of @a s are inserted, or all
1233f8a1b7d9SAlexander Kabaev        *  of @a s if @a n2 is too large.  If @a pos is beyond end of string,
1234ffeaf689SAlexander Kabaev        *  out_of_range is thrown.  If the length of result exceeds max_size(),
1235ffeaf689SAlexander Kabaev        *  length_error is thrown.  The value of the string doesn't change if
1236ffeaf689SAlexander Kabaev        *  an error is thrown.
1237ffeaf689SAlexander Kabaev       */
123800db7afdSDavid E. O'Brien       basic_string&
123900db7afdSDavid E. O'Brien       replace(size_type __pos, size_type __n1, const _CharT* __s,
12401b86b14eSAlexander Kabaev 	      size_type __n2);
124100db7afdSDavid E. O'Brien 
1242ffeaf689SAlexander Kabaev       /**
1243ffeaf689SAlexander Kabaev        *  @brief  Replace characters with value of a C string.
1244ffeaf689SAlexander Kabaev        *  @param pos  Index of first character to replace.
1245ffeaf689SAlexander Kabaev        *  @param n1  Number of characters to be replaced.
1246f8a1b7d9SAlexander Kabaev        *  @param s  C string to insert.
1247ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1248ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos > size().
1249ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1250ffeaf689SAlexander Kabaev        *
1251ffeaf689SAlexander Kabaev        *  Removes the characters in the range [pos,pos + n1) from this string.
1252f8a1b7d9SAlexander Kabaev        *  In place, the first @a n characters of @a s are inserted.  If @a
1253ffeaf689SAlexander Kabaev        *  pos is beyond end of string, out_of_range is thrown.  If the length
1254ffeaf689SAlexander Kabaev        *  of result exceeds max_size(), length_error is thrown.  The value of
1255ffeaf689SAlexander Kabaev        *  the string doesn't change if an error is thrown.
1256ffeaf689SAlexander Kabaev       */
125700db7afdSDavid E. O'Brien       basic_string&
125800db7afdSDavid E. O'Brien       replace(size_type __pos, size_type __n1, const _CharT* __s)
1259ffeaf689SAlexander Kabaev       {
1260ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
1261ffeaf689SAlexander Kabaev 	return this->replace(__pos, __n1, __s, traits_type::length(__s));
1262ffeaf689SAlexander Kabaev       }
126300db7afdSDavid E. O'Brien 
1264ffeaf689SAlexander Kabaev       /**
1265ffeaf689SAlexander Kabaev        *  @brief  Replace characters with multiple characters.
1266ffeaf689SAlexander Kabaev        *  @param pos  Index of first character to replace.
1267ffeaf689SAlexander Kabaev        *  @param n1  Number of characters to be replaced.
1268ffeaf689SAlexander Kabaev        *  @param n2  Number of characters to insert.
1269ffeaf689SAlexander Kabaev        *  @param c  Character to insert.
1270ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1271ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos > size().
1272ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1273ffeaf689SAlexander Kabaev        *
1274ffeaf689SAlexander Kabaev        *  Removes the characters in the range [pos,pos + n1) from this string.
1275ffeaf689SAlexander Kabaev        *  In place, @a n2 copies of @a c are inserted.  If @a pos is beyond
1276ffeaf689SAlexander Kabaev        *  end of string, out_of_range is thrown.  If the length of result
1277ffeaf689SAlexander Kabaev        *  exceeds max_size(), length_error is thrown.  The value of the string
1278ffeaf689SAlexander Kabaev        *  doesn't change if an error is thrown.
1279ffeaf689SAlexander Kabaev       */
128000db7afdSDavid E. O'Brien       basic_string&
128100db7afdSDavid E. O'Brien       replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
1282ffeaf689SAlexander Kabaev       { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
1283ffeaf689SAlexander Kabaev 			      _M_limit(__pos, __n1), __n2, __c); }
128400db7afdSDavid E. O'Brien 
1285ffeaf689SAlexander Kabaev       /**
1286ffeaf689SAlexander Kabaev        *  @brief  Replace range of characters with string.
1287ffeaf689SAlexander Kabaev        *  @param i1  Iterator referencing start of range to replace.
1288ffeaf689SAlexander Kabaev        *  @param i2  Iterator referencing end of range to replace.
1289ffeaf689SAlexander Kabaev        *  @param str  String value to insert.
1290ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1291ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1292ffeaf689SAlexander Kabaev        *
1293ffeaf689SAlexander Kabaev        *  Removes the characters in the range [i1,i2).  In place, the value of
1294ffeaf689SAlexander Kabaev        *  @a str is inserted.  If the length of result exceeds max_size(),
1295ffeaf689SAlexander Kabaev        *  length_error is thrown.  The value of the string doesn't change if
1296ffeaf689SAlexander Kabaev        *  an error is thrown.
1297ffeaf689SAlexander Kabaev       */
129800db7afdSDavid E. O'Brien       basic_string&
129900db7afdSDavid E. O'Brien       replace(iterator __i1, iterator __i2, const basic_string& __str)
130000db7afdSDavid E. O'Brien       { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
130100db7afdSDavid E. O'Brien 
1302ffeaf689SAlexander Kabaev       /**
1303ffeaf689SAlexander Kabaev        *  @brief  Replace range of characters with C substring.
1304ffeaf689SAlexander Kabaev        *  @param i1  Iterator referencing start of range to replace.
1305ffeaf689SAlexander Kabaev        *  @param i2  Iterator referencing end of range to replace.
1306ffeaf689SAlexander Kabaev        *  @param s  C string value to insert.
1307ffeaf689SAlexander Kabaev        *  @param n  Number of characters from s to insert.
1308ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1309ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1310ffeaf689SAlexander Kabaev        *
1311ffeaf689SAlexander Kabaev        *  Removes the characters in the range [i1,i2).  In place, the first @a
1312ffeaf689SAlexander Kabaev        *  n characters of @a s are inserted.  If the length of result exceeds
1313ffeaf689SAlexander Kabaev        *  max_size(), length_error is thrown.  The value of the string doesn't
1314ffeaf689SAlexander Kabaev        *  change if an error is thrown.
1315ffeaf689SAlexander Kabaev       */
131600db7afdSDavid E. O'Brien       basic_string&
1317ffeaf689SAlexander Kabaev       replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
1318ffeaf689SAlexander Kabaev       {
1319ffeaf689SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1320ffeaf689SAlexander Kabaev 				 && __i2 <= _M_iend());
1321ffeaf689SAlexander Kabaev 	return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
1322ffeaf689SAlexander Kabaev       }
132300db7afdSDavid E. O'Brien 
1324ffeaf689SAlexander Kabaev       /**
1325ffeaf689SAlexander Kabaev        *  @brief  Replace range of characters with C string.
1326ffeaf689SAlexander Kabaev        *  @param i1  Iterator referencing start of range to replace.
1327ffeaf689SAlexander Kabaev        *  @param i2  Iterator referencing end of range to replace.
1328ffeaf689SAlexander Kabaev        *  @param s  C string value to insert.
1329ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1330ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1331ffeaf689SAlexander Kabaev        *
1332ffeaf689SAlexander Kabaev        *  Removes the characters in the range [i1,i2).  In place, the
1333ffeaf689SAlexander Kabaev        *  characters of @a s are inserted.  If the length of result exceeds
1334ffeaf689SAlexander Kabaev        *  max_size(), length_error is thrown.  The value of the string doesn't
1335ffeaf689SAlexander Kabaev        *  change if an error is thrown.
1336ffeaf689SAlexander Kabaev       */
133700db7afdSDavid E. O'Brien       basic_string&
133800db7afdSDavid E. O'Brien       replace(iterator __i1, iterator __i2, const _CharT* __s)
1339ffeaf689SAlexander Kabaev       {
1340ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
1341ffeaf689SAlexander Kabaev 	return this->replace(__i1, __i2, __s, traits_type::length(__s));
1342ffeaf689SAlexander Kabaev       }
134300db7afdSDavid E. O'Brien 
1344ffeaf689SAlexander Kabaev       /**
1345ffeaf689SAlexander Kabaev        *  @brief  Replace range of characters with multiple characters
1346ffeaf689SAlexander Kabaev        *  @param i1  Iterator referencing start of range to replace.
1347ffeaf689SAlexander Kabaev        *  @param i2  Iterator referencing end of range to replace.
1348ffeaf689SAlexander Kabaev        *  @param n  Number of characters to insert.
1349ffeaf689SAlexander Kabaev        *  @param c  Character to insert.
1350ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1351ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1352ffeaf689SAlexander Kabaev        *
1353ffeaf689SAlexander Kabaev        *  Removes the characters in the range [i1,i2).  In place, @a n copies
1354ffeaf689SAlexander Kabaev        *  of @a c are inserted.  If the length of result exceeds max_size(),
1355ffeaf689SAlexander Kabaev        *  length_error is thrown.  The value of the string doesn't change if
1356ffeaf689SAlexander Kabaev        *  an error is thrown.
1357ffeaf689SAlexander Kabaev       */
135800db7afdSDavid E. O'Brien       basic_string&
1359ffeaf689SAlexander Kabaev       replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
1360ffeaf689SAlexander Kabaev       {
1361ffeaf689SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1362ffeaf689SAlexander Kabaev 				 && __i2 <= _M_iend());
1363ffeaf689SAlexander Kabaev 	return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
1364ffeaf689SAlexander Kabaev       }
136500db7afdSDavid E. O'Brien 
1366ffeaf689SAlexander Kabaev       /**
1367ffeaf689SAlexander Kabaev        *  @brief  Replace range of characters with range.
1368ffeaf689SAlexander Kabaev        *  @param i1  Iterator referencing start of range to replace.
1369ffeaf689SAlexander Kabaev        *  @param i2  Iterator referencing end of range to replace.
1370ffeaf689SAlexander Kabaev        *  @param k1  Iterator referencing start of range to insert.
1371ffeaf689SAlexander Kabaev        *  @param k2  Iterator referencing end of range to insert.
1372ffeaf689SAlexander Kabaev        *  @return  Reference to this string.
1373ffeaf689SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1374ffeaf689SAlexander Kabaev        *
1375ffeaf689SAlexander Kabaev        *  Removes the characters in the range [i1,i2).  In place, characters
1376ffeaf689SAlexander Kabaev        *  in the range [k1,k2) are inserted.  If the length of result exceeds
1377ffeaf689SAlexander Kabaev        *  max_size(), length_error is thrown.  The value of the string doesn't
1378ffeaf689SAlexander Kabaev        *  change if an error is thrown.
1379ffeaf689SAlexander Kabaev       */
138000db7afdSDavid E. O'Brien       template<class _InputIterator>
138100db7afdSDavid E. O'Brien         basic_string&
138200db7afdSDavid E. O'Brien         replace(iterator __i1, iterator __i2,
138300db7afdSDavid E. O'Brien 		_InputIterator __k1, _InputIterator __k2)
1384ffeaf689SAlexander Kabaev         {
1385ffeaf689SAlexander Kabaev 	  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1386ffeaf689SAlexander Kabaev 				   && __i2 <= _M_iend());
1387ffeaf689SAlexander Kabaev 	  __glibcxx_requires_valid_range(__k1, __k2);
1388f8a1b7d9SAlexander Kabaev 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1389ffeaf689SAlexander Kabaev 	  return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
1390ffeaf689SAlexander Kabaev 	}
139100db7afdSDavid E. O'Brien 
1392ca6500fcSAlexander Kabaev       // Specializations for the common case of pointer and iterator:
1393ca6500fcSAlexander Kabaev       // useful to avoid the overhead of temporary buffering in _M_replace.
1394ca6500fcSAlexander Kabaev       basic_string&
1395ca6500fcSAlexander Kabaev       replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
1396ffeaf689SAlexander Kabaev       {
1397ffeaf689SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1398ffeaf689SAlexander Kabaev 				 && __i2 <= _M_iend());
1399ffeaf689SAlexander Kabaev 	__glibcxx_requires_valid_range(__k1, __k2);
1400ffeaf689SAlexander Kabaev 	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1401ffeaf689SAlexander Kabaev 			     __k1, __k2 - __k1);
1402ffeaf689SAlexander Kabaev       }
1403ca6500fcSAlexander Kabaev 
1404ca6500fcSAlexander Kabaev       basic_string&
1405ffeaf689SAlexander Kabaev       replace(iterator __i1, iterator __i2,
1406ffeaf689SAlexander Kabaev 	      const _CharT* __k1, const _CharT* __k2)
1407ffeaf689SAlexander Kabaev       {
1408ffeaf689SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1409ffeaf689SAlexander Kabaev 				 && __i2 <= _M_iend());
1410ffeaf689SAlexander Kabaev 	__glibcxx_requires_valid_range(__k1, __k2);
1411ffeaf689SAlexander Kabaev 	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1412ffeaf689SAlexander Kabaev 			     __k1, __k2 - __k1);
1413ffeaf689SAlexander Kabaev       }
1414ca6500fcSAlexander Kabaev 
1415ca6500fcSAlexander Kabaev       basic_string&
1416ca6500fcSAlexander Kabaev       replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
1417ffeaf689SAlexander Kabaev       {
1418ffeaf689SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1419ffeaf689SAlexander Kabaev 				 && __i2 <= _M_iend());
1420ffeaf689SAlexander Kabaev 	__glibcxx_requires_valid_range(__k1, __k2);
1421ffeaf689SAlexander Kabaev 	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1422ca6500fcSAlexander Kabaev 			     __k1.base(), __k2 - __k1);
1423ca6500fcSAlexander Kabaev       }
1424ca6500fcSAlexander Kabaev 
1425ca6500fcSAlexander Kabaev       basic_string&
1426ffeaf689SAlexander Kabaev       replace(iterator __i1, iterator __i2,
1427ffeaf689SAlexander Kabaev 	      const_iterator __k1, const_iterator __k2)
1428ffeaf689SAlexander Kabaev       {
1429ffeaf689SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1430ffeaf689SAlexander Kabaev 				 && __i2 <= _M_iend());
1431ffeaf689SAlexander Kabaev 	__glibcxx_requires_valid_range(__k1, __k2);
1432ffeaf689SAlexander Kabaev 	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1433ca6500fcSAlexander Kabaev 			     __k1.base(), __k2 - __k1);
1434ca6500fcSAlexander Kabaev       }
1435ca6500fcSAlexander Kabaev 
143600db7afdSDavid E. O'Brien     private:
1437ffeaf689SAlexander Kabaev       template<class _Integer>
1438ffeaf689SAlexander Kabaev 	basic_string&
1439ffeaf689SAlexander Kabaev 	_M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
1440ffeaf689SAlexander Kabaev 			    _Integer __val, __true_type)
1441ffeaf689SAlexander Kabaev         { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
1442ffeaf689SAlexander Kabaev 
144300db7afdSDavid E. O'Brien       template<class _InputIterator>
144400db7afdSDavid E. O'Brien 	basic_string&
1445ffeaf689SAlexander Kabaev 	_M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
1446ffeaf689SAlexander Kabaev 			    _InputIterator __k2, __false_type);
144700db7afdSDavid E. O'Brien 
144800db7afdSDavid E. O'Brien       basic_string&
1449ffeaf689SAlexander Kabaev       _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
1450f8a1b7d9SAlexander Kabaev 		     _CharT __c);
1451ffeaf689SAlexander Kabaev 
1452ffeaf689SAlexander Kabaev       basic_string&
1453ffeaf689SAlexander Kabaev       _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
1454f8a1b7d9SAlexander Kabaev 		      size_type __n2);
145500db7afdSDavid E. O'Brien 
145600db7afdSDavid E. O'Brien       // _S_construct_aux is used to implement the 21.3.1 para 15 which
145700db7afdSDavid E. O'Brien       // requires special behaviour if _InIter is an integral type
1458ffeaf689SAlexander Kabaev       template<class _InIterator>
145900db7afdSDavid E. O'Brien         static _CharT*
1460ffeaf689SAlexander Kabaev         _S_construct_aux(_InIterator __beg, _InIterator __end,
1461ffeaf689SAlexander Kabaev 			 const _Alloc& __a, __false_type)
146200db7afdSDavid E. O'Brien 	{
1463ffeaf689SAlexander Kabaev           typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
146400db7afdSDavid E. O'Brien           return _S_construct(__beg, __end, __a, _Tag());
146500db7afdSDavid E. O'Brien 	}
146600db7afdSDavid E. O'Brien 
1467ffeaf689SAlexander Kabaev       template<class _InIterator>
146800db7afdSDavid E. O'Brien         static _CharT*
1469ffeaf689SAlexander Kabaev         _S_construct_aux(_InIterator __beg, _InIterator __end,
1470ffeaf689SAlexander Kabaev 			 const _Alloc& __a, __true_type)
1471ffeaf689SAlexander Kabaev 	{ return _S_construct(static_cast<size_type>(__beg),
1472ffeaf689SAlexander Kabaev 			      static_cast<value_type>(__end), __a); }
147300db7afdSDavid E. O'Brien 
1474ffeaf689SAlexander Kabaev       template<class _InIterator>
147500db7afdSDavid E. O'Brien         static _CharT*
1476ffeaf689SAlexander Kabaev         _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
147700db7afdSDavid E. O'Brien 	{
1478f8a1b7d9SAlexander Kabaev 	  typedef typename std::__is_integer<_InIterator>::__type _Integral;
147900db7afdSDavid E. O'Brien 	  return _S_construct_aux(__beg, __end, __a, _Integral());
148000db7afdSDavid E. O'Brien         }
148100db7afdSDavid E. O'Brien 
148200db7afdSDavid E. O'Brien       // For Input Iterators, used in istreambuf_iterators, etc.
1483ffeaf689SAlexander Kabaev       template<class _InIterator>
148400db7afdSDavid E. O'Brien         static _CharT*
1485ffeaf689SAlexander Kabaev          _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
148600db7afdSDavid E. O'Brien 		      input_iterator_tag);
148700db7afdSDavid E. O'Brien 
148800db7afdSDavid E. O'Brien       // For forward_iterators up to random_access_iterators, used for
148900db7afdSDavid E. O'Brien       // string::iterator, _CharT*, etc.
1490ffeaf689SAlexander Kabaev       template<class _FwdIterator>
149100db7afdSDavid E. O'Brien         static _CharT*
1492ffeaf689SAlexander Kabaev         _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
149300db7afdSDavid E. O'Brien 		     forward_iterator_tag);
149400db7afdSDavid E. O'Brien 
149500db7afdSDavid E. O'Brien       static _CharT*
149600db7afdSDavid E. O'Brien       _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
149700db7afdSDavid E. O'Brien 
149800db7afdSDavid E. O'Brien     public:
149900db7afdSDavid E. O'Brien 
1500ffeaf689SAlexander Kabaev       /**
1501ffeaf689SAlexander Kabaev        *  @brief  Copy substring into C string.
1502ffeaf689SAlexander Kabaev        *  @param s  C string to copy value into.
1503ffeaf689SAlexander Kabaev        *  @param n  Number of characters to copy.
1504ffeaf689SAlexander Kabaev        *  @param pos  Index of first character to copy.
1505ffeaf689SAlexander Kabaev        *  @return  Number of characters actually copied
1506ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If pos > size().
1507ffeaf689SAlexander Kabaev        *
1508ffeaf689SAlexander Kabaev        *  Copies up to @a n characters starting at @a pos into the C string @a
1509ffeaf689SAlexander Kabaev        *  s.  If @a pos is greater than size(), out_of_range is thrown.
1510ffeaf689SAlexander Kabaev       */
151100db7afdSDavid E. O'Brien       size_type
151200db7afdSDavid E. O'Brien       copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
151300db7afdSDavid E. O'Brien 
1514ffeaf689SAlexander Kabaev       /**
1515ffeaf689SAlexander Kabaev        *  @brief  Swap contents with another string.
1516ffeaf689SAlexander Kabaev        *  @param s  String to swap with.
1517ffeaf689SAlexander Kabaev        *
1518ffeaf689SAlexander Kabaev        *  Exchanges the contents of this string with that of @a s in constant
1519ffeaf689SAlexander Kabaev        *  time.
1520ffeaf689SAlexander Kabaev       */
152100db7afdSDavid E. O'Brien       void
1522ffeaf689SAlexander Kabaev       swap(basic_string& __s);
152300db7afdSDavid E. O'Brien 
152400db7afdSDavid E. O'Brien       // String operations:
1525ffeaf689SAlexander Kabaev       /**
1526ffeaf689SAlexander Kabaev        *  @brief  Return const pointer to null-terminated contents.
1527ffeaf689SAlexander Kabaev        *
1528ffeaf689SAlexander Kabaev        *  This is a handle to internal data.  Do not modify or dire things may
1529ffeaf689SAlexander Kabaev        *  happen.
1530ffeaf689SAlexander Kabaev       */
153100db7afdSDavid E. O'Brien       const _CharT*
1532f8a1b7d9SAlexander Kabaev       c_str() const
1533f8a1b7d9SAlexander Kabaev       { return _M_data(); }
153400db7afdSDavid E. O'Brien 
1535ffeaf689SAlexander Kabaev       /**
1536ffeaf689SAlexander Kabaev        *  @brief  Return const pointer to contents.
1537ffeaf689SAlexander Kabaev        *
1538ffeaf689SAlexander Kabaev        *  This is a handle to internal data.  Do not modify or dire things may
1539ffeaf689SAlexander Kabaev        *  happen.
1540ffeaf689SAlexander Kabaev       */
154100db7afdSDavid E. O'Brien       const _CharT*
1542f8a1b7d9SAlexander Kabaev       data() const
1543f8a1b7d9SAlexander Kabaev       { return _M_data(); }
154400db7afdSDavid E. O'Brien 
1545ffeaf689SAlexander Kabaev       /**
1546ffeaf689SAlexander Kabaev        *  @brief  Return copy of allocator used to construct this string.
1547ffeaf689SAlexander Kabaev       */
154800db7afdSDavid E. O'Brien       allocator_type
1549f8a1b7d9SAlexander Kabaev       get_allocator() const
1550f8a1b7d9SAlexander Kabaev       { return _M_dataplus; }
155100db7afdSDavid E. O'Brien 
1552ffeaf689SAlexander Kabaev       /**
1553ffeaf689SAlexander Kabaev        *  @brief  Find position of a C substring.
1554ffeaf689SAlexander Kabaev        *  @param s  C string to locate.
1555ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search from.
1556ffeaf689SAlexander Kabaev        *  @param n  Number of characters from @a s to search for.
1557ffeaf689SAlexander Kabaev        *  @return  Index of start of first occurrence.
1558ffeaf689SAlexander Kabaev        *
1559ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for the first @a n characters
1560ffeaf689SAlexander Kabaev        *  in @a s within this string.  If found, returns the index where it
1561ffeaf689SAlexander Kabaev        *  begins.  If not found, returns npos.
1562ffeaf689SAlexander Kabaev       */
156300db7afdSDavid E. O'Brien       size_type
156400db7afdSDavid E. O'Brien       find(const _CharT* __s, size_type __pos, size_type __n) const;
156500db7afdSDavid E. O'Brien 
1566ffeaf689SAlexander Kabaev       /**
1567ffeaf689SAlexander Kabaev        *  @brief  Find position of a string.
1568ffeaf689SAlexander Kabaev        *  @param str  String to locate.
1569ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1570ffeaf689SAlexander Kabaev        *  @return  Index of start of first occurrence.
1571ffeaf689SAlexander Kabaev        *
1572ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for value of @a str within
1573ffeaf689SAlexander Kabaev        *  this string.  If found, returns the index where it begins.  If not
1574ffeaf689SAlexander Kabaev        *  found, returns npos.
1575ffeaf689SAlexander Kabaev       */
157600db7afdSDavid E. O'Brien       size_type
157700db7afdSDavid E. O'Brien       find(const basic_string& __str, size_type __pos = 0) const
157800db7afdSDavid E. O'Brien       { return this->find(__str.data(), __pos, __str.size()); }
157900db7afdSDavid E. O'Brien 
1580ffeaf689SAlexander Kabaev       /**
1581ffeaf689SAlexander Kabaev        *  @brief  Find position of a C string.
1582ffeaf689SAlexander Kabaev        *  @param s  C string to locate.
1583ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1584ffeaf689SAlexander Kabaev        *  @return  Index of start of first occurrence.
1585ffeaf689SAlexander Kabaev        *
1586ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for the value of @a s within
1587ffeaf689SAlexander Kabaev        *  this string.  If found, returns the index where it begins.  If not
1588ffeaf689SAlexander Kabaev        *  found, returns npos.
1589ffeaf689SAlexander Kabaev       */
159000db7afdSDavid E. O'Brien       size_type
159100db7afdSDavid E. O'Brien       find(const _CharT* __s, size_type __pos = 0) const
1592ffeaf689SAlexander Kabaev       {
1593ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
1594ffeaf689SAlexander Kabaev 	return this->find(__s, __pos, traits_type::length(__s));
1595ffeaf689SAlexander Kabaev       }
159600db7afdSDavid E. O'Brien 
1597ffeaf689SAlexander Kabaev       /**
1598ffeaf689SAlexander Kabaev        *  @brief  Find position of a character.
1599ffeaf689SAlexander Kabaev        *  @param c  Character to locate.
1600ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1601ffeaf689SAlexander Kabaev        *  @return  Index of first occurrence.
1602ffeaf689SAlexander Kabaev        *
1603ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for @a c within this string.
1604ffeaf689SAlexander Kabaev        *  If found, returns the index where it was found.  If not found,
1605ffeaf689SAlexander Kabaev        *  returns npos.
1606ffeaf689SAlexander Kabaev       */
160700db7afdSDavid E. O'Brien       size_type
160800db7afdSDavid E. O'Brien       find(_CharT __c, size_type __pos = 0) const;
160900db7afdSDavid E. O'Brien 
1610ffeaf689SAlexander Kabaev       /**
1611ffeaf689SAlexander Kabaev        *  @brief  Find last position of a string.
1612ffeaf689SAlexander Kabaev        *  @param str  String to locate.
1613ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search back from (default end).
1614ffeaf689SAlexander Kabaev        *  @return  Index of start of last occurrence.
1615ffeaf689SAlexander Kabaev        *
1616ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for value of @a str within
1617ffeaf689SAlexander Kabaev        *  this string.  If found, returns the index where it begins.  If not
1618ffeaf689SAlexander Kabaev        *  found, returns npos.
1619ffeaf689SAlexander Kabaev       */
162000db7afdSDavid E. O'Brien       size_type
162100db7afdSDavid E. O'Brien       rfind(const basic_string& __str, size_type __pos = npos) const
162200db7afdSDavid E. O'Brien       { return this->rfind(__str.data(), __pos, __str.size()); }
162300db7afdSDavid E. O'Brien 
1624ffeaf689SAlexander Kabaev       /**
1625ffeaf689SAlexander Kabaev        *  @brief  Find last position of a C substring.
1626ffeaf689SAlexander Kabaev        *  @param s  C string to locate.
1627ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search back from.
1628ffeaf689SAlexander Kabaev        *  @param n  Number of characters from s to search for.
1629ffeaf689SAlexander Kabaev        *  @return  Index of start of last occurrence.
1630ffeaf689SAlexander Kabaev        *
1631ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for the first @a n
1632ffeaf689SAlexander Kabaev        *  characters in @a s within this string.  If found, returns the index
1633ffeaf689SAlexander Kabaev        *  where it begins.  If not found, returns npos.
1634ffeaf689SAlexander Kabaev       */
163500db7afdSDavid E. O'Brien       size_type
163600db7afdSDavid E. O'Brien       rfind(const _CharT* __s, size_type __pos, size_type __n) const;
163700db7afdSDavid E. O'Brien 
1638ffeaf689SAlexander Kabaev       /**
1639ffeaf689SAlexander Kabaev        *  @brief  Find last position of a C string.
1640ffeaf689SAlexander Kabaev        *  @param s  C string to locate.
1641f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to start search at (default end).
1642ffeaf689SAlexander Kabaev        *  @return  Index of start of  last occurrence.
1643ffeaf689SAlexander Kabaev        *
1644ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for the value of @a s within
1645ffeaf689SAlexander Kabaev        *  this string.  If found, returns the index where it begins.  If not
1646ffeaf689SAlexander Kabaev        *  found, returns npos.
1647ffeaf689SAlexander Kabaev       */
164800db7afdSDavid E. O'Brien       size_type
164900db7afdSDavid E. O'Brien       rfind(const _CharT* __s, size_type __pos = npos) const
1650ffeaf689SAlexander Kabaev       {
1651ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
1652ffeaf689SAlexander Kabaev 	return this->rfind(__s, __pos, traits_type::length(__s));
1653ffeaf689SAlexander Kabaev       }
165400db7afdSDavid E. O'Brien 
1655ffeaf689SAlexander Kabaev       /**
1656ffeaf689SAlexander Kabaev        *  @brief  Find last position of a character.
1657ffeaf689SAlexander Kabaev        *  @param c  Character to locate.
1658f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search back from (default end).
1659ffeaf689SAlexander Kabaev        *  @return  Index of last occurrence.
1660ffeaf689SAlexander Kabaev        *
1661ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for @a c within this string.
1662ffeaf689SAlexander Kabaev        *  If found, returns the index where it was found.  If not found,
1663ffeaf689SAlexander Kabaev        *  returns npos.
1664ffeaf689SAlexander Kabaev       */
166500db7afdSDavid E. O'Brien       size_type
166600db7afdSDavid E. O'Brien       rfind(_CharT __c, size_type __pos = npos) const;
166700db7afdSDavid E. O'Brien 
1668ffeaf689SAlexander Kabaev       /**
1669ffeaf689SAlexander Kabaev        *  @brief  Find position of a character of string.
1670ffeaf689SAlexander Kabaev        *  @param str  String containing characters to locate.
1671ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1672ffeaf689SAlexander Kabaev        *  @return  Index of first occurrence.
1673ffeaf689SAlexander Kabaev        *
1674ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for one of the characters of
1675ffeaf689SAlexander Kabaev        *  @a str within this string.  If found, returns the index where it was
1676ffeaf689SAlexander Kabaev        *  found.  If not found, returns npos.
1677ffeaf689SAlexander Kabaev       */
167800db7afdSDavid E. O'Brien       size_type
167900db7afdSDavid E. O'Brien       find_first_of(const basic_string& __str, size_type __pos = 0) const
168000db7afdSDavid E. O'Brien       { return this->find_first_of(__str.data(), __pos, __str.size()); }
168100db7afdSDavid E. O'Brien 
1682ffeaf689SAlexander Kabaev       /**
1683ffeaf689SAlexander Kabaev        *  @brief  Find position of a character of C substring.
1684ffeaf689SAlexander Kabaev        *  @param s  String containing characters to locate.
168505a636f0SPedro F. Giffuni        *  @param pos  Index of character to search from.
1686ffeaf689SAlexander Kabaev        *  @param n  Number of characters from s to search for.
1687ffeaf689SAlexander Kabaev        *  @return  Index of first occurrence.
1688ffeaf689SAlexander Kabaev        *
1689ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for one of the first @a n
1690ffeaf689SAlexander Kabaev        *  characters of @a s within this string.  If found, returns the index
1691ffeaf689SAlexander Kabaev        *  where it was found.  If not found, returns npos.
1692ffeaf689SAlexander Kabaev       */
169300db7afdSDavid E. O'Brien       size_type
169400db7afdSDavid E. O'Brien       find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
169500db7afdSDavid E. O'Brien 
1696ffeaf689SAlexander Kabaev       /**
1697ffeaf689SAlexander Kabaev        *  @brief  Find position of a character of C string.
1698ffeaf689SAlexander Kabaev        *  @param s  String containing characters to locate.
1699ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1700ffeaf689SAlexander Kabaev        *  @return  Index of first occurrence.
1701ffeaf689SAlexander Kabaev        *
1702ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for one of the characters of
1703ffeaf689SAlexander Kabaev        *  @a s within this string.  If found, returns the index where it was
1704ffeaf689SAlexander Kabaev        *  found.  If not found, returns npos.
1705ffeaf689SAlexander Kabaev       */
170600db7afdSDavid E. O'Brien       size_type
170700db7afdSDavid E. O'Brien       find_first_of(const _CharT* __s, size_type __pos = 0) const
1708ffeaf689SAlexander Kabaev       {
1709ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
1710ffeaf689SAlexander Kabaev 	return this->find_first_of(__s, __pos, traits_type::length(__s));
1711ffeaf689SAlexander Kabaev       }
171200db7afdSDavid E. O'Brien 
1713ffeaf689SAlexander Kabaev       /**
1714ffeaf689SAlexander Kabaev        *  @brief  Find position of a character.
1715ffeaf689SAlexander Kabaev        *  @param c  Character to locate.
1716ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1717ffeaf689SAlexander Kabaev        *  @return  Index of first occurrence.
1718ffeaf689SAlexander Kabaev        *
1719ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for the character @a c within
1720ffeaf689SAlexander Kabaev        *  this string.  If found, returns the index where it was found.  If
1721ffeaf689SAlexander Kabaev        *  not found, returns npos.
1722ffeaf689SAlexander Kabaev        *
1723ffeaf689SAlexander Kabaev        *  Note: equivalent to find(c, pos).
1724ffeaf689SAlexander Kabaev       */
172500db7afdSDavid E. O'Brien       size_type
172600db7afdSDavid E. O'Brien       find_first_of(_CharT __c, size_type __pos = 0) const
172700db7afdSDavid E. O'Brien       { return this->find(__c, __pos); }
172800db7afdSDavid E. O'Brien 
1729ffeaf689SAlexander Kabaev       /**
1730ffeaf689SAlexander Kabaev        *  @brief  Find last position of a character of string.
1731ffeaf689SAlexander Kabaev        *  @param str  String containing characters to locate.
1732ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search back from (default end).
1733ffeaf689SAlexander Kabaev        *  @return  Index of last occurrence.
1734ffeaf689SAlexander Kabaev        *
1735ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for one of the characters of
1736ffeaf689SAlexander Kabaev        *  @a str within this string.  If found, returns the index where it was
1737ffeaf689SAlexander Kabaev        *  found.  If not found, returns npos.
1738ffeaf689SAlexander Kabaev       */
173900db7afdSDavid E. O'Brien       size_type
174000db7afdSDavid E. O'Brien       find_last_of(const basic_string& __str, size_type __pos = npos) const
174100db7afdSDavid E. O'Brien       { return this->find_last_of(__str.data(), __pos, __str.size()); }
174200db7afdSDavid E. O'Brien 
1743ffeaf689SAlexander Kabaev       /**
1744ffeaf689SAlexander Kabaev        *  @brief  Find last position of a character of C substring.
1745ffeaf689SAlexander Kabaev        *  @param s  C string containing characters to locate.
174605a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from.
1747ffeaf689SAlexander Kabaev        *  @param n  Number of characters from s to search for.
1748ffeaf689SAlexander Kabaev        *  @return  Index of last occurrence.
1749ffeaf689SAlexander Kabaev        *
1750ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for one of the first @a n
1751ffeaf689SAlexander Kabaev        *  characters of @a s within this string.  If found, returns the index
1752ffeaf689SAlexander Kabaev        *  where it was found.  If not found, returns npos.
1753ffeaf689SAlexander Kabaev       */
175400db7afdSDavid E. O'Brien       size_type
175500db7afdSDavid E. O'Brien       find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
175600db7afdSDavid E. O'Brien 
1757ffeaf689SAlexander Kabaev       /**
1758ffeaf689SAlexander Kabaev        *  @brief  Find last position of a character of C string.
1759ffeaf689SAlexander Kabaev        *  @param s  C string containing characters to locate.
1760ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search back from (default end).
1761ffeaf689SAlexander Kabaev        *  @return  Index of last occurrence.
1762ffeaf689SAlexander Kabaev        *
1763ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for one of the characters of
1764ffeaf689SAlexander Kabaev        *  @a s within this string.  If found, returns the index where it was
1765ffeaf689SAlexander Kabaev        *  found.  If not found, returns npos.
1766ffeaf689SAlexander Kabaev       */
176700db7afdSDavid E. O'Brien       size_type
176800db7afdSDavid E. O'Brien       find_last_of(const _CharT* __s, size_type __pos = npos) const
1769ffeaf689SAlexander Kabaev       {
1770ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
1771ffeaf689SAlexander Kabaev 	return this->find_last_of(__s, __pos, traits_type::length(__s));
1772ffeaf689SAlexander Kabaev       }
177300db7afdSDavid E. O'Brien 
1774ffeaf689SAlexander Kabaev       /**
1775ffeaf689SAlexander Kabaev        *  @brief  Find last position of a character.
1776ffeaf689SAlexander Kabaev        *  @param c  Character to locate.
177705a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from (default end).
1778ffeaf689SAlexander Kabaev        *  @return  Index of last occurrence.
1779ffeaf689SAlexander Kabaev        *
1780ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for @a c within this string.
1781ffeaf689SAlexander Kabaev        *  If found, returns the index where it was found.  If not found,
1782ffeaf689SAlexander Kabaev        *  returns npos.
1783ffeaf689SAlexander Kabaev        *
1784ffeaf689SAlexander Kabaev        *  Note: equivalent to rfind(c, pos).
1785ffeaf689SAlexander Kabaev       */
178600db7afdSDavid E. O'Brien       size_type
178700db7afdSDavid E. O'Brien       find_last_of(_CharT __c, size_type __pos = npos) const
178800db7afdSDavid E. O'Brien       { return this->rfind(__c, __pos); }
178900db7afdSDavid E. O'Brien 
1790ffeaf689SAlexander Kabaev       /**
1791ffeaf689SAlexander Kabaev        *  @brief  Find position of a character not in string.
1792ffeaf689SAlexander Kabaev        *  @param str  String containing characters to avoid.
1793ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1794ffeaf689SAlexander Kabaev        *  @return  Index of first occurrence.
1795ffeaf689SAlexander Kabaev        *
1796ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for a character not contained
1797ffeaf689SAlexander Kabaev        *  in @a str within this string.  If found, returns the index where it
1798ffeaf689SAlexander Kabaev        *  was found.  If not found, returns npos.
1799ffeaf689SAlexander Kabaev       */
180000db7afdSDavid E. O'Brien       size_type
180100db7afdSDavid E. O'Brien       find_first_not_of(const basic_string& __str, size_type __pos = 0) const
180200db7afdSDavid E. O'Brien       { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
180300db7afdSDavid E. O'Brien 
1804ffeaf689SAlexander Kabaev       /**
1805ffeaf689SAlexander Kabaev        *  @brief  Find position of a character not in C substring.
1806ffeaf689SAlexander Kabaev        *  @param s  C string containing characters to avoid.
180705a636f0SPedro F. Giffuni        *  @param pos  Index of character to search from.
1808ffeaf689SAlexander Kabaev        *  @param n  Number of characters from s to consider.
1809ffeaf689SAlexander Kabaev        *  @return  Index of first occurrence.
1810ffeaf689SAlexander Kabaev        *
1811ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for a character not contained
1812ffeaf689SAlexander Kabaev        *  in the first @a n characters of @a s within this string.  If found,
1813ffeaf689SAlexander Kabaev        *  returns the index where it was found.  If not found, returns npos.
1814ffeaf689SAlexander Kabaev       */
181500db7afdSDavid E. O'Brien       size_type
181600db7afdSDavid E. O'Brien       find_first_not_of(const _CharT* __s, size_type __pos,
181700db7afdSDavid E. O'Brien 			size_type __n) const;
181800db7afdSDavid E. O'Brien 
1819ffeaf689SAlexander Kabaev       /**
1820ffeaf689SAlexander Kabaev        *  @brief  Find position of a character not in C string.
1821ffeaf689SAlexander Kabaev        *  @param s  C string containing characters to avoid.
1822ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1823ffeaf689SAlexander Kabaev        *  @return  Index of first occurrence.
1824ffeaf689SAlexander Kabaev        *
1825ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for a character not contained
1826ffeaf689SAlexander Kabaev        *  in @a s within this string.  If found, returns the index where it
1827ffeaf689SAlexander Kabaev        *  was found.  If not found, returns npos.
1828ffeaf689SAlexander Kabaev       */
182900db7afdSDavid E. O'Brien       size_type
183000db7afdSDavid E. O'Brien       find_first_not_of(const _CharT* __s, size_type __pos = 0) const
1831ffeaf689SAlexander Kabaev       {
1832ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
1833ffeaf689SAlexander Kabaev 	return this->find_first_not_of(__s, __pos, traits_type::length(__s));
1834ffeaf689SAlexander Kabaev       }
183500db7afdSDavid E. O'Brien 
1836ffeaf689SAlexander Kabaev       /**
1837ffeaf689SAlexander Kabaev        *  @brief  Find position of a different character.
1838ffeaf689SAlexander Kabaev        *  @param c  Character to avoid.
1839ffeaf689SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1840ffeaf689SAlexander Kabaev        *  @return  Index of first occurrence.
1841ffeaf689SAlexander Kabaev        *
1842ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches forward for a character other than @a c
1843ffeaf689SAlexander Kabaev        *  within this string.  If found, returns the index where it was found.
1844ffeaf689SAlexander Kabaev        *  If not found, returns npos.
1845ffeaf689SAlexander Kabaev       */
184600db7afdSDavid E. O'Brien       size_type
184700db7afdSDavid E. O'Brien       find_first_not_of(_CharT __c, size_type __pos = 0) const;
184800db7afdSDavid E. O'Brien 
1849ffeaf689SAlexander Kabaev       /**
1850ffeaf689SAlexander Kabaev        *  @brief  Find last position of a character not in string.
1851ffeaf689SAlexander Kabaev        *  @param str  String containing characters to avoid.
185205a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from (default end).
185305a636f0SPedro F. Giffuni        *  @return  Index of last occurrence.
1854ffeaf689SAlexander Kabaev        *
1855ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for a character not
1856ffeaf689SAlexander Kabaev        *  contained in @a str within this string.  If found, returns the index
1857ffeaf689SAlexander Kabaev        *  where it was found.  If not found, returns npos.
1858ffeaf689SAlexander Kabaev       */
185900db7afdSDavid E. O'Brien       size_type
186000db7afdSDavid E. O'Brien       find_last_not_of(const basic_string& __str, size_type __pos = npos) const
186100db7afdSDavid E. O'Brien       { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
186200db7afdSDavid E. O'Brien 
1863ffeaf689SAlexander Kabaev       /**
1864ffeaf689SAlexander Kabaev        *  @brief  Find last position of a character not in C substring.
1865ffeaf689SAlexander Kabaev        *  @param s  C string containing characters to avoid.
186605a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from.
1867ffeaf689SAlexander Kabaev        *  @param n  Number of characters from s to consider.
186805a636f0SPedro F. Giffuni        *  @return  Index of last occurrence.
1869ffeaf689SAlexander Kabaev        *
1870ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for a character not
1871ffeaf689SAlexander Kabaev        *  contained in the first @a n characters of @a s within this string.
1872ffeaf689SAlexander Kabaev        *  If found, returns the index where it was found.  If not found,
1873ffeaf689SAlexander Kabaev        *  returns npos.
1874ffeaf689SAlexander Kabaev       */
187500db7afdSDavid E. O'Brien       size_type
187600db7afdSDavid E. O'Brien       find_last_not_of(const _CharT* __s, size_type __pos,
187700db7afdSDavid E. O'Brien 		       size_type __n) const;
1878ffeaf689SAlexander Kabaev       /**
187905a636f0SPedro F. Giffuni        *  @brief  Find last position of a character not in C string.
1880ffeaf689SAlexander Kabaev        *  @param s  C string containing characters to avoid.
188105a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from (default end).
188205a636f0SPedro F. Giffuni        *  @return  Index of last occurrence.
1883ffeaf689SAlexander Kabaev        *
1884ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for a character not
1885ffeaf689SAlexander Kabaev        *  contained in @a s within this string.  If found, returns the index
1886ffeaf689SAlexander Kabaev        *  where it was found.  If not found, returns npos.
1887ffeaf689SAlexander Kabaev       */
188800db7afdSDavid E. O'Brien       size_type
188900db7afdSDavid E. O'Brien       find_last_not_of(const _CharT* __s, size_type __pos = npos) const
1890ffeaf689SAlexander Kabaev       {
1891ffeaf689SAlexander Kabaev 	__glibcxx_requires_string(__s);
1892ffeaf689SAlexander Kabaev 	return this->find_last_not_of(__s, __pos, traits_type::length(__s));
1893ffeaf689SAlexander Kabaev       }
189400db7afdSDavid E. O'Brien 
1895ffeaf689SAlexander Kabaev       /**
1896ffeaf689SAlexander Kabaev        *  @brief  Find last position of a different character.
1897ffeaf689SAlexander Kabaev        *  @param c  Character to avoid.
189805a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from (default end).
189905a636f0SPedro F. Giffuni        *  @return  Index of last occurrence.
1900ffeaf689SAlexander Kabaev        *
1901ffeaf689SAlexander Kabaev        *  Starting from @a pos, searches backward for a character other than
1902ffeaf689SAlexander Kabaev        *  @a c within this string.  If found, returns the index where it was
1903ffeaf689SAlexander Kabaev        *  found.  If not found, returns npos.
1904ffeaf689SAlexander Kabaev       */
190500db7afdSDavid E. O'Brien       size_type
190600db7afdSDavid E. O'Brien       find_last_not_of(_CharT __c, size_type __pos = npos) const;
190700db7afdSDavid E. O'Brien 
1908ffeaf689SAlexander Kabaev       /**
1909ffeaf689SAlexander Kabaev        *  @brief  Get a substring.
1910ffeaf689SAlexander Kabaev        *  @param pos  Index of first character (default 0).
1911ffeaf689SAlexander Kabaev        *  @param n  Number of characters in substring (default remainder).
1912ffeaf689SAlexander Kabaev        *  @return  The new string.
1913ffeaf689SAlexander Kabaev        *  @throw  std::out_of_range  If pos > size().
1914ffeaf689SAlexander Kabaev        *
1915ffeaf689SAlexander Kabaev        *  Construct and return a new string using the @a n characters starting
1916ffeaf689SAlexander Kabaev        *  at @a pos.  If the string is too short, use the remainder of the
1917ffeaf689SAlexander Kabaev        *  characters.  If @a pos is beyond the end of the string, out_of_range
1918ffeaf689SAlexander Kabaev        *  is thrown.
1919ffeaf689SAlexander Kabaev       */
192000db7afdSDavid E. O'Brien       basic_string
192100db7afdSDavid E. O'Brien       substr(size_type __pos = 0, size_type __n = npos) const
1922ffeaf689SAlexander Kabaev       { return basic_string(*this,
1923ffeaf689SAlexander Kabaev 			    _M_check(__pos, "basic_string::substr"), __n); }
192400db7afdSDavid E. O'Brien 
1925ffeaf689SAlexander Kabaev       /**
1926ffeaf689SAlexander Kabaev        *  @brief  Compare to a string.
1927ffeaf689SAlexander Kabaev        *  @param str  String to compare against.
1928ffeaf689SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
1929ffeaf689SAlexander Kabaev        *
1930ffeaf689SAlexander Kabaev        *  Returns an integer < 0 if this string is ordered before @a str, 0 if
1931ffeaf689SAlexander Kabaev        *  their values are equivalent, or > 0 if this string is ordered after
1932f260e61bSAlexander Kabaev        *  @a str.  Determines the effective length rlen of the strings to
1933f260e61bSAlexander Kabaev        *  compare as the smallest of size() and str.size().  The function
1934f260e61bSAlexander Kabaev        *  then compares the two strings by calling traits::compare(data(),
1935f260e61bSAlexander Kabaev        *  str.data(),rlen).  If the result of the comparison is nonzero returns
1936f260e61bSAlexander Kabaev        *  it, otherwise the shorter one is ordered first.
1937ffeaf689SAlexander Kabaev       */
193800db7afdSDavid E. O'Brien       int
193900db7afdSDavid E. O'Brien       compare(const basic_string& __str) const
194000db7afdSDavid E. O'Brien       {
1941ffeaf689SAlexander Kabaev 	const size_type __size = this->size();
1942ffeaf689SAlexander Kabaev 	const size_type __osize = __str.size();
1943ffeaf689SAlexander Kabaev 	const size_type __len = std::min(__size, __osize);
194400db7afdSDavid E. O'Brien 
194500db7afdSDavid E. O'Brien 	int __r = traits_type::compare(_M_data(), __str.data(), __len);
194600db7afdSDavid E. O'Brien 	if (!__r)
1947*096464d3SPedro F. Giffuni 	  __r =  _S_compare(__size, __osize);
194800db7afdSDavid E. O'Brien 	return __r;
194900db7afdSDavid E. O'Brien       }
195000db7afdSDavid E. O'Brien 
1951ffeaf689SAlexander Kabaev       /**
1952ffeaf689SAlexander Kabaev        *  @brief  Compare substring to a string.
1953ffeaf689SAlexander Kabaev        *  @param pos  Index of first character of substring.
1954ffeaf689SAlexander Kabaev        *  @param n  Number of characters in substring.
1955ffeaf689SAlexander Kabaev        *  @param str  String to compare against.
1956ffeaf689SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
1957ffeaf689SAlexander Kabaev        *
1958ffeaf689SAlexander Kabaev        *  Form the substring of this string from the @a n characters starting
1959ffeaf689SAlexander Kabaev        *  at @a pos.  Returns an integer < 0 if the substring is ordered
1960ffeaf689SAlexander Kabaev        *  before @a str, 0 if their values are equivalent, or > 0 if the
1961f260e61bSAlexander Kabaev        *  substring is ordered after @a str.  Determines the effective length
1962f260e61bSAlexander Kabaev        *  rlen of the strings to compare as the smallest of the length of the
1963f260e61bSAlexander Kabaev        *  substring and @a str.size().  The function then compares the two
1964f260e61bSAlexander Kabaev        *  strings by calling traits::compare(substring.data(),str.data(),rlen).
1965f260e61bSAlexander Kabaev        *  If the result of the comparison is nonzero returns it, otherwise the
1966f260e61bSAlexander Kabaev        *  shorter one is ordered first.
1967ffeaf689SAlexander Kabaev       */
196800db7afdSDavid E. O'Brien       int
196900db7afdSDavid E. O'Brien       compare(size_type __pos, size_type __n, const basic_string& __str) const;
197000db7afdSDavid E. O'Brien 
1971ffeaf689SAlexander Kabaev       /**
1972ffeaf689SAlexander Kabaev        *  @brief  Compare substring to a substring.
1973ffeaf689SAlexander Kabaev        *  @param pos1  Index of first character of substring.
1974ffeaf689SAlexander Kabaev        *  @param n1  Number of characters in substring.
1975ffeaf689SAlexander Kabaev        *  @param str  String to compare against.
1976ffeaf689SAlexander Kabaev        *  @param pos2  Index of first character of substring of str.
1977ffeaf689SAlexander Kabaev        *  @param n2  Number of characters in substring of str.
1978ffeaf689SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
1979ffeaf689SAlexander Kabaev        *
1980ffeaf689SAlexander Kabaev        *  Form the substring of this string from the @a n1 characters starting
1981ffeaf689SAlexander Kabaev        *  at @a pos1.  Form the substring of @a str from the @a n2 characters
1982ffeaf689SAlexander Kabaev        *  starting at @a pos2.  Returns an integer < 0 if this substring is
1983ffeaf689SAlexander Kabaev        *  ordered before the substring of @a str, 0 if their values are
1984ffeaf689SAlexander Kabaev        *  equivalent, or > 0 if this substring is ordered after the substring
1985f260e61bSAlexander Kabaev        *  of @a str.  Determines the effective length rlen of the strings
1986f260e61bSAlexander Kabaev        *  to compare as the smallest of the lengths of the substrings.  The
1987f260e61bSAlexander Kabaev        *  function then compares the two strings by calling
1988f260e61bSAlexander Kabaev        *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
1989f260e61bSAlexander Kabaev        *  If the result of the comparison is nonzero returns it, otherwise the
1990f260e61bSAlexander Kabaev        *  shorter one is ordered first.
1991ffeaf689SAlexander Kabaev       */
199200db7afdSDavid E. O'Brien       int
199300db7afdSDavid E. O'Brien       compare(size_type __pos1, size_type __n1, const basic_string& __str,
199400db7afdSDavid E. O'Brien 	      size_type __pos2, size_type __n2) const;
199500db7afdSDavid E. O'Brien 
1996ffeaf689SAlexander Kabaev       /**
1997ffeaf689SAlexander Kabaev        *  @brief  Compare to a C string.
1998ffeaf689SAlexander Kabaev        *  @param s  C string to compare against.
1999ffeaf689SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
2000ffeaf689SAlexander Kabaev        *
2001ffeaf689SAlexander Kabaev        *  Returns an integer < 0 if this string is ordered before @a s, 0 if
2002ffeaf689SAlexander Kabaev        *  their values are equivalent, or > 0 if this string is ordered after
2003f260e61bSAlexander Kabaev        *  @a s.  Determines the effective length rlen of the strings to
2004f260e61bSAlexander Kabaev        *  compare as the smallest of size() and the length of a string
2005f260e61bSAlexander Kabaev        *  constructed from @a s.  The function then compares the two strings
2006f260e61bSAlexander Kabaev        *  by calling traits::compare(data(),s,rlen).  If the result of the
2007f260e61bSAlexander Kabaev        *  comparison is nonzero returns it, otherwise the shorter one is
2008f260e61bSAlexander Kabaev        *  ordered first.
2009ffeaf689SAlexander Kabaev       */
201000db7afdSDavid E. O'Brien       int
201100db7afdSDavid E. O'Brien       compare(const _CharT* __s) const;
201200db7afdSDavid E. O'Brien 
2013ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
20141b86b14eSAlexander Kabaev       // 5 String::compare specification questionable
2015ffeaf689SAlexander Kabaev       /**
2016ffeaf689SAlexander Kabaev        *  @brief  Compare substring to a C string.
2017ffeaf689SAlexander Kabaev        *  @param pos  Index of first character of substring.
2018ffeaf689SAlexander Kabaev        *  @param n1  Number of characters in substring.
2019ffeaf689SAlexander Kabaev        *  @param s  C string to compare against.
2020ffeaf689SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
2021ffeaf689SAlexander Kabaev        *
2022ffeaf689SAlexander Kabaev        *  Form the substring of this string from the @a n1 characters starting
2023ffeaf689SAlexander Kabaev        *  at @a pos.  Returns an integer < 0 if the substring is ordered
2024ffeaf689SAlexander Kabaev        *  before @a s, 0 if their values are equivalent, or > 0 if the
2025f260e61bSAlexander Kabaev        *  substring is ordered after @a s.  Determines the effective length
2026f260e61bSAlexander Kabaev        *  rlen of the strings to compare as the smallest of the length of the
2027f260e61bSAlexander Kabaev        *  substring and the length of a string constructed from @a s.  The
2028f260e61bSAlexander Kabaev        *  function then compares the two string by calling
2029f260e61bSAlexander Kabaev        *  traits::compare(substring.data(),s,rlen).  If the result of the
2030f260e61bSAlexander Kabaev        *  comparison is nonzero returns it, otherwise the shorter one is
2031f260e61bSAlexander Kabaev        *  ordered first.
2032ffeaf689SAlexander Kabaev       */
203300db7afdSDavid E. O'Brien       int
203400db7afdSDavid E. O'Brien       compare(size_type __pos, size_type __n1, const _CharT* __s) const;
203500db7afdSDavid E. O'Brien 
2036ffeaf689SAlexander Kabaev       /**
2037ffeaf689SAlexander Kabaev        *  @brief  Compare substring against a character array.
2038ffeaf689SAlexander Kabaev        *  @param pos1  Index of first character of substring.
2039ffeaf689SAlexander Kabaev        *  @param n1  Number of characters in substring.
2040ffeaf689SAlexander Kabaev        *  @param s  character array to compare against.
2041ffeaf689SAlexander Kabaev        *  @param n2  Number of characters of s.
2042ffeaf689SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
2043ffeaf689SAlexander Kabaev        *
2044ffeaf689SAlexander Kabaev        *  Form the substring of this string from the @a n1 characters starting
2045ffeaf689SAlexander Kabaev        *  at @a pos1.  Form a string from the first @a n2 characters of @a s.
2046ffeaf689SAlexander Kabaev        *  Returns an integer < 0 if this substring is ordered before the string
2047ffeaf689SAlexander Kabaev        *  from @a s, 0 if their values are equivalent, or > 0 if this substring
2048f260e61bSAlexander Kabaev        *  is ordered after the string from @a s.   Determines the effective
2049f260e61bSAlexander Kabaev        *  length rlen of the strings to compare as the smallest of the length
2050f260e61bSAlexander Kabaev        *  of the substring and @a n2.  The function then compares the two
2051f260e61bSAlexander Kabaev        *  strings by calling traits::compare(substring.data(),s,rlen).  If the
2052f260e61bSAlexander Kabaev        *  result of the comparison is nonzero returns it, otherwise the shorter
2053f260e61bSAlexander Kabaev        *  one is ordered first.
2054ffeaf689SAlexander Kabaev        *
2055ffeaf689SAlexander Kabaev        *  NB: s must have at least n2 characters, '\0' has no special
2056ffeaf689SAlexander Kabaev        *  meaning.
2057ffeaf689SAlexander Kabaev       */
205800db7afdSDavid E. O'Brien       int
205900db7afdSDavid E. O'Brien       compare(size_type __pos, size_type __n1, const _CharT* __s,
206000db7afdSDavid E. O'Brien 	      size_type __n2) const;
206100db7afdSDavid E. O'Brien   };
206200db7afdSDavid E. O'Brien 
206300db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
206400db7afdSDavid E. O'Brien     inline basic_string<_CharT, _Traits, _Alloc>::
basic_string()206500db7afdSDavid E. O'Brien     basic_string()
2066f260e61bSAlexander Kabaev #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
2067ffeaf689SAlexander Kabaev     : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
2068f260e61bSAlexander Kabaev #else
2069f260e61bSAlexander Kabaev     : _M_dataplus(_S_construct(size_type(), _CharT(), _Alloc()), _Alloc()) { }
2070f260e61bSAlexander Kabaev #endif
207100db7afdSDavid E. O'Brien 
207200db7afdSDavid E. O'Brien   // operator+
2073ffeaf689SAlexander Kabaev   /**
2074ffeaf689SAlexander Kabaev    *  @brief  Concatenate two strings.
2075ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2076ffeaf689SAlexander Kabaev    *  @param rhs  Last string.
2077ffeaf689SAlexander Kabaev    *  @return  New string with value of @a lhs followed by @a rhs.
2078ffeaf689SAlexander Kabaev    */
207900db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
208000db7afdSDavid E. O'Brien     basic_string<_CharT, _Traits, _Alloc>
208100db7afdSDavid E. O'Brien     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
208200db7afdSDavid E. O'Brien 	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
208300db7afdSDavid E. O'Brien     {
208400db7afdSDavid E. O'Brien       basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
208500db7afdSDavid E. O'Brien       __str.append(__rhs);
208600db7afdSDavid E. O'Brien       return __str;
208700db7afdSDavid E. O'Brien     }
208800db7afdSDavid E. O'Brien 
2089ffeaf689SAlexander Kabaev   /**
2090ffeaf689SAlexander Kabaev    *  @brief  Concatenate C string and string.
2091ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2092ffeaf689SAlexander Kabaev    *  @param rhs  Last string.
2093ffeaf689SAlexander Kabaev    *  @return  New string with value of @a lhs followed by @a rhs.
2094ffeaf689SAlexander Kabaev    */
209500db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
209600db7afdSDavid E. O'Brien     basic_string<_CharT,_Traits,_Alloc>
209700db7afdSDavid E. O'Brien     operator+(const _CharT* __lhs,
209800db7afdSDavid E. O'Brien 	      const basic_string<_CharT,_Traits,_Alloc>& __rhs);
209900db7afdSDavid E. O'Brien 
2100ffeaf689SAlexander Kabaev   /**
2101ffeaf689SAlexander Kabaev    *  @brief  Concatenate character and string.
2102ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2103ffeaf689SAlexander Kabaev    *  @param rhs  Last string.
2104ffeaf689SAlexander Kabaev    *  @return  New string with @a lhs followed by @a rhs.
2105ffeaf689SAlexander Kabaev    */
210600db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
210700db7afdSDavid E. O'Brien     basic_string<_CharT,_Traits,_Alloc>
210800db7afdSDavid E. O'Brien     operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
210900db7afdSDavid E. O'Brien 
2110ffeaf689SAlexander Kabaev   /**
2111ffeaf689SAlexander Kabaev    *  @brief  Concatenate string and C string.
2112ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2113ffeaf689SAlexander Kabaev    *  @param rhs  Last string.
2114ffeaf689SAlexander Kabaev    *  @return  New string with @a lhs followed by @a rhs.
2115ffeaf689SAlexander Kabaev    */
211600db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
211700db7afdSDavid E. O'Brien     inline basic_string<_CharT, _Traits, _Alloc>
211800db7afdSDavid E. O'Brien     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
211900db7afdSDavid E. O'Brien 	     const _CharT* __rhs)
212000db7afdSDavid E. O'Brien     {
212100db7afdSDavid E. O'Brien       basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
212200db7afdSDavid E. O'Brien       __str.append(__rhs);
212300db7afdSDavid E. O'Brien       return __str;
212400db7afdSDavid E. O'Brien     }
212500db7afdSDavid E. O'Brien 
2126ffeaf689SAlexander Kabaev   /**
2127ffeaf689SAlexander Kabaev    *  @brief  Concatenate string and character.
2128ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2129ffeaf689SAlexander Kabaev    *  @param rhs  Last string.
2130ffeaf689SAlexander Kabaev    *  @return  New string with @a lhs followed by @a rhs.
2131ffeaf689SAlexander Kabaev    */
213200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
213300db7afdSDavid E. O'Brien     inline basic_string<_CharT, _Traits, _Alloc>
213400db7afdSDavid E. O'Brien     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
213500db7afdSDavid E. O'Brien     {
213600db7afdSDavid E. O'Brien       typedef basic_string<_CharT, _Traits, _Alloc>	__string_type;
213700db7afdSDavid E. O'Brien       typedef typename __string_type::size_type		__size_type;
213800db7afdSDavid E. O'Brien       __string_type __str(__lhs);
213900db7afdSDavid E. O'Brien       __str.append(__size_type(1), __rhs);
214000db7afdSDavid E. O'Brien       return __str;
214100db7afdSDavid E. O'Brien     }
214200db7afdSDavid E. O'Brien 
214300db7afdSDavid E. O'Brien   // operator ==
2144ffeaf689SAlexander Kabaev   /**
2145ffeaf689SAlexander Kabaev    *  @brief  Test equivalence of two strings.
2146ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2147ffeaf689SAlexander Kabaev    *  @param rhs  Second string.
2148ffeaf689SAlexander Kabaev    *  @return  True if @a lhs.compare(@a rhs) == 0.  False otherwise.
2149ffeaf689SAlexander Kabaev    */
215000db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
215100db7afdSDavid E. O'Brien     inline bool
215200db7afdSDavid E. O'Brien     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
215300db7afdSDavid E. O'Brien 	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
215400db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) == 0; }
215500db7afdSDavid E. O'Brien 
2156ffeaf689SAlexander Kabaev   /**
2157ffeaf689SAlexander Kabaev    *  @brief  Test equivalence of C string and string.
2158ffeaf689SAlexander Kabaev    *  @param lhs  C string.
2159ffeaf689SAlexander Kabaev    *  @param rhs  String.
2160ffeaf689SAlexander Kabaev    *  @return  True if @a rhs.compare(@a lhs) == 0.  False otherwise.
2161ffeaf689SAlexander Kabaev    */
216200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
216300db7afdSDavid E. O'Brien     inline bool
216400db7afdSDavid E. O'Brien     operator==(const _CharT* __lhs,
216500db7afdSDavid E. O'Brien 	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
216600db7afdSDavid E. O'Brien     { return __rhs.compare(__lhs) == 0; }
216700db7afdSDavid E. O'Brien 
2168ffeaf689SAlexander Kabaev   /**
2169ffeaf689SAlexander Kabaev    *  @brief  Test equivalence of string and C string.
2170ffeaf689SAlexander Kabaev    *  @param lhs  String.
2171ffeaf689SAlexander Kabaev    *  @param rhs  C string.
2172ffeaf689SAlexander Kabaev    *  @return  True if @a lhs.compare(@a rhs) == 0.  False otherwise.
2173ffeaf689SAlexander Kabaev    */
217400db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
217500db7afdSDavid E. O'Brien     inline bool
217600db7afdSDavid E. O'Brien     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
217700db7afdSDavid E. O'Brien 	       const _CharT* __rhs)
217800db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) == 0; }
217900db7afdSDavid E. O'Brien 
218000db7afdSDavid E. O'Brien   // operator !=
2181ffeaf689SAlexander Kabaev   /**
2182ffeaf689SAlexander Kabaev    *  @brief  Test difference of two strings.
2183ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2184ffeaf689SAlexander Kabaev    *  @param rhs  Second string.
2185ffeaf689SAlexander Kabaev    *  @return  True if @a lhs.compare(@a rhs) != 0.  False otherwise.
2186ffeaf689SAlexander Kabaev    */
218700db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
218800db7afdSDavid E. O'Brien     inline bool
218900db7afdSDavid E. O'Brien     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
219000db7afdSDavid E. O'Brien 	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
219100db7afdSDavid E. O'Brien     { return __rhs.compare(__lhs) != 0; }
219200db7afdSDavid E. O'Brien 
2193ffeaf689SAlexander Kabaev   /**
2194ffeaf689SAlexander Kabaev    *  @brief  Test difference of C string and string.
2195ffeaf689SAlexander Kabaev    *  @param lhs  C string.
2196ffeaf689SAlexander Kabaev    *  @param rhs  String.
2197ffeaf689SAlexander Kabaev    *  @return  True if @a rhs.compare(@a lhs) != 0.  False otherwise.
2198ffeaf689SAlexander Kabaev    */
219900db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
220000db7afdSDavid E. O'Brien     inline bool
220100db7afdSDavid E. O'Brien     operator!=(const _CharT* __lhs,
220200db7afdSDavid E. O'Brien 	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
220300db7afdSDavid E. O'Brien     { return __rhs.compare(__lhs) != 0; }
220400db7afdSDavid E. O'Brien 
2205ffeaf689SAlexander Kabaev   /**
2206ffeaf689SAlexander Kabaev    *  @brief  Test difference of string and C string.
2207ffeaf689SAlexander Kabaev    *  @param lhs  String.
2208ffeaf689SAlexander Kabaev    *  @param rhs  C string.
2209ffeaf689SAlexander Kabaev    *  @return  True if @a lhs.compare(@a rhs) != 0.  False otherwise.
2210ffeaf689SAlexander Kabaev    */
221100db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
221200db7afdSDavid E. O'Brien     inline bool
221300db7afdSDavid E. O'Brien     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
221400db7afdSDavid E. O'Brien 	       const _CharT* __rhs)
221500db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) != 0; }
221600db7afdSDavid E. O'Brien 
221700db7afdSDavid E. O'Brien   // operator <
2218ffeaf689SAlexander Kabaev   /**
2219ffeaf689SAlexander Kabaev    *  @brief  Test if string precedes string.
2220ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2221ffeaf689SAlexander Kabaev    *  @param rhs  Second string.
2222ffeaf689SAlexander Kabaev    *  @return  True if @a lhs precedes @a rhs.  False otherwise.
2223ffeaf689SAlexander Kabaev    */
222400db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
222500db7afdSDavid E. O'Brien     inline bool
222600db7afdSDavid E. O'Brien     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
222700db7afdSDavid E. O'Brien 	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
222800db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) < 0; }
222900db7afdSDavid E. O'Brien 
2230ffeaf689SAlexander Kabaev   /**
2231ffeaf689SAlexander Kabaev    *  @brief  Test if string precedes C string.
2232ffeaf689SAlexander Kabaev    *  @param lhs  String.
2233ffeaf689SAlexander Kabaev    *  @param rhs  C string.
2234ffeaf689SAlexander Kabaev    *  @return  True if @a lhs precedes @a rhs.  False otherwise.
2235ffeaf689SAlexander Kabaev    */
223600db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
223700db7afdSDavid E. O'Brien     inline bool
223800db7afdSDavid E. O'Brien     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
223900db7afdSDavid E. O'Brien 	      const _CharT* __rhs)
224000db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) < 0; }
224100db7afdSDavid E. O'Brien 
2242ffeaf689SAlexander Kabaev   /**
2243ffeaf689SAlexander Kabaev    *  @brief  Test if C string precedes string.
2244ffeaf689SAlexander Kabaev    *  @param lhs  C string.
2245ffeaf689SAlexander Kabaev    *  @param rhs  String.
2246ffeaf689SAlexander Kabaev    *  @return  True if @a lhs precedes @a rhs.  False otherwise.
2247ffeaf689SAlexander Kabaev    */
224800db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
224900db7afdSDavid E. O'Brien     inline bool
225000db7afdSDavid E. O'Brien     operator<(const _CharT* __lhs,
225100db7afdSDavid E. O'Brien 	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
225200db7afdSDavid E. O'Brien     { return __rhs.compare(__lhs) > 0; }
225300db7afdSDavid E. O'Brien 
225400db7afdSDavid E. O'Brien   // operator >
2255ffeaf689SAlexander Kabaev   /**
2256ffeaf689SAlexander Kabaev    *  @brief  Test if string follows string.
2257ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2258ffeaf689SAlexander Kabaev    *  @param rhs  Second string.
2259ffeaf689SAlexander Kabaev    *  @return  True if @a lhs follows @a rhs.  False otherwise.
2260ffeaf689SAlexander Kabaev    */
226100db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
226200db7afdSDavid E. O'Brien     inline bool
226300db7afdSDavid E. O'Brien     operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
226400db7afdSDavid E. O'Brien 	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
226500db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) > 0; }
226600db7afdSDavid E. O'Brien 
2267ffeaf689SAlexander Kabaev   /**
2268ffeaf689SAlexander Kabaev    *  @brief  Test if string follows C string.
2269ffeaf689SAlexander Kabaev    *  @param lhs  String.
2270ffeaf689SAlexander Kabaev    *  @param rhs  C string.
2271ffeaf689SAlexander Kabaev    *  @return  True if @a lhs follows @a rhs.  False otherwise.
2272ffeaf689SAlexander Kabaev    */
227300db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
227400db7afdSDavid E. O'Brien     inline bool
227500db7afdSDavid E. O'Brien     operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
227600db7afdSDavid E. O'Brien 	      const _CharT* __rhs)
227700db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) > 0; }
227800db7afdSDavid E. O'Brien 
2279ffeaf689SAlexander Kabaev   /**
2280ffeaf689SAlexander Kabaev    *  @brief  Test if C string follows string.
2281ffeaf689SAlexander Kabaev    *  @param lhs  C string.
2282ffeaf689SAlexander Kabaev    *  @param rhs  String.
2283ffeaf689SAlexander Kabaev    *  @return  True if @a lhs follows @a rhs.  False otherwise.
2284ffeaf689SAlexander Kabaev    */
228500db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
228600db7afdSDavid E. O'Brien     inline bool
228700db7afdSDavid E. O'Brien     operator>(const _CharT* __lhs,
228800db7afdSDavid E. O'Brien 	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
228900db7afdSDavid E. O'Brien     { return __rhs.compare(__lhs) < 0; }
229000db7afdSDavid E. O'Brien 
229100db7afdSDavid E. O'Brien   // operator <=
2292ffeaf689SAlexander Kabaev   /**
2293ffeaf689SAlexander Kabaev    *  @brief  Test if string doesn't follow string.
2294ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2295ffeaf689SAlexander Kabaev    *  @param rhs  Second string.
2296ffeaf689SAlexander Kabaev    *  @return  True if @a lhs doesn't follow @a rhs.  False otherwise.
2297ffeaf689SAlexander Kabaev    */
229800db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
229900db7afdSDavid E. O'Brien     inline bool
230000db7afdSDavid E. O'Brien     operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
230100db7afdSDavid E. O'Brien 	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
230200db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) <= 0; }
230300db7afdSDavid E. O'Brien 
2304ffeaf689SAlexander Kabaev   /**
2305ffeaf689SAlexander Kabaev    *  @brief  Test if string doesn't follow C string.
2306ffeaf689SAlexander Kabaev    *  @param lhs  String.
2307ffeaf689SAlexander Kabaev    *  @param rhs  C string.
2308ffeaf689SAlexander Kabaev    *  @return  True if @a lhs doesn't follow @a rhs.  False otherwise.
2309ffeaf689SAlexander Kabaev    */
231000db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
231100db7afdSDavid E. O'Brien     inline bool
231200db7afdSDavid E. O'Brien     operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
231300db7afdSDavid E. O'Brien 	       const _CharT* __rhs)
231400db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) <= 0; }
231500db7afdSDavid E. O'Brien 
2316ffeaf689SAlexander Kabaev   /**
2317ffeaf689SAlexander Kabaev    *  @brief  Test if C string doesn't follow string.
2318ffeaf689SAlexander Kabaev    *  @param lhs  C string.
2319ffeaf689SAlexander Kabaev    *  @param rhs  String.
2320ffeaf689SAlexander Kabaev    *  @return  True if @a lhs doesn't follow @a rhs.  False otherwise.
2321ffeaf689SAlexander Kabaev    */
232200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
232300db7afdSDavid E. O'Brien     inline bool
232400db7afdSDavid E. O'Brien     operator<=(const _CharT* __lhs,
232500db7afdSDavid E. O'Brien 	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
232600db7afdSDavid E. O'Brien     { return __rhs.compare(__lhs) >= 0; }
232700db7afdSDavid E. O'Brien 
232800db7afdSDavid E. O'Brien   // operator >=
2329ffeaf689SAlexander Kabaev   /**
2330ffeaf689SAlexander Kabaev    *  @brief  Test if string doesn't precede string.
2331ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2332ffeaf689SAlexander Kabaev    *  @param rhs  Second string.
2333ffeaf689SAlexander Kabaev    *  @return  True if @a lhs doesn't precede @a rhs.  False otherwise.
2334ffeaf689SAlexander Kabaev    */
233500db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
233600db7afdSDavid E. O'Brien     inline bool
233700db7afdSDavid E. O'Brien     operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
233800db7afdSDavid E. O'Brien 	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
233900db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) >= 0; }
234000db7afdSDavid E. O'Brien 
2341ffeaf689SAlexander Kabaev   /**
2342ffeaf689SAlexander Kabaev    *  @brief  Test if string doesn't precede C string.
2343ffeaf689SAlexander Kabaev    *  @param lhs  String.
2344ffeaf689SAlexander Kabaev    *  @param rhs  C string.
2345ffeaf689SAlexander Kabaev    *  @return  True if @a lhs doesn't precede @a rhs.  False otherwise.
2346ffeaf689SAlexander Kabaev    */
234700db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
234800db7afdSDavid E. O'Brien     inline bool
234900db7afdSDavid E. O'Brien     operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
235000db7afdSDavid E. O'Brien 	       const _CharT* __rhs)
235100db7afdSDavid E. O'Brien     { return __lhs.compare(__rhs) >= 0; }
235200db7afdSDavid E. O'Brien 
2353ffeaf689SAlexander Kabaev   /**
2354ffeaf689SAlexander Kabaev    *  @brief  Test if C string doesn't precede string.
2355ffeaf689SAlexander Kabaev    *  @param lhs  C string.
2356ffeaf689SAlexander Kabaev    *  @param rhs  String.
2357ffeaf689SAlexander Kabaev    *  @return  True if @a lhs doesn't precede @a rhs.  False otherwise.
2358ffeaf689SAlexander Kabaev    */
235900db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
236000db7afdSDavid E. O'Brien     inline bool
236100db7afdSDavid E. O'Brien     operator>=(const _CharT* __lhs,
236200db7afdSDavid E. O'Brien 	     const basic_string<_CharT, _Traits, _Alloc>& __rhs)
236300db7afdSDavid E. O'Brien     { return __rhs.compare(__lhs) <= 0; }
236400db7afdSDavid E. O'Brien 
2365ffeaf689SAlexander Kabaev   /**
2366ffeaf689SAlexander Kabaev    *  @brief  Swap contents of two strings.
2367ffeaf689SAlexander Kabaev    *  @param lhs  First string.
2368ffeaf689SAlexander Kabaev    *  @param rhs  Second string.
2369ffeaf689SAlexander Kabaev    *
2370ffeaf689SAlexander Kabaev    *  Exchanges the contents of @a lhs and @a rhs in constant time.
2371ffeaf689SAlexander Kabaev    */
237200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
237300db7afdSDavid E. O'Brien     inline void
swap(basic_string<_CharT,_Traits,_Alloc> & __lhs,basic_string<_CharT,_Traits,_Alloc> & __rhs)237400db7afdSDavid E. O'Brien     swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
237500db7afdSDavid E. O'Brien 	 basic_string<_CharT, _Traits, _Alloc>& __rhs)
237600db7afdSDavid E. O'Brien     { __lhs.swap(__rhs); }
237700db7afdSDavid E. O'Brien 
2378ffeaf689SAlexander Kabaev   /**
2379ffeaf689SAlexander Kabaev    *  @brief  Read stream into a string.
2380ffeaf689SAlexander Kabaev    *  @param is  Input stream.
2381ffeaf689SAlexander Kabaev    *  @param str  Buffer to store into.
2382ffeaf689SAlexander Kabaev    *  @return  Reference to the input stream.
2383ffeaf689SAlexander Kabaev    *
2384ffeaf689SAlexander Kabaev    *  Stores characters from @a is into @a str until whitespace is found, the
2385ffeaf689SAlexander Kabaev    *  end of the stream is encountered, or str.max_size() is reached.  If
2386ffeaf689SAlexander Kabaev    *  is.width() is non-zero, that is the limit on the number of characters
2387ffeaf689SAlexander Kabaev    *  stored into @a str.  Any previous contents of @a str are erased.
2388ffeaf689SAlexander Kabaev    */
238900db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
239000db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
239100db7afdSDavid E. O'Brien     operator>>(basic_istream<_CharT, _Traits>& __is,
239200db7afdSDavid E. O'Brien 	       basic_string<_CharT, _Traits, _Alloc>& __str);
239300db7afdSDavid E. O'Brien 
2394f8a1b7d9SAlexander Kabaev   template<>
2395f8a1b7d9SAlexander Kabaev     basic_istream<char>&
2396f8a1b7d9SAlexander Kabaev     operator>>(basic_istream<char>& __is, basic_string<char>& __str);
2397f8a1b7d9SAlexander Kabaev 
2398ffeaf689SAlexander Kabaev   /**
2399ffeaf689SAlexander Kabaev    *  @brief  Write string to a stream.
2400ffeaf689SAlexander Kabaev    *  @param os  Output stream.
2401ffeaf689SAlexander Kabaev    *  @param str  String to write out.
2402ffeaf689SAlexander Kabaev    *  @return  Reference to the output stream.
2403ffeaf689SAlexander Kabaev    *
2404ffeaf689SAlexander Kabaev    *  Output characters of @a str into os following the same rules as for
2405ffeaf689SAlexander Kabaev    *  writing a C string.
2406ffeaf689SAlexander Kabaev    */
240700db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
2408f8a1b7d9SAlexander Kabaev     inline basic_ostream<_CharT, _Traits>&
240900db7afdSDavid E. O'Brien     operator<<(basic_ostream<_CharT, _Traits>& __os,
2410f8a1b7d9SAlexander Kabaev 	       const basic_string<_CharT, _Traits, _Alloc>& __str)
2411f8a1b7d9SAlexander Kabaev     {
2412f8a1b7d9SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
2413f8a1b7d9SAlexander Kabaev       // 586. string inserter not a formatted function
2414f8a1b7d9SAlexander Kabaev       return __ostream_insert(__os, __str.data(), __str.size());
2415f8a1b7d9SAlexander Kabaev     }
241600db7afdSDavid E. O'Brien 
2417ffeaf689SAlexander Kabaev   /**
2418ffeaf689SAlexander Kabaev    *  @brief  Read a line from stream into a string.
2419ffeaf689SAlexander Kabaev    *  @param is  Input stream.
2420ffeaf689SAlexander Kabaev    *  @param str  Buffer to store into.
2421ffeaf689SAlexander Kabaev    *  @param delim  Character marking end of line.
2422ffeaf689SAlexander Kabaev    *  @return  Reference to the input stream.
2423ffeaf689SAlexander Kabaev    *
2424ffeaf689SAlexander Kabaev    *  Stores characters from @a is into @a str until @a delim is found, the
2425ffeaf689SAlexander Kabaev    *  end of the stream is encountered, or str.max_size() is reached.  If
2426ffeaf689SAlexander Kabaev    *  is.width() is non-zero, that is the limit on the number of characters
2427ffeaf689SAlexander Kabaev    *  stored into @a str.  Any previous contents of @a str are erased.  If @a
2428ffeaf689SAlexander Kabaev    *  delim was encountered, it is extracted but not stored into @a str.
2429ffeaf689SAlexander Kabaev    */
243000db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
243100db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
243200db7afdSDavid E. O'Brien     getline(basic_istream<_CharT, _Traits>& __is,
243300db7afdSDavid E. O'Brien 	    basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
243400db7afdSDavid E. O'Brien 
2435ffeaf689SAlexander Kabaev   /**
2436ffeaf689SAlexander Kabaev    *  @brief  Read a line from stream into a string.
2437ffeaf689SAlexander Kabaev    *  @param is  Input stream.
2438ffeaf689SAlexander Kabaev    *  @param str  Buffer to store into.
2439ffeaf689SAlexander Kabaev    *  @return  Reference to the input stream.
2440ffeaf689SAlexander Kabaev    *
2441ffeaf689SAlexander Kabaev    *  Stores characters from is into @a str until '\n' is found, the end of
2442ffeaf689SAlexander Kabaev    *  the stream is encountered, or str.max_size() is reached.  If is.width()
2443ffeaf689SAlexander Kabaev    *  is non-zero, that is the limit on the number of characters stored into
2444ffeaf689SAlexander Kabaev    *  @a str.  Any previous contents of @a str are erased.  If end of line was
2445ffeaf689SAlexander Kabaev    *  encountered, it is extracted but not stored into @a str.
2446ffeaf689SAlexander Kabaev    */
244700db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
244800db7afdSDavid E. O'Brien     inline basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT,_Traits> & __is,basic_string<_CharT,_Traits,_Alloc> & __str)244900db7afdSDavid E. O'Brien     getline(basic_istream<_CharT, _Traits>& __is,
2450f8a1b7d9SAlexander Kabaev 	    basic_string<_CharT, _Traits, _Alloc>& __str)
2451f8a1b7d9SAlexander Kabaev     { return getline(__is, __str, __is.widen('\n')); }
2452f8a1b7d9SAlexander Kabaev 
2453f8a1b7d9SAlexander Kabaev   template<>
2454f8a1b7d9SAlexander Kabaev     basic_istream<char>&
2455f8a1b7d9SAlexander Kabaev     getline(basic_istream<char>& __in, basic_string<char>& __str,
2456f8a1b7d9SAlexander Kabaev 	    char __delim);
2457f8a1b7d9SAlexander Kabaev 
2458f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
2459f8a1b7d9SAlexander Kabaev   template<>
2460f8a1b7d9SAlexander Kabaev     basic_istream<wchar_t>&
2461f8a1b7d9SAlexander Kabaev     getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
2462f8a1b7d9SAlexander Kabaev 	    wchar_t __delim);
2463f8a1b7d9SAlexander Kabaev #endif
2464f8a1b7d9SAlexander Kabaev 
2465f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
246600db7afdSDavid E. O'Brien 
2467ffeaf689SAlexander Kabaev #endif /* _BASIC_STRING_H */
2468