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