138fd1498Szrj // Versatile string -*- C++ -*-
238fd1498Szrj
338fd1498Szrj // Copyright (C) 2005-2018 Free Software Foundation, Inc.
438fd1498Szrj //
538fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free
638fd1498Szrj // software; you can redistribute it and/or modify it under the
738fd1498Szrj // terms of the GNU General Public License as published by the
838fd1498Szrj // Free Software Foundation; either version 3, or (at your option)
938fd1498Szrj // any later version.
1038fd1498Szrj
1138fd1498Szrj // This library is distributed in the hope that it will be useful,
1238fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of
1338fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1438fd1498Szrj // GNU General Public License for more details.
1538fd1498Szrj
1638fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional
1738fd1498Szrj // permissions described in the GCC Runtime Library Exception, version
1838fd1498Szrj // 3.1, as published by the Free Software Foundation.
1938fd1498Szrj
2038fd1498Szrj // You should have received a copy of the GNU General Public License and
2138fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program;
2238fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
2338fd1498Szrj // <http://www.gnu.org/licenses/>.
2438fd1498Szrj
2538fd1498Szrj /** @file ext/vstring.h
2638fd1498Szrj * This file is a GNU extension to the Standard C++ Library.
2738fd1498Szrj */
2838fd1498Szrj
2938fd1498Szrj #ifndef _VSTRING_H
3038fd1498Szrj #define _VSTRING_H 1
3138fd1498Szrj
3238fd1498Szrj #pragma GCC system_header
3338fd1498Szrj
3438fd1498Szrj #if __cplusplus >= 201103L
3538fd1498Szrj #include <initializer_list>
3638fd1498Szrj #endif
3738fd1498Szrj
3838fd1498Szrj #include <ext/vstring_util.h>
3938fd1498Szrj #include <ext/rc_string_base.h>
4038fd1498Szrj #include <ext/sso_string_base.h>
4138fd1498Szrj
_GLIBCXX_VISIBILITY(default)4238fd1498Szrj namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
4338fd1498Szrj {
4438fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
4538fd1498Szrj
4638fd1498Szrj /**
4738fd1498Szrj * @class __versa_string vstring.h
4838fd1498Szrj * @brief Template class __versa_string.
4938fd1498Szrj * @ingroup extensions
5038fd1498Szrj *
5138fd1498Szrj * Data structure managing sequences of characters and
5238fd1498Szrj * character-like objects.
5338fd1498Szrj */
5438fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
5538fd1498Szrj template <typename, typename, typename> class _Base>
5638fd1498Szrj class __versa_string
5738fd1498Szrj : private _Base<_CharT, _Traits, _Alloc>
5838fd1498Szrj {
5938fd1498Szrj typedef _Base<_CharT, _Traits, _Alloc> __vstring_base;
6038fd1498Szrj typedef typename __vstring_base::_CharT_alloc_type _CharT_alloc_type;
6138fd1498Szrj
6238fd1498Szrj // Types:
6338fd1498Szrj public:
6438fd1498Szrj typedef _Traits traits_type;
6538fd1498Szrj typedef typename _Traits::char_type value_type;
6638fd1498Szrj typedef _Alloc allocator_type;
6738fd1498Szrj typedef typename _CharT_alloc_type::size_type size_type;
6838fd1498Szrj typedef typename _CharT_alloc_type::difference_type difference_type;
6938fd1498Szrj typedef value_type& reference;
7038fd1498Szrj typedef const value_type& const_reference;
7138fd1498Szrj typedef typename _CharT_alloc_type::pointer pointer;
7238fd1498Szrj typedef typename _CharT_alloc_type::const_pointer const_pointer;
7338fd1498Szrj typedef __gnu_cxx::__normal_iterator<pointer, __versa_string> iterator;
7438fd1498Szrj typedef __gnu_cxx::__normal_iterator<const_pointer, __versa_string>
7538fd1498Szrj const_iterator;
7638fd1498Szrj typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
7738fd1498Szrj typedef std::reverse_iterator<iterator> reverse_iterator;
7838fd1498Szrj
7938fd1498Szrj // Data Member (public):
8038fd1498Szrj /// Value returned by various member functions when they fail.
8138fd1498Szrj static const size_type npos = static_cast<size_type>(-1);
8238fd1498Szrj
8338fd1498Szrj private:
8438fd1498Szrj size_type
8538fd1498Szrj _M_check(size_type __pos, const char* __s) const
8638fd1498Szrj {
8738fd1498Szrj if (__pos > this->size())
8838fd1498Szrj std::__throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > "
8938fd1498Szrj "this->size() (which is %zu)"),
9038fd1498Szrj __s, __pos, this->size());
9138fd1498Szrj return __pos;
9238fd1498Szrj }
9338fd1498Szrj
9438fd1498Szrj void
9538fd1498Szrj _M_check_length(size_type __n1, size_type __n2, const char* __s) const
9638fd1498Szrj {
9738fd1498Szrj if (this->max_size() - (this->size() - __n1) < __n2)
9838fd1498Szrj std::__throw_length_error(__N(__s));
9938fd1498Szrj }
10038fd1498Szrj
10138fd1498Szrj // NB: _M_limit doesn't check for a bad __pos value.
10238fd1498Szrj size_type
10338fd1498Szrj _M_limit(size_type __pos, size_type __off) const _GLIBCXX_NOEXCEPT
10438fd1498Szrj {
10538fd1498Szrj const bool __testoff = __off < this->size() - __pos;
10638fd1498Szrj return __testoff ? __off : this->size() - __pos;
10738fd1498Szrj }
10838fd1498Szrj
10938fd1498Szrj // True if _Rep and source do not overlap.
11038fd1498Szrj bool
11138fd1498Szrj _M_disjunct(const _CharT* __s) const _GLIBCXX_NOEXCEPT
11238fd1498Szrj {
11338fd1498Szrj return (std::less<const _CharT*>()(__s, this->_M_data())
11438fd1498Szrj || std::less<const _CharT*>()(this->_M_data()
11538fd1498Szrj + this->size(), __s));
11638fd1498Szrj }
11738fd1498Szrj
11838fd1498Szrj // For the internal use we have functions similar to `begin'/`end'
11938fd1498Szrj // but they do not call _M_leak.
12038fd1498Szrj iterator
12138fd1498Szrj _M_ibegin() const _GLIBCXX_NOEXCEPT
12238fd1498Szrj { return iterator(this->_M_data()); }
12338fd1498Szrj
12438fd1498Szrj iterator
12538fd1498Szrj _M_iend() const _GLIBCXX_NOEXCEPT
12638fd1498Szrj { return iterator(this->_M_data() + this->_M_length()); }
12738fd1498Szrj
12838fd1498Szrj public:
12938fd1498Szrj // Construct/copy/destroy:
13038fd1498Szrj // NB: We overload ctors in some cases instead of using default
13138fd1498Szrj // arguments, per 17.4.4.4 para. 2 item 2.
13238fd1498Szrj
13338fd1498Szrj /**
13438fd1498Szrj * @brief Construct an empty string using allocator @a a.
13538fd1498Szrj */
13638fd1498Szrj explicit
13738fd1498Szrj __versa_string(const _Alloc& __a = _Alloc()) _GLIBCXX_NOEXCEPT
13838fd1498Szrj : __vstring_base(__a) { }
13938fd1498Szrj
14038fd1498Szrj // NB: per LWG issue 42, semantics different from IS:
14138fd1498Szrj /**
14238fd1498Szrj * @brief Construct string with copy of value of @a __str.
14338fd1498Szrj * @param __str Source string.
14438fd1498Szrj */
14538fd1498Szrj __versa_string(const __versa_string& __str)
14638fd1498Szrj : __vstring_base(__str) { }
14738fd1498Szrj
14838fd1498Szrj #if __cplusplus >= 201103L
14938fd1498Szrj /**
15038fd1498Szrj * @brief String move constructor.
15138fd1498Szrj * @param __str Source string.
15238fd1498Szrj *
15338fd1498Szrj * The newly-constructed %string contains the exact contents of
15438fd1498Szrj * @a __str. The contents of @a __str are a valid, but unspecified
15538fd1498Szrj * string.
15638fd1498Szrj */
15738fd1498Szrj __versa_string(__versa_string&& __str) noexcept
15838fd1498Szrj : __vstring_base(std::move(__str)) { }
15938fd1498Szrj
16038fd1498Szrj /**
16138fd1498Szrj * @brief Construct string from an initializer list.
16238fd1498Szrj * @param __l std::initializer_list of characters.
16338fd1498Szrj * @param __a Allocator to use (default is default allocator).
16438fd1498Szrj */
16538fd1498Szrj __versa_string(std::initializer_list<_CharT> __l,
16638fd1498Szrj const _Alloc& __a = _Alloc())
16738fd1498Szrj : __vstring_base(__l.begin(), __l.end(), __a) { }
16838fd1498Szrj #endif
16938fd1498Szrj
17038fd1498Szrj /**
17138fd1498Szrj * @brief Construct string as copy of a substring.
17238fd1498Szrj * @param __str Source string.
17338fd1498Szrj * @param __pos Index of first character to copy from.
17438fd1498Szrj * @param __n Number of characters to copy (default remainder).
17538fd1498Szrj */
17638fd1498Szrj __versa_string(const __versa_string& __str, size_type __pos,
17738fd1498Szrj size_type __n = npos)
17838fd1498Szrj : __vstring_base(__str._M_data()
17938fd1498Szrj + __str._M_check(__pos,
18038fd1498Szrj "__versa_string::__versa_string"),
18138fd1498Szrj __str._M_data() + __str._M_limit(__pos, __n)
18238fd1498Szrj + __pos, _Alloc()) { }
18338fd1498Szrj
18438fd1498Szrj /**
18538fd1498Szrj * @brief Construct string as copy of a substring.
18638fd1498Szrj * @param __str Source string.
18738fd1498Szrj * @param __pos Index of first character to copy from.
18838fd1498Szrj * @param __n Number of characters to copy.
18938fd1498Szrj * @param __a Allocator to use.
19038fd1498Szrj */
19138fd1498Szrj __versa_string(const __versa_string& __str, size_type __pos,
19238fd1498Szrj size_type __n, const _Alloc& __a)
19338fd1498Szrj : __vstring_base(__str._M_data()
19438fd1498Szrj + __str._M_check(__pos,
19538fd1498Szrj "__versa_string::__versa_string"),
19638fd1498Szrj __str._M_data() + __str._M_limit(__pos, __n)
19738fd1498Szrj + __pos, __a) { }
19838fd1498Szrj
19938fd1498Szrj /**
20038fd1498Szrj * @brief Construct string initialized by a character array.
20138fd1498Szrj * @param __s Source character array.
20238fd1498Szrj * @param __n Number of characters to copy.
20338fd1498Szrj * @param __a Allocator to use (default is default allocator).
20438fd1498Szrj *
20538fd1498Szrj * NB: @a __s must have at least @a __n characters, '\\0' has no special
20638fd1498Szrj * meaning.
20738fd1498Szrj */
20838fd1498Szrj __versa_string(const _CharT* __s, size_type __n,
20938fd1498Szrj const _Alloc& __a = _Alloc())
21038fd1498Szrj : __vstring_base(__s, __s + __n, __a) { }
21138fd1498Szrj
21238fd1498Szrj /**
21338fd1498Szrj * @brief Construct string as copy of a C string.
21438fd1498Szrj * @param __s Source C string.
21538fd1498Szrj * @param __a Allocator to use (default is default allocator).
21638fd1498Szrj */
21738fd1498Szrj __versa_string(const _CharT* __s, const _Alloc& __a = _Alloc())
21838fd1498Szrj : __vstring_base(__s, __s ? __s + traits_type::length(__s) :
21938fd1498Szrj __s + npos, __a) { }
22038fd1498Szrj
22138fd1498Szrj /**
22238fd1498Szrj * @brief Construct string as multiple characters.
22338fd1498Szrj * @param __n Number of characters.
22438fd1498Szrj * @param __c Character to use.
22538fd1498Szrj * @param __a Allocator to use (default is default allocator).
22638fd1498Szrj */
22738fd1498Szrj __versa_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
22838fd1498Szrj : __vstring_base(__n, __c, __a) { }
22938fd1498Szrj
23038fd1498Szrj /**
23138fd1498Szrj * @brief Construct string as copy of a range.
23238fd1498Szrj * @param __beg Start of range.
23338fd1498Szrj * @param __end End of range.
23438fd1498Szrj * @param __a Allocator to use (default is default allocator).
23538fd1498Szrj */
23638fd1498Szrj #if __cplusplus >= 201103L
23738fd1498Szrj template<class _InputIterator,
23838fd1498Szrj typename = std::_RequireInputIter<_InputIterator>>
23938fd1498Szrj #else
24038fd1498Szrj template<class _InputIterator>
24138fd1498Szrj #endif
24238fd1498Szrj __versa_string(_InputIterator __beg, _InputIterator __end,
24338fd1498Szrj const _Alloc& __a = _Alloc())
24438fd1498Szrj : __vstring_base(__beg, __end, __a) { }
24538fd1498Szrj
24638fd1498Szrj /**
24738fd1498Szrj * @brief Destroy the string instance.
24838fd1498Szrj */
24938fd1498Szrj ~__versa_string() _GLIBCXX_NOEXCEPT { }
25038fd1498Szrj
25138fd1498Szrj /**
25238fd1498Szrj * @brief Assign the value of @a str to this string.
25338fd1498Szrj * @param __str Source string.
25438fd1498Szrj */
25538fd1498Szrj __versa_string&
25638fd1498Szrj operator=(const __versa_string& __str)
25738fd1498Szrj { return this->assign(__str); }
25838fd1498Szrj
25938fd1498Szrj #if __cplusplus >= 201103L
26038fd1498Szrj /**
26138fd1498Szrj * @brief String move assignment operator.
26238fd1498Szrj * @param __str Source string.
26338fd1498Szrj *
26438fd1498Szrj * The contents of @a __str are moved into this string (without
26538fd1498Szrj * copying). @a __str is a valid, but unspecified string.
26638fd1498Szrj */
26738fd1498Szrj __versa_string&
26838fd1498Szrj operator=(__versa_string&& __str) noexcept
26938fd1498Szrj {
27038fd1498Szrj // NB: DR 1204.
27138fd1498Szrj this->swap(__str);
27238fd1498Szrj return *this;
27338fd1498Szrj }
27438fd1498Szrj
27538fd1498Szrj /**
27638fd1498Szrj * @brief Set value to string constructed from initializer list.
27738fd1498Szrj * @param __l std::initializer_list.
27838fd1498Szrj */
27938fd1498Szrj __versa_string&
28038fd1498Szrj operator=(std::initializer_list<_CharT> __l)
28138fd1498Szrj {
28238fd1498Szrj this->assign(__l.begin(), __l.end());
28338fd1498Szrj return *this;
28438fd1498Szrj }
28538fd1498Szrj #endif
28638fd1498Szrj
28738fd1498Szrj /**
28838fd1498Szrj * @brief Copy contents of @a __s into this string.
28938fd1498Szrj * @param __s Source null-terminated string.
29038fd1498Szrj */
29138fd1498Szrj __versa_string&
29238fd1498Szrj operator=(const _CharT* __s)
29338fd1498Szrj { return this->assign(__s); }
29438fd1498Szrj
29538fd1498Szrj /**
29638fd1498Szrj * @brief Set value to string of length 1.
29738fd1498Szrj * @param __c Source character.
29838fd1498Szrj *
29938fd1498Szrj * Assigning to a character makes this string length 1 and
30038fd1498Szrj * (*this)[0] == @a __c.
30138fd1498Szrj */
30238fd1498Szrj __versa_string&
30338fd1498Szrj operator=(_CharT __c)
30438fd1498Szrj {
30538fd1498Szrj this->assign(1, __c);
30638fd1498Szrj return *this;
30738fd1498Szrj }
30838fd1498Szrj
30938fd1498Szrj // Iterators:
31038fd1498Szrj /**
31138fd1498Szrj * Returns a read/write iterator that points to the first character in
31238fd1498Szrj * the %string. Unshares the string.
31338fd1498Szrj */
31438fd1498Szrj iterator
31538fd1498Szrj begin() _GLIBCXX_NOEXCEPT
31638fd1498Szrj {
31738fd1498Szrj this->_M_leak();
31838fd1498Szrj return iterator(this->_M_data());
31938fd1498Szrj }
32038fd1498Szrj
32138fd1498Szrj /**
32238fd1498Szrj * Returns a read-only (constant) iterator that points to the first
32338fd1498Szrj * character in the %string.
32438fd1498Szrj */
32538fd1498Szrj const_iterator
32638fd1498Szrj begin() const _GLIBCXX_NOEXCEPT
32738fd1498Szrj { return const_iterator(this->_M_data()); }
32838fd1498Szrj
32938fd1498Szrj /**
33038fd1498Szrj * Returns a read/write iterator that points one past the last
33138fd1498Szrj * character in the %string. Unshares the string.
33238fd1498Szrj */
33338fd1498Szrj iterator
33438fd1498Szrj end() _GLIBCXX_NOEXCEPT
33538fd1498Szrj {
33638fd1498Szrj this->_M_leak();
33738fd1498Szrj return iterator(this->_M_data() + this->size());
33838fd1498Szrj }
33938fd1498Szrj
34038fd1498Szrj /**
34138fd1498Szrj * Returns a read-only (constant) iterator that points one past the
34238fd1498Szrj * last character in the %string.
34338fd1498Szrj */
34438fd1498Szrj const_iterator
34538fd1498Szrj end() const _GLIBCXX_NOEXCEPT
34638fd1498Szrj { return const_iterator(this->_M_data() + this->size()); }
34738fd1498Szrj
34838fd1498Szrj /**
34938fd1498Szrj * Returns a read/write reverse iterator that points to the last
35038fd1498Szrj * character in the %string. Iteration is done in reverse element
35138fd1498Szrj * order. Unshares the string.
35238fd1498Szrj */
35338fd1498Szrj reverse_iterator
35438fd1498Szrj rbegin() _GLIBCXX_NOEXCEPT
35538fd1498Szrj { return reverse_iterator(this->end()); }
35638fd1498Szrj
35738fd1498Szrj /**
35838fd1498Szrj * Returns a read-only (constant) reverse iterator that points
35938fd1498Szrj * to the last character in the %string. Iteration is done in
36038fd1498Szrj * reverse element order.
36138fd1498Szrj */
36238fd1498Szrj const_reverse_iterator
36338fd1498Szrj rbegin() const _GLIBCXX_NOEXCEPT
36438fd1498Szrj { return const_reverse_iterator(this->end()); }
36538fd1498Szrj
36638fd1498Szrj /**
36738fd1498Szrj * Returns a read/write reverse iterator that points to one before the
36838fd1498Szrj * first character in the %string. Iteration is done in reverse
36938fd1498Szrj * element order. Unshares the string.
37038fd1498Szrj */
37138fd1498Szrj reverse_iterator
37238fd1498Szrj rend() _GLIBCXX_NOEXCEPT
37338fd1498Szrj { return reverse_iterator(this->begin()); }
37438fd1498Szrj
37538fd1498Szrj /**
37638fd1498Szrj * Returns a read-only (constant) reverse iterator that points
37738fd1498Szrj * to one before the first character in the %string. Iteration
37838fd1498Szrj * is done in reverse element order.
37938fd1498Szrj */
38038fd1498Szrj const_reverse_iterator
38138fd1498Szrj rend() const _GLIBCXX_NOEXCEPT
38238fd1498Szrj { return const_reverse_iterator(this->begin()); }
38338fd1498Szrj
38438fd1498Szrj #if __cplusplus >= 201103L
38538fd1498Szrj /**
38638fd1498Szrj * Returns a read-only (constant) iterator that points to the first
38738fd1498Szrj * character in the %string.
38838fd1498Szrj */
38938fd1498Szrj const_iterator
39038fd1498Szrj cbegin() const noexcept
39138fd1498Szrj { return const_iterator(this->_M_data()); }
39238fd1498Szrj
39338fd1498Szrj /**
39438fd1498Szrj * Returns a read-only (constant) iterator that points one past the
39538fd1498Szrj * last character in the %string.
39638fd1498Szrj */
39738fd1498Szrj const_iterator
39838fd1498Szrj cend() const noexcept
39938fd1498Szrj { return const_iterator(this->_M_data() + this->size()); }
40038fd1498Szrj
40138fd1498Szrj /**
40238fd1498Szrj * Returns a read-only (constant) reverse iterator that points
40338fd1498Szrj * to the last character in the %string. Iteration is done in
40438fd1498Szrj * reverse element order.
40538fd1498Szrj */
40638fd1498Szrj const_reverse_iterator
40738fd1498Szrj crbegin() const noexcept
40838fd1498Szrj { return const_reverse_iterator(this->end()); }
40938fd1498Szrj
41038fd1498Szrj /**
41138fd1498Szrj * Returns a read-only (constant) reverse iterator that points
41238fd1498Szrj * to one before the first character in the %string. Iteration
41338fd1498Szrj * is done in reverse element order.
41438fd1498Szrj */
41538fd1498Szrj const_reverse_iterator
41638fd1498Szrj crend() const noexcept
41738fd1498Szrj { return const_reverse_iterator(this->begin()); }
41838fd1498Szrj #endif
41938fd1498Szrj
42038fd1498Szrj public:
42138fd1498Szrj // Capacity:
42238fd1498Szrj /// Returns the number of characters in the string, not including any
42338fd1498Szrj /// null-termination.
42438fd1498Szrj size_type
42538fd1498Szrj size() const _GLIBCXX_NOEXCEPT
42638fd1498Szrj { return this->_M_length(); }
42738fd1498Szrj
42838fd1498Szrj /// Returns the number of characters in the string, not including any
42938fd1498Szrj /// null-termination.
43038fd1498Szrj size_type
43138fd1498Szrj length() const _GLIBCXX_NOEXCEPT
43238fd1498Szrj { return this->_M_length(); }
43338fd1498Szrj
43438fd1498Szrj /// Returns the size() of the largest possible %string.
43538fd1498Szrj size_type
43638fd1498Szrj max_size() const _GLIBCXX_NOEXCEPT
43738fd1498Szrj { return this->_M_max_size(); }
43838fd1498Szrj
43938fd1498Szrj /**
44038fd1498Szrj * @brief Resizes the %string to the specified number of characters.
44138fd1498Szrj * @param __n Number of characters the %string should contain.
44238fd1498Szrj * @param __c Character to fill any new elements.
44338fd1498Szrj *
44438fd1498Szrj * This function will %resize the %string to the specified
44538fd1498Szrj * number of characters. If the number is smaller than the
44638fd1498Szrj * %string's current size the %string is truncated, otherwise
44738fd1498Szrj * the %string is extended and new elements are set to @a __c.
44838fd1498Szrj */
44938fd1498Szrj void
45038fd1498Szrj resize(size_type __n, _CharT __c);
45138fd1498Szrj
45238fd1498Szrj /**
45338fd1498Szrj * @brief Resizes the %string to the specified number of characters.
45438fd1498Szrj * @param __n Number of characters the %string should contain.
45538fd1498Szrj *
45638fd1498Szrj * This function will resize the %string to the specified
45738fd1498Szrj * length. If the new size is smaller than the %string's
45838fd1498Szrj * current size the %string is truncated, otherwise the %string
45938fd1498Szrj * is extended and new characters are default-constructed. For
46038fd1498Szrj * basic types such as char, this means setting them to 0.
46138fd1498Szrj */
46238fd1498Szrj void
46338fd1498Szrj resize(size_type __n)
46438fd1498Szrj { this->resize(__n, _CharT()); }
46538fd1498Szrj
46638fd1498Szrj #if __cplusplus >= 201103L
46738fd1498Szrj /// A non-binding request to reduce capacity() to size().
46838fd1498Szrj void
46938fd1498Szrj shrink_to_fit() noexcept
47038fd1498Szrj {
47138fd1498Szrj if (capacity() > size())
47238fd1498Szrj {
47338fd1498Szrj __try
47438fd1498Szrj { this->reserve(0); }
47538fd1498Szrj __catch(...)
47638fd1498Szrj { }
47738fd1498Szrj }
47838fd1498Szrj }
47938fd1498Szrj #endif
48038fd1498Szrj
48138fd1498Szrj /**
48238fd1498Szrj * Returns the total number of characters that the %string can
48338fd1498Szrj * hold before needing to allocate more memory.
48438fd1498Szrj */
48538fd1498Szrj size_type
48638fd1498Szrj capacity() const _GLIBCXX_NOEXCEPT
48738fd1498Szrj { return this->_M_capacity(); }
48838fd1498Szrj
48938fd1498Szrj /**
49038fd1498Szrj * @brief Attempt to preallocate enough memory for specified number of
49138fd1498Szrj * characters.
49238fd1498Szrj * @param __res_arg Number of characters required.
49338fd1498Szrj * @throw std::length_error If @a __res_arg exceeds @c max_size().
49438fd1498Szrj *
49538fd1498Szrj * This function attempts to reserve enough memory for the
49638fd1498Szrj * %string to hold the specified number of characters. If the
49738fd1498Szrj * number requested is more than max_size(), length_error is
49838fd1498Szrj * thrown.
49938fd1498Szrj *
50038fd1498Szrj * The advantage of this function is that if optimal code is a
50138fd1498Szrj * necessity and the user can determine the string length that
50238fd1498Szrj * will be required, the user can reserve the memory in
50338fd1498Szrj * %advance, and thus prevent a possible reallocation of memory
50438fd1498Szrj * and copying of %string data.
50538fd1498Szrj */
50638fd1498Szrj void
50738fd1498Szrj reserve(size_type __res_arg = 0)
50838fd1498Szrj { this->_M_reserve(__res_arg); }
50938fd1498Szrj
51038fd1498Szrj /**
51138fd1498Szrj * Erases the string, making it empty.
51238fd1498Szrj */
51338fd1498Szrj void
51438fd1498Szrj clear() _GLIBCXX_NOEXCEPT
51538fd1498Szrj { this->_M_clear(); }
51638fd1498Szrj
51738fd1498Szrj /**
51838fd1498Szrj * Returns true if the %string is empty. Equivalent to
51938fd1498Szrj * <code>*this == ""</code>.
52038fd1498Szrj */
52138fd1498Szrj bool
52238fd1498Szrj empty() const _GLIBCXX_NOEXCEPT
52338fd1498Szrj { return this->size() == 0; }
52438fd1498Szrj
52538fd1498Szrj // Element access:
52638fd1498Szrj /**
52738fd1498Szrj * @brief Subscript access to the data contained in the %string.
52838fd1498Szrj * @param __pos The index of the character to access.
52938fd1498Szrj * @return Read-only (constant) reference to the character.
53038fd1498Szrj *
53138fd1498Szrj * This operator allows for easy, array-style, data access.
53238fd1498Szrj * Note that data access with this operator is unchecked and
53338fd1498Szrj * out_of_range lookups are not defined. (For checked lookups
53438fd1498Szrj * see at().)
53538fd1498Szrj */
53638fd1498Szrj const_reference
53738fd1498Szrj operator[] (size_type __pos) const _GLIBCXX_NOEXCEPT
53838fd1498Szrj {
53938fd1498Szrj __glibcxx_assert(__pos <= this->size());
54038fd1498Szrj return this->_M_data()[__pos];
54138fd1498Szrj }
54238fd1498Szrj
54338fd1498Szrj /**
54438fd1498Szrj * @brief Subscript access to the data contained in the %string.
54538fd1498Szrj * @param __pos The index of the character to access.
54638fd1498Szrj * @return Read/write reference to the character.
54738fd1498Szrj *
54838fd1498Szrj * This operator allows for easy, array-style, data access.
54938fd1498Szrj * Note that data access with this operator is unchecked and
55038fd1498Szrj * out_of_range lookups are not defined. (For checked lookups
55138fd1498Szrj * see at().) Unshares the string.
55238fd1498Szrj */
55338fd1498Szrj reference
55438fd1498Szrj operator[](size_type __pos) _GLIBCXX_NOEXCEPT
55538fd1498Szrj {
55638fd1498Szrj // Allow pos == size() both in C++98 mode, as v3 extension,
55738fd1498Szrj // and in C++11 mode.
55838fd1498Szrj __glibcxx_assert(__pos <= this->size());
55938fd1498Szrj // In pedantic mode be strict in C++98 mode.
56038fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(__cplusplus >= 201103L
56138fd1498Szrj || __pos < this->size());
56238fd1498Szrj this->_M_leak();
56338fd1498Szrj return this->_M_data()[__pos];
56438fd1498Szrj }
56538fd1498Szrj
56638fd1498Szrj /**
56738fd1498Szrj * @brief Provides access to the data contained in the %string.
56838fd1498Szrj * @param __n The index of the character to access.
56938fd1498Szrj * @return Read-only (const) reference to the character.
57038fd1498Szrj * @throw std::out_of_range If @a __n is an invalid index.
57138fd1498Szrj *
57238fd1498Szrj * This function provides for safer data access. The parameter
57338fd1498Szrj * is first checked that it is in the range of the string. The
57438fd1498Szrj * function throws out_of_range if the check fails.
57538fd1498Szrj */
57638fd1498Szrj const_reference
57738fd1498Szrj at(size_type __n) const
57838fd1498Szrj {
57938fd1498Szrj if (__n >= this->size())
58038fd1498Szrj std::__throw_out_of_range_fmt(__N("__versa_string::at: __n "
58138fd1498Szrj "(which is %zu) >= this->size() "
58238fd1498Szrj "(which is %zu)"),
58338fd1498Szrj __n, this->size());
58438fd1498Szrj return this->_M_data()[__n];
58538fd1498Szrj }
58638fd1498Szrj
58738fd1498Szrj /**
58838fd1498Szrj * @brief Provides access to the data contained in the %string.
58938fd1498Szrj * @param __n The index of the character to access.
59038fd1498Szrj * @return Read/write reference to the character.
59138fd1498Szrj * @throw std::out_of_range If @a __n is an invalid index.
59238fd1498Szrj *
59338fd1498Szrj * This function provides for safer data access. The parameter
59438fd1498Szrj * is first checked that it is in the range of the string. The
59538fd1498Szrj * function throws out_of_range if the check fails. Success
59638fd1498Szrj * results in unsharing the string.
59738fd1498Szrj */
59838fd1498Szrj reference
59938fd1498Szrj at(size_type __n)
60038fd1498Szrj {
60138fd1498Szrj if (__n >= this->size())
60238fd1498Szrj std::__throw_out_of_range_fmt(__N("__versa_string::at: __n "
60338fd1498Szrj "(which is %zu) >= this->size() "
60438fd1498Szrj "(which is %zu)"),
60538fd1498Szrj __n, this->size());
60638fd1498Szrj this->_M_leak();
60738fd1498Szrj return this->_M_data()[__n];
60838fd1498Szrj }
60938fd1498Szrj
61038fd1498Szrj #if __cplusplus >= 201103L
61138fd1498Szrj /**
61238fd1498Szrj * Returns a read/write reference to the data at the first
61338fd1498Szrj * element of the %string.
61438fd1498Szrj */
61538fd1498Szrj reference
61638fd1498Szrj front() noexcept
61738fd1498Szrj { return operator[](0); }
61838fd1498Szrj
61938fd1498Szrj /**
62038fd1498Szrj * Returns a read-only (constant) reference to the data at the first
62138fd1498Szrj * element of the %string.
62238fd1498Szrj */
62338fd1498Szrj const_reference
62438fd1498Szrj front() const noexcept
62538fd1498Szrj { return operator[](0); }
62638fd1498Szrj
62738fd1498Szrj /**
62838fd1498Szrj * Returns a read/write reference to the data at the last
62938fd1498Szrj * element of the %string.
63038fd1498Szrj */
63138fd1498Szrj reference
63238fd1498Szrj back() noexcept
63338fd1498Szrj { return operator[](this->size() - 1); }
63438fd1498Szrj
63538fd1498Szrj /**
63638fd1498Szrj * Returns a read-only (constant) reference to the data at the
63738fd1498Szrj * last element of the %string.
63838fd1498Szrj */
63938fd1498Szrj const_reference
64038fd1498Szrj back() const noexcept
64138fd1498Szrj { return operator[](this->size() - 1); }
64238fd1498Szrj #endif
64338fd1498Szrj
64438fd1498Szrj // Modifiers:
64538fd1498Szrj /**
64638fd1498Szrj * @brief Append a string to this string.
64738fd1498Szrj * @param __str The string to append.
64838fd1498Szrj * @return Reference to this string.
64938fd1498Szrj */
65038fd1498Szrj __versa_string&
65138fd1498Szrj operator+=(const __versa_string& __str)
65238fd1498Szrj { return this->append(__str); }
65338fd1498Szrj
65438fd1498Szrj /**
65538fd1498Szrj * @brief Append a C string.
65638fd1498Szrj * @param __s The C string to append.
65738fd1498Szrj * @return Reference to this string.
65838fd1498Szrj */
65938fd1498Szrj __versa_string&
66038fd1498Szrj operator+=(const _CharT* __s)
66138fd1498Szrj { return this->append(__s); }
66238fd1498Szrj
66338fd1498Szrj /**
66438fd1498Szrj * @brief Append a character.
66538fd1498Szrj * @param __c The character to append.
66638fd1498Szrj * @return Reference to this string.
66738fd1498Szrj */
66838fd1498Szrj __versa_string&
66938fd1498Szrj operator+=(_CharT __c)
67038fd1498Szrj {
67138fd1498Szrj this->push_back(__c);
67238fd1498Szrj return *this;
67338fd1498Szrj }
67438fd1498Szrj
67538fd1498Szrj #if __cplusplus >= 201103L
67638fd1498Szrj /**
67738fd1498Szrj * @brief Append an initializer_list of characters.
67838fd1498Szrj * @param __l The initializer_list of characters to be appended.
67938fd1498Szrj * @return Reference to this string.
68038fd1498Szrj */
68138fd1498Szrj __versa_string&
68238fd1498Szrj operator+=(std::initializer_list<_CharT> __l)
68338fd1498Szrj { return this->append(__l.begin(), __l.end()); }
68438fd1498Szrj #endif // C++11
68538fd1498Szrj
68638fd1498Szrj /**
68738fd1498Szrj * @brief Append a string to this string.
68838fd1498Szrj * @param __str The string to append.
68938fd1498Szrj * @return Reference to this string.
69038fd1498Szrj */
69138fd1498Szrj __versa_string&
69238fd1498Szrj append(const __versa_string& __str)
69338fd1498Szrj { return _M_append(__str._M_data(), __str.size()); }
69438fd1498Szrj
69538fd1498Szrj /**
69638fd1498Szrj * @brief Append a substring.
69738fd1498Szrj * @param __str The string to append.
69838fd1498Szrj * @param __pos Index of the first character of str to append.
69938fd1498Szrj * @param __n The number of characters to append.
70038fd1498Szrj * @return Reference to this string.
70138fd1498Szrj * @throw std::out_of_range if @a pos is not a valid index.
70238fd1498Szrj *
70338fd1498Szrj * This function appends @a __n characters from @a __str
70438fd1498Szrj * starting at @a __pos to this string. If @a __n is is larger
70538fd1498Szrj * than the number of available characters in @a __str, the
70638fd1498Szrj * remainder of @a __str is appended.
70738fd1498Szrj */
70838fd1498Szrj __versa_string&
70938fd1498Szrj append(const __versa_string& __str, size_type __pos, size_type __n)
71038fd1498Szrj { return _M_append(__str._M_data()
71138fd1498Szrj + __str._M_check(__pos, "__versa_string::append"),
71238fd1498Szrj __str._M_limit(__pos, __n)); }
71338fd1498Szrj
71438fd1498Szrj /**
71538fd1498Szrj * @brief Append a C substring.
71638fd1498Szrj * @param __s The C string to append.
71738fd1498Szrj * @param __n The number of characters to append.
71838fd1498Szrj * @return Reference to this string.
71938fd1498Szrj */
72038fd1498Szrj __versa_string&
72138fd1498Szrj append(const _CharT* __s, size_type __n)
72238fd1498Szrj {
72338fd1498Szrj __glibcxx_requires_string_len(__s, __n);
72438fd1498Szrj _M_check_length(size_type(0), __n, "__versa_string::append");
72538fd1498Szrj return _M_append(__s, __n);
72638fd1498Szrj }
72738fd1498Szrj
72838fd1498Szrj /**
72938fd1498Szrj * @brief Append a C string.
73038fd1498Szrj * @param __s The C string to append.
73138fd1498Szrj * @return Reference to this string.
73238fd1498Szrj */
73338fd1498Szrj __versa_string&
73438fd1498Szrj append(const _CharT* __s)
73538fd1498Szrj {
73638fd1498Szrj __glibcxx_requires_string(__s);
73738fd1498Szrj const size_type __n = traits_type::length(__s);
73838fd1498Szrj _M_check_length(size_type(0), __n, "__versa_string::append");
73938fd1498Szrj return _M_append(__s, __n);
74038fd1498Szrj }
74138fd1498Szrj
74238fd1498Szrj /**
74338fd1498Szrj * @brief Append multiple characters.
74438fd1498Szrj * @param __n The number of characters to append.
74538fd1498Szrj * @param __c The character to use.
74638fd1498Szrj * @return Reference to this string.
74738fd1498Szrj *
74838fd1498Szrj * Appends n copies of c to this string.
74938fd1498Szrj */
75038fd1498Szrj __versa_string&
75138fd1498Szrj append(size_type __n, _CharT __c)
75238fd1498Szrj { return _M_replace_aux(this->size(), size_type(0), __n, __c); }
75338fd1498Szrj
75438fd1498Szrj #if __cplusplus >= 201103L
75538fd1498Szrj /**
75638fd1498Szrj * @brief Append an initializer_list of characters.
75738fd1498Szrj * @param __l The initializer_list of characters to append.
75838fd1498Szrj * @return Reference to this string.
75938fd1498Szrj */
76038fd1498Szrj __versa_string&
76138fd1498Szrj append(std::initializer_list<_CharT> __l)
76238fd1498Szrj { return this->append(__l.begin(), __l.end()); }
76338fd1498Szrj #endif // C++11
76438fd1498Szrj
76538fd1498Szrj /**
76638fd1498Szrj * @brief Append a range of characters.
76738fd1498Szrj * @param __first Iterator referencing the first character to append.
76838fd1498Szrj * @param __last Iterator marking the end of the range.
76938fd1498Szrj * @return Reference to this string.
77038fd1498Szrj *
77138fd1498Szrj * Appends characters in the range [first,last) to this string.
77238fd1498Szrj */
77338fd1498Szrj #if __cplusplus >= 201103L
77438fd1498Szrj template<class _InputIterator,
77538fd1498Szrj typename = std::_RequireInputIter<_InputIterator>>
77638fd1498Szrj #else
77738fd1498Szrj template<class _InputIterator>
77838fd1498Szrj #endif
77938fd1498Szrj __versa_string&
78038fd1498Szrj append(_InputIterator __first, _InputIterator __last)
78138fd1498Szrj { return this->replace(_M_iend(), _M_iend(), __first, __last); }
78238fd1498Szrj
78338fd1498Szrj /**
78438fd1498Szrj * @brief Append a single character.
78538fd1498Szrj * @param __c Character to append.
78638fd1498Szrj */
78738fd1498Szrj void
78838fd1498Szrj push_back(_CharT __c)
78938fd1498Szrj {
79038fd1498Szrj const size_type __size = this->size();
79138fd1498Szrj if (__size + 1 > this->capacity() || this->_M_is_shared())
79238fd1498Szrj this->_M_mutate(__size, size_type(0), 0, size_type(1));
79338fd1498Szrj traits_type::assign(this->_M_data()[__size], __c);
79438fd1498Szrj this->_M_set_length(__size + 1);
79538fd1498Szrj }
79638fd1498Szrj
79738fd1498Szrj /**
79838fd1498Szrj * @brief Set value to contents of another string.
79938fd1498Szrj * @param __str Source string to use.
80038fd1498Szrj * @return Reference to this string.
80138fd1498Szrj */
80238fd1498Szrj __versa_string&
80338fd1498Szrj assign(const __versa_string& __str)
80438fd1498Szrj {
80538fd1498Szrj this->_M_assign(__str);
80638fd1498Szrj return *this;
80738fd1498Szrj }
80838fd1498Szrj
80938fd1498Szrj #if __cplusplus >= 201103L
81038fd1498Szrj /**
81138fd1498Szrj * @brief Set value to contents of another string.
81238fd1498Szrj * @param __str Source string to use.
81338fd1498Szrj * @return Reference to this string.
81438fd1498Szrj *
81538fd1498Szrj * This function sets this string to the exact contents of @a __str.
81638fd1498Szrj * @a __str is a valid, but unspecified string.
81738fd1498Szrj */
81838fd1498Szrj __versa_string&
81938fd1498Szrj assign(__versa_string&& __str) noexcept
82038fd1498Szrj {
82138fd1498Szrj this->swap(__str);
82238fd1498Szrj return *this;
82338fd1498Szrj }
82438fd1498Szrj #endif // C++11
82538fd1498Szrj
82638fd1498Szrj /**
82738fd1498Szrj * @brief Set value to a substring of a string.
82838fd1498Szrj * @param __str The string to use.
82938fd1498Szrj * @param __pos Index of the first character of str.
83038fd1498Szrj * @param __n Number of characters to use.
83138fd1498Szrj * @return Reference to this string.
83238fd1498Szrj * @throw std::out_of_range if @a __pos is not a valid index.
83338fd1498Szrj *
83438fd1498Szrj * This function sets this string to the substring of @a __str
83538fd1498Szrj * consisting of @a __n characters at @a __pos. If @a __n is
83638fd1498Szrj * is larger than the number of available characters in @a
83738fd1498Szrj * __str, the remainder of @a __str is used.
83838fd1498Szrj */
83938fd1498Szrj __versa_string&
84038fd1498Szrj assign(const __versa_string& __str, size_type __pos, size_type __n)
84138fd1498Szrj { return _M_replace(size_type(0), this->size(), __str._M_data()
84238fd1498Szrj + __str._M_check(__pos, "__versa_string::assign"),
84338fd1498Szrj __str._M_limit(__pos, __n)); }
84438fd1498Szrj
84538fd1498Szrj /**
84638fd1498Szrj * @brief Set value to a C substring.
84738fd1498Szrj * @param __s The C string to use.
84838fd1498Szrj * @param __n Number of characters to use.
84938fd1498Szrj * @return Reference to this string.
85038fd1498Szrj *
85138fd1498Szrj * This function sets the value of this string to the first @a
85238fd1498Szrj * __n characters of @a __s. If @a __n is is larger than the
85338fd1498Szrj * number of available characters in @a __s, the remainder of
85438fd1498Szrj * @a __s is used.
85538fd1498Szrj */
85638fd1498Szrj __versa_string&
85738fd1498Szrj assign(const _CharT* __s, size_type __n)
85838fd1498Szrj {
85938fd1498Szrj __glibcxx_requires_string_len(__s, __n);
86038fd1498Szrj return _M_replace(size_type(0), this->size(), __s, __n);
86138fd1498Szrj }
86238fd1498Szrj
86338fd1498Szrj /**
86438fd1498Szrj * @brief Set value to contents of a C string.
86538fd1498Szrj * @param __s The C string to use.
86638fd1498Szrj * @return Reference to this string.
86738fd1498Szrj *
86838fd1498Szrj * This function sets the value of this string to the value of
86938fd1498Szrj * @a __s. The data is copied, so there is no dependence on @a
87038fd1498Szrj * __s once the function returns.
87138fd1498Szrj */
87238fd1498Szrj __versa_string&
87338fd1498Szrj assign(const _CharT* __s)
87438fd1498Szrj {
87538fd1498Szrj __glibcxx_requires_string(__s);
87638fd1498Szrj return _M_replace(size_type(0), this->size(), __s,
87738fd1498Szrj traits_type::length(__s));
87838fd1498Szrj }
87938fd1498Szrj
88038fd1498Szrj /**
88138fd1498Szrj * @brief Set value to multiple characters.
88238fd1498Szrj * @param __n Length of the resulting string.
88338fd1498Szrj * @param __c The character to use.
88438fd1498Szrj * @return Reference to this string.
88538fd1498Szrj *
88638fd1498Szrj * This function sets the value of this string to @a __n copies of
88738fd1498Szrj * character @a __c.
88838fd1498Szrj */
88938fd1498Szrj __versa_string&
89038fd1498Szrj assign(size_type __n, _CharT __c)
89138fd1498Szrj { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
89238fd1498Szrj
89338fd1498Szrj /**
89438fd1498Szrj * @brief Set value to a range of characters.
89538fd1498Szrj * @param __first Iterator referencing the first character to append.
89638fd1498Szrj * @param __last Iterator marking the end of the range.
89738fd1498Szrj * @return Reference to this string.
89838fd1498Szrj *
89938fd1498Szrj * Sets value of string to characters in the range
90038fd1498Szrj * [first,last).
90138fd1498Szrj */
90238fd1498Szrj #if __cplusplus >= 201103L
90338fd1498Szrj template<class _InputIterator,
90438fd1498Szrj typename = std::_RequireInputIter<_InputIterator>>
90538fd1498Szrj #else
90638fd1498Szrj template<class _InputIterator>
90738fd1498Szrj #endif
90838fd1498Szrj __versa_string&
90938fd1498Szrj assign(_InputIterator __first, _InputIterator __last)
91038fd1498Szrj { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
91138fd1498Szrj
91238fd1498Szrj #if __cplusplus >= 201103L
91338fd1498Szrj /**
91438fd1498Szrj * @brief Set value to an initializer_list of characters.
91538fd1498Szrj * @param __l The initializer_list of characters to assign.
91638fd1498Szrj * @return Reference to this string.
91738fd1498Szrj */
91838fd1498Szrj __versa_string&
91938fd1498Szrj assign(std::initializer_list<_CharT> __l)
92038fd1498Szrj { return this->assign(__l.begin(), __l.end()); }
92138fd1498Szrj #endif // C++11
92238fd1498Szrj
92338fd1498Szrj #if __cplusplus >= 201103L
92438fd1498Szrj /**
92538fd1498Szrj * @brief Insert multiple characters.
92638fd1498Szrj * @param __p Const_iterator referencing location in string to
92738fd1498Szrj * insert at.
92838fd1498Szrj * @param __n Number of characters to insert
92938fd1498Szrj * @param __c The character to insert.
93038fd1498Szrj * @return Iterator referencing the first inserted char.
93138fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
93238fd1498Szrj *
93338fd1498Szrj * Inserts @a __n copies of character @a __c starting at the
93438fd1498Szrj * position referenced by iterator @a __p. If adding
93538fd1498Szrj * characters causes the length to exceed max_size(),
93638fd1498Szrj * length_error is thrown. The value of the string doesn't
93738fd1498Szrj * change if an error is thrown.
93838fd1498Szrj */
93938fd1498Szrj iterator
94038fd1498Szrj insert(const_iterator __p, size_type __n, _CharT __c)
94138fd1498Szrj {
94238fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
94338fd1498Szrj const size_type __pos = __p - _M_ibegin();
94438fd1498Szrj this->replace(__p, __p, __n, __c);
94538fd1498Szrj return iterator(this->_M_data() + __pos);
94638fd1498Szrj }
94738fd1498Szrj #else
94838fd1498Szrj /**
94938fd1498Szrj * @brief Insert multiple characters.
95038fd1498Szrj * @param __p Iterator referencing location in string to insert at.
95138fd1498Szrj * @param __n Number of characters to insert
95238fd1498Szrj * @param __c The character to insert.
95338fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
95438fd1498Szrj *
95538fd1498Szrj * Inserts @a __n copies of character @a __c starting at the
95638fd1498Szrj * position referenced by iterator @a __p. If adding
95738fd1498Szrj * characters causes the length to exceed max_size(),
95838fd1498Szrj * length_error is thrown. The value of the string doesn't
95938fd1498Szrj * change if an error is thrown.
96038fd1498Szrj */
96138fd1498Szrj void
96238fd1498Szrj insert(iterator __p, size_type __n, _CharT __c)
96338fd1498Szrj { this->replace(__p, __p, __n, __c); }
96438fd1498Szrj #endif
96538fd1498Szrj
96638fd1498Szrj #if __cplusplus >= 201103L
96738fd1498Szrj /**
96838fd1498Szrj * @brief Insert a range of characters.
96938fd1498Szrj * @param __p Const_iterator referencing location in string to
97038fd1498Szrj * insert at.
97138fd1498Szrj * @param __beg Start of range.
97238fd1498Szrj * @param __end End of range.
97338fd1498Szrj * @return Iterator referencing the first inserted char.
97438fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
97538fd1498Szrj *
97638fd1498Szrj * Inserts characters in range [beg,end). If adding characters
97738fd1498Szrj * causes the length to exceed max_size(), length_error is
97838fd1498Szrj * thrown. The value of the string doesn't change if an error
97938fd1498Szrj * is thrown.
98038fd1498Szrj */
98138fd1498Szrj template<class _InputIterator,
98238fd1498Szrj typename = std::_RequireInputIter<_InputIterator>>
98338fd1498Szrj iterator
98438fd1498Szrj insert(const_iterator __p, _InputIterator __beg, _InputIterator __end)
98538fd1498Szrj {
98638fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
98738fd1498Szrj const size_type __pos = __p - _M_ibegin();
98838fd1498Szrj this->replace(__p, __p, __beg, __end);
98938fd1498Szrj return iterator(this->_M_data() + __pos);
99038fd1498Szrj }
99138fd1498Szrj #else
99238fd1498Szrj /**
99338fd1498Szrj * @brief Insert a range of characters.
99438fd1498Szrj * @param __p Iterator referencing location in string to insert at.
99538fd1498Szrj * @param __beg Start of range.
99638fd1498Szrj * @param __end End of range.
99738fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
99838fd1498Szrj *
99938fd1498Szrj * Inserts characters in range [beg,end). If adding characters
100038fd1498Szrj * causes the length to exceed max_size(), length_error is
100138fd1498Szrj * thrown. The value of the string doesn't change if an error
100238fd1498Szrj * is thrown.
100338fd1498Szrj */
100438fd1498Szrj template<class _InputIterator>
100538fd1498Szrj void
100638fd1498Szrj insert(iterator __p, _InputIterator __beg, _InputIterator __end)
100738fd1498Szrj { this->replace(__p, __p, __beg, __end); }
100838fd1498Szrj #endif
100938fd1498Szrj
101038fd1498Szrj #if __cplusplus >= 201103L
101138fd1498Szrj /**
101238fd1498Szrj * @brief Insert an initializer_list of characters.
101338fd1498Szrj * @param __p Const_iterator referencing location in string to
101438fd1498Szrj * insert at.
101538fd1498Szrj * @param __l The initializer_list of characters to insert.
101638fd1498Szrj * @return Iterator referencing the first inserted char.
101738fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
101838fd1498Szrj */
101938fd1498Szrj iterator
102038fd1498Szrj insert(const_iterator __p, std::initializer_list<_CharT> __l)
102138fd1498Szrj { return this->insert(__p, __l.begin(), __l.end()); }
102238fd1498Szrj #endif // C++11
102338fd1498Szrj
102438fd1498Szrj /**
102538fd1498Szrj * @brief Insert value of a string.
102638fd1498Szrj * @param __pos1 Iterator referencing location in string to insert at.
102738fd1498Szrj * @param __str The string to insert.
102838fd1498Szrj * @return Reference to this string.
102938fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
103038fd1498Szrj *
103138fd1498Szrj * Inserts value of @a __str starting at @a __pos1. If adding
103238fd1498Szrj * characters causes the length to exceed max_size(),
103338fd1498Szrj * length_error is thrown. The value of the string doesn't
103438fd1498Szrj * change if an error is thrown.
103538fd1498Szrj */
103638fd1498Szrj __versa_string&
103738fd1498Szrj insert(size_type __pos1, const __versa_string& __str)
103838fd1498Szrj { return this->replace(__pos1, size_type(0),
103938fd1498Szrj __str._M_data(), __str.size()); }
104038fd1498Szrj
104138fd1498Szrj /**
104238fd1498Szrj * @brief Insert a substring.
104338fd1498Szrj * @param __pos1 Iterator referencing location in string to insert at.
104438fd1498Szrj * @param __str The string to insert.
104538fd1498Szrj * @param __pos2 Start of characters in str to insert.
104638fd1498Szrj * @param __n Number of characters to insert.
104738fd1498Szrj * @return Reference to this string.
104838fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
104938fd1498Szrj * @throw std::out_of_range If @a __pos1 > size() or
105038fd1498Szrj * @a __pos2 > @a __str.size().
105138fd1498Szrj *
105238fd1498Szrj * Starting at @a __pos1, insert @a __n character of @a __str
105338fd1498Szrj * beginning with @a __pos2. If adding characters causes the
105438fd1498Szrj * length to exceed max_size(), length_error is thrown. If @a
105538fd1498Szrj * __pos1 is beyond the end of this string or @a __pos2 is
105638fd1498Szrj * beyond the end of @a __str, out_of_range is thrown. The
105738fd1498Szrj * value of the string doesn't change if an error is thrown.
105838fd1498Szrj */
105938fd1498Szrj __versa_string&
106038fd1498Szrj insert(size_type __pos1, const __versa_string& __str,
106138fd1498Szrj size_type __pos2, size_type __n)
106238fd1498Szrj { return this->replace(__pos1, size_type(0), __str._M_data()
106338fd1498Szrj + __str._M_check(__pos2, "__versa_string::insert"),
106438fd1498Szrj __str._M_limit(__pos2, __n)); }
106538fd1498Szrj
106638fd1498Szrj /**
106738fd1498Szrj * @brief Insert a C substring.
106838fd1498Szrj * @param __pos Iterator referencing location in string to insert at.
106938fd1498Szrj * @param __s The C string to insert.
107038fd1498Szrj * @param __n The number of characters to insert.
107138fd1498Szrj * @return Reference to this string.
107238fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
107338fd1498Szrj * @throw std::out_of_range If @a __pos is beyond the end of this
107438fd1498Szrj * string.
107538fd1498Szrj *
107638fd1498Szrj * Inserts the first @a __n characters of @a __s starting at @a
107738fd1498Szrj * __pos. If adding characters causes the length to exceed
107838fd1498Szrj * max_size(), length_error is thrown. If @a __pos is beyond
107938fd1498Szrj * end(), out_of_range is thrown. The value of the string
108038fd1498Szrj * doesn't change if an error is thrown.
108138fd1498Szrj */
108238fd1498Szrj __versa_string&
108338fd1498Szrj insert(size_type __pos, const _CharT* __s, size_type __n)
108438fd1498Szrj { return this->replace(__pos, size_type(0), __s, __n); }
108538fd1498Szrj
108638fd1498Szrj /**
108738fd1498Szrj * @brief Insert a C string.
108838fd1498Szrj * @param __pos Iterator referencing location in string to insert at.
108938fd1498Szrj * @param __s The C string to insert.
109038fd1498Szrj * @return Reference to this string.
109138fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
109238fd1498Szrj * @throw std::out_of_range If @a __pos is beyond the end of this
109338fd1498Szrj * string.
109438fd1498Szrj *
109538fd1498Szrj * Inserts the first @a __n characters of @a __s starting at @a
109638fd1498Szrj * __pos. If adding characters causes the length to exceed
109738fd1498Szrj * max_size(), length_error is thrown. If @a __pos is beyond
109838fd1498Szrj * end(), out_of_range is thrown. The value of the string
109938fd1498Szrj * doesn't change if an error is thrown.
110038fd1498Szrj */
110138fd1498Szrj __versa_string&
110238fd1498Szrj insert(size_type __pos, const _CharT* __s)
110338fd1498Szrj {
110438fd1498Szrj __glibcxx_requires_string(__s);
110538fd1498Szrj return this->replace(__pos, size_type(0), __s,
110638fd1498Szrj traits_type::length(__s));
110738fd1498Szrj }
110838fd1498Szrj
110938fd1498Szrj /**
111038fd1498Szrj * @brief Insert multiple characters.
111138fd1498Szrj * @param __pos Index in string to insert at.
111238fd1498Szrj * @param __n Number of characters to insert
111338fd1498Szrj * @param __c The character to insert.
111438fd1498Szrj * @return Reference to this string.
111538fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
111638fd1498Szrj * @throw std::out_of_range If @a __pos is beyond the end of this
111738fd1498Szrj * string.
111838fd1498Szrj *
111938fd1498Szrj * Inserts @a __n copies of character @a __c starting at index
112038fd1498Szrj * @a __pos. If adding characters causes the length to exceed
112138fd1498Szrj * max_size(), length_error is thrown. If @a __pos > length(),
112238fd1498Szrj * out_of_range is thrown. The value of the string doesn't
112338fd1498Szrj * change if an error is thrown.
112438fd1498Szrj */
112538fd1498Szrj __versa_string&
112638fd1498Szrj insert(size_type __pos, size_type __n, _CharT __c)
112738fd1498Szrj { return _M_replace_aux(_M_check(__pos, "__versa_string::insert"),
112838fd1498Szrj size_type(0), __n, __c); }
112938fd1498Szrj
113038fd1498Szrj /**
113138fd1498Szrj * @brief Insert one character.
113238fd1498Szrj * @param __p Iterator referencing position in string to insert at.
113338fd1498Szrj * @param __c The character to insert.
113438fd1498Szrj * @return Iterator referencing newly inserted char.
113538fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
113638fd1498Szrj *
113738fd1498Szrj * Inserts character @a __c at position referenced by @a __p.
113838fd1498Szrj * If adding character causes the length to exceed max_size(),
113938fd1498Szrj * length_error is thrown. If @a __p is beyond end of string,
114038fd1498Szrj * out_of_range is thrown. The value of the string doesn't
114138fd1498Szrj * change if an error is thrown.
114238fd1498Szrj */
114338fd1498Szrj iterator
114438fd1498Szrj #if __cplusplus >= 201103L
114538fd1498Szrj insert(const_iterator __p, _CharT __c)
114638fd1498Szrj #else
114738fd1498Szrj insert(iterator __p, _CharT __c)
114838fd1498Szrj #endif
114938fd1498Szrj {
115038fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
115138fd1498Szrj const size_type __pos = __p - _M_ibegin();
115238fd1498Szrj _M_replace_aux(__pos, size_type(0), size_type(1), __c);
115338fd1498Szrj this->_M_set_leaked();
115438fd1498Szrj return iterator(this->_M_data() + __pos);
115538fd1498Szrj }
115638fd1498Szrj
115738fd1498Szrj /**
115838fd1498Szrj * @brief Remove characters.
115938fd1498Szrj * @param __pos Index of first character to remove (default 0).
116038fd1498Szrj * @param __n Number of characters to remove (default remainder).
116138fd1498Szrj * @return Reference to this string.
116238fd1498Szrj * @throw std::out_of_range If @a __pos is beyond the end of this
116338fd1498Szrj * string.
116438fd1498Szrj *
116538fd1498Szrj * Removes @a __n characters from this string starting at @a
116638fd1498Szrj * __pos. The length of the string is reduced by @a __n. If
116738fd1498Szrj * there are < @a __n characters to remove, the remainder of
116838fd1498Szrj * the string is truncated. If @a __p is beyond end of string,
116938fd1498Szrj * out_of_range is thrown. The value of the string doesn't
117038fd1498Szrj * change if an error is thrown.
117138fd1498Szrj */
117238fd1498Szrj __versa_string&
117338fd1498Szrj erase(size_type __pos = 0, size_type __n = npos)
117438fd1498Szrj {
117538fd1498Szrj this->_M_erase(_M_check(__pos, "__versa_string::erase"),
117638fd1498Szrj _M_limit(__pos, __n));
117738fd1498Szrj return *this;
117838fd1498Szrj }
117938fd1498Szrj
118038fd1498Szrj /**
118138fd1498Szrj * @brief Remove one character.
118238fd1498Szrj * @param __position Iterator referencing the character to remove.
118338fd1498Szrj * @return iterator referencing same location after removal.
118438fd1498Szrj *
118538fd1498Szrj * Removes the character at @a __position from this string. The
118638fd1498Szrj * value of the string doesn't change if an error is thrown.
118738fd1498Szrj */
118838fd1498Szrj iterator
118938fd1498Szrj #if __cplusplus >= 201103L
119038fd1498Szrj erase(const_iterator __position)
119138fd1498Szrj #else
119238fd1498Szrj erase(iterator __position)
119338fd1498Szrj #endif
119438fd1498Szrj {
119538fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
119638fd1498Szrj && __position < _M_iend());
119738fd1498Szrj const size_type __pos = __position - _M_ibegin();
119838fd1498Szrj this->_M_erase(__pos, size_type(1));
119938fd1498Szrj this->_M_set_leaked();
120038fd1498Szrj return iterator(this->_M_data() + __pos);
120138fd1498Szrj }
120238fd1498Szrj
120338fd1498Szrj /**
120438fd1498Szrj * @brief Remove a range of characters.
120538fd1498Szrj * @param __first Iterator referencing the first character to remove.
120638fd1498Szrj * @param __last Iterator referencing the end of the range.
120738fd1498Szrj * @return Iterator referencing location of first after removal.
120838fd1498Szrj *
120938fd1498Szrj * Removes the characters in the range [first,last) from this
121038fd1498Szrj * string. The value of the string doesn't change if an error
121138fd1498Szrj * is thrown.
121238fd1498Szrj */
121338fd1498Szrj iterator
121438fd1498Szrj #if __cplusplus >= 201103L
121538fd1498Szrj erase(const_iterator __first, const_iterator __last)
121638fd1498Szrj #else
121738fd1498Szrj erase(iterator __first, iterator __last)
121838fd1498Szrj #endif
121938fd1498Szrj {
122038fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last
122138fd1498Szrj && __last <= _M_iend());
122238fd1498Szrj const size_type __pos = __first - _M_ibegin();
122338fd1498Szrj this->_M_erase(__pos, __last - __first);
122438fd1498Szrj this->_M_set_leaked();
122538fd1498Szrj return iterator(this->_M_data() + __pos);
122638fd1498Szrj }
122738fd1498Szrj
122838fd1498Szrj #if __cplusplus >= 201103L
122938fd1498Szrj /**
123038fd1498Szrj * @brief Remove the last character.
123138fd1498Szrj *
123238fd1498Szrj * The string must be non-empty.
123338fd1498Szrj */
123438fd1498Szrj void
123538fd1498Szrj pop_back()
123638fd1498Szrj { this->_M_erase(size()-1, 1); }
123738fd1498Szrj #endif // C++11
123838fd1498Szrj
123938fd1498Szrj /**
124038fd1498Szrj * @brief Replace characters with value from another string.
124138fd1498Szrj * @param __pos Index of first character to replace.
124238fd1498Szrj * @param __n Number of characters to be replaced.
124338fd1498Szrj * @param __str String to insert.
124438fd1498Szrj * @return Reference to this string.
124538fd1498Szrj * @throw std::out_of_range If @a __pos is beyond the end of this
124638fd1498Szrj * string.
124738fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
124838fd1498Szrj *
124938fd1498Szrj * Removes the characters in the range [pos,pos+n) from this
125038fd1498Szrj * string. In place, the value of @a __str is inserted. If @a
125138fd1498Szrj * __pos is beyond end of string, out_of_range is thrown. If
125238fd1498Szrj * the length of the result exceeds max_size(), length_error is
125338fd1498Szrj * thrown. The value of the string doesn't change if an error
125438fd1498Szrj * is thrown.
125538fd1498Szrj */
125638fd1498Szrj __versa_string&
125738fd1498Szrj replace(size_type __pos, size_type __n, const __versa_string& __str)
125838fd1498Szrj { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
125938fd1498Szrj
126038fd1498Szrj /**
126138fd1498Szrj * @brief Replace characters with value from another string.
126238fd1498Szrj * @param __pos1 Index of first character to replace.
126338fd1498Szrj * @param __n1 Number of characters to be replaced.
126438fd1498Szrj * @param __str String to insert.
126538fd1498Szrj * @param __pos2 Index of first character of str to use.
126638fd1498Szrj * @param __n2 Number of characters from str to use.
126738fd1498Szrj * @return Reference to this string.
126838fd1498Szrj * @throw std::out_of_range If @a __pos1 > size() or @a __pos2 >
126938fd1498Szrj * str.size().
127038fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
127138fd1498Szrj *
127238fd1498Szrj * Removes the characters in the range [pos1,pos1 + n) from
127338fd1498Szrj * this string. In place, the value of @a __str is inserted.
127438fd1498Szrj * If @a __pos is beyond end of string, out_of_range is thrown.
127538fd1498Szrj * If the length of the result exceeds max_size(), length_error
127638fd1498Szrj * is thrown. The value of the string doesn't change if an
127738fd1498Szrj * error is thrown.
127838fd1498Szrj */
127938fd1498Szrj __versa_string&
128038fd1498Szrj replace(size_type __pos1, size_type __n1, const __versa_string& __str,
128138fd1498Szrj size_type __pos2, size_type __n2)
128238fd1498Szrj {
128338fd1498Szrj return this->replace(__pos1, __n1, __str._M_data()
128438fd1498Szrj + __str._M_check(__pos2,
128538fd1498Szrj "__versa_string::replace"),
128638fd1498Szrj __str._M_limit(__pos2, __n2));
128738fd1498Szrj }
128838fd1498Szrj
128938fd1498Szrj /**
129038fd1498Szrj * @brief Replace characters with value of a C substring.
129138fd1498Szrj * @param __pos Index of first character to replace.
129238fd1498Szrj * @param __n1 Number of characters to be replaced.
129338fd1498Szrj * @param __s C string to insert.
129438fd1498Szrj * @param __n2 Number of characters from @a __s to use.
129538fd1498Szrj * @return Reference to this string.
129638fd1498Szrj * @throw std::out_of_range If @a __pos1 > size().
129738fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
129838fd1498Szrj *
129938fd1498Szrj * Removes the characters in the range [pos,pos + n1) from this
130038fd1498Szrj * string. In place, the first @a __n2 characters of @a __s
130138fd1498Szrj * are inserted, or all of @a __s if @a __n2 is too large. If
130238fd1498Szrj * @a __pos is beyond end of string, out_of_range is thrown.
130338fd1498Szrj * If the length of result exceeds max_size(), length_error is
130438fd1498Szrj * thrown. The value of the string doesn't change if an error
130538fd1498Szrj * is thrown.
130638fd1498Szrj */
130738fd1498Szrj __versa_string&
130838fd1498Szrj replace(size_type __pos, size_type __n1, const _CharT* __s,
130938fd1498Szrj size_type __n2)
131038fd1498Szrj {
131138fd1498Szrj __glibcxx_requires_string_len(__s, __n2);
131238fd1498Szrj return _M_replace(_M_check(__pos, "__versa_string::replace"),
131338fd1498Szrj _M_limit(__pos, __n1), __s, __n2);
131438fd1498Szrj }
131538fd1498Szrj
131638fd1498Szrj /**
131738fd1498Szrj * @brief Replace characters with value of a C string.
131838fd1498Szrj * @param __pos Index of first character to replace.
131938fd1498Szrj * @param __n1 Number of characters to be replaced.
132038fd1498Szrj * @param __s C string to insert.
132138fd1498Szrj * @return Reference to this string.
132238fd1498Szrj * @throw std::out_of_range If @a __pos > size().
132338fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
132438fd1498Szrj *
132538fd1498Szrj * Removes the characters in the range [pos,pos + n1) from this
132638fd1498Szrj * string. In place, the characters of @a __s are inserted. If
132738fd1498Szrj * @a pos is beyond end of string, out_of_range is thrown. If
132838fd1498Szrj * the length of result exceeds max_size(), length_error is thrown.
132938fd1498Szrj * The value of the string doesn't change if an error is thrown.
133038fd1498Szrj */
133138fd1498Szrj __versa_string&
133238fd1498Szrj replace(size_type __pos, size_type __n1, const _CharT* __s)
133338fd1498Szrj {
133438fd1498Szrj __glibcxx_requires_string(__s);
133538fd1498Szrj return this->replace(__pos, __n1, __s, traits_type::length(__s));
133638fd1498Szrj }
133738fd1498Szrj
133838fd1498Szrj /**
133938fd1498Szrj * @brief Replace characters with multiple characters.
134038fd1498Szrj * @param __pos Index of first character to replace.
134138fd1498Szrj * @param __n1 Number of characters to be replaced.
134238fd1498Szrj * @param __n2 Number of characters to insert.
134338fd1498Szrj * @param __c Character to insert.
134438fd1498Szrj * @return Reference to this string.
134538fd1498Szrj * @throw std::out_of_range If @a __pos > size().
134638fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
134738fd1498Szrj *
134838fd1498Szrj * Removes the characters in the range [pos,pos + n1) from this
134938fd1498Szrj * string. In place, @a __n2 copies of @a __c are inserted.
135038fd1498Szrj * If @a __pos is beyond end of string, out_of_range is thrown.
135138fd1498Szrj * If the length of result exceeds max_size(), length_error is
135238fd1498Szrj * thrown. The value of the string doesn't change if an error
135338fd1498Szrj * is thrown.
135438fd1498Szrj */
135538fd1498Szrj __versa_string&
135638fd1498Szrj replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
135738fd1498Szrj { return _M_replace_aux(_M_check(__pos, "__versa_string::replace"),
135838fd1498Szrj _M_limit(__pos, __n1), __n2, __c); }
135938fd1498Szrj
136038fd1498Szrj /**
136138fd1498Szrj * @brief Replace range of characters with string.
136238fd1498Szrj * @param __i1 Iterator referencing start of range to replace.
136338fd1498Szrj * @param __i2 Iterator referencing end of range to replace.
136438fd1498Szrj * @param __str String value to insert.
136538fd1498Szrj * @return Reference to this string.
136638fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
136738fd1498Szrj *
136838fd1498Szrj * Removes the characters in the range [i1,i2). In place, the
136938fd1498Szrj * value of @a __str is inserted. If the length of result
137038fd1498Szrj * exceeds max_size(), length_error is thrown. The value of
137138fd1498Szrj * the string doesn't change if an error is thrown.
137238fd1498Szrj */
137338fd1498Szrj __versa_string&
137438fd1498Szrj #if __cplusplus >= 201103L
137538fd1498Szrj replace(const_iterator __i1, const_iterator __i2,
137638fd1498Szrj const __versa_string& __str)
137738fd1498Szrj #else
137838fd1498Szrj replace(iterator __i1, iterator __i2, const __versa_string& __str)
137938fd1498Szrj #endif
138038fd1498Szrj { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
138138fd1498Szrj
138238fd1498Szrj /**
138338fd1498Szrj * @brief Replace range of characters with C substring.
138438fd1498Szrj * @param __i1 Iterator referencing start of range to replace.
138538fd1498Szrj * @param __i2 Iterator referencing end of range to replace.
138638fd1498Szrj * @param __s C string value to insert.
138738fd1498Szrj * @param __n Number of characters from s to insert.
138838fd1498Szrj * @return Reference to this string.
138938fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
139038fd1498Szrj *
139138fd1498Szrj * Removes the characters in the range [i1,i2). In place, the
139238fd1498Szrj * first @a n characters of @a __s are inserted. If the length
139338fd1498Szrj * of result exceeds max_size(), length_error is thrown. The
139438fd1498Szrj * value of the string doesn't change if an error is thrown.
139538fd1498Szrj */
139638fd1498Szrj __versa_string&
139738fd1498Szrj #if __cplusplus >= 201103L
139838fd1498Szrj replace(const_iterator __i1, const_iterator __i2,
139938fd1498Szrj const _CharT* __s, size_type __n)
140038fd1498Szrj #else
140138fd1498Szrj replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
140238fd1498Szrj #endif
140338fd1498Szrj {
140438fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
140538fd1498Szrj && __i2 <= _M_iend());
140638fd1498Szrj return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
140738fd1498Szrj }
140838fd1498Szrj
140938fd1498Szrj /**
141038fd1498Szrj * @brief Replace range of characters with C string.
141138fd1498Szrj * @param __i1 Iterator referencing start of range to replace.
141238fd1498Szrj * @param __i2 Iterator referencing end of range to replace.
141338fd1498Szrj * @param __s C string value to insert.
141438fd1498Szrj * @return Reference to this string.
141538fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
141638fd1498Szrj *
141738fd1498Szrj * Removes the characters in the range [i1,i2). In place, the
141838fd1498Szrj * characters of @a __s are inserted. If the length of result
141938fd1498Szrj * exceeds max_size(), length_error is thrown. The value of
142038fd1498Szrj * the string doesn't change if an error is thrown.
142138fd1498Szrj */
142238fd1498Szrj __versa_string&
142338fd1498Szrj #if __cplusplus >= 201103L
142438fd1498Szrj replace(const_iterator __i1, const_iterator __i2, const _CharT* __s)
142538fd1498Szrj #else
142638fd1498Szrj replace(iterator __i1, iterator __i2, const _CharT* __s)
142738fd1498Szrj #endif
142838fd1498Szrj {
142938fd1498Szrj __glibcxx_requires_string(__s);
143038fd1498Szrj return this->replace(__i1, __i2, __s, traits_type::length(__s));
143138fd1498Szrj }
143238fd1498Szrj
143338fd1498Szrj /**
143438fd1498Szrj * @brief Replace range of characters with multiple characters
143538fd1498Szrj * @param __i1 Iterator referencing start of range to replace.
143638fd1498Szrj * @param __i2 Iterator referencing end of range to replace.
143738fd1498Szrj * @param __n Number of characters to insert.
143838fd1498Szrj * @param __c Character to insert.
143938fd1498Szrj * @return Reference to this string.
144038fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
144138fd1498Szrj *
144238fd1498Szrj * Removes the characters in the range [i1,i2). In place, @a
144338fd1498Szrj * __n copies of @a __c are inserted. If the length of result
144438fd1498Szrj * exceeds max_size(), length_error is thrown. The value of
144538fd1498Szrj * the string doesn't change if an error is thrown.
144638fd1498Szrj */
144738fd1498Szrj __versa_string&
144838fd1498Szrj #if __cplusplus >= 201103L
144938fd1498Szrj replace(const_iterator __i1, const_iterator __i2, size_type __n,
145038fd1498Szrj _CharT __c)
145138fd1498Szrj #else
145238fd1498Szrj replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
145338fd1498Szrj #endif
145438fd1498Szrj {
145538fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
145638fd1498Szrj && __i2 <= _M_iend());
145738fd1498Szrj return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
145838fd1498Szrj }
145938fd1498Szrj
146038fd1498Szrj /**
146138fd1498Szrj * @brief Replace range of characters with range.
146238fd1498Szrj * @param __i1 Iterator referencing start of range to replace.
146338fd1498Szrj * @param __i2 Iterator referencing end of range to replace.
146438fd1498Szrj * @param __k1 Iterator referencing start of range to insert.
146538fd1498Szrj * @param __k2 Iterator referencing end of range to insert.
146638fd1498Szrj * @return Reference to this string.
146738fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
146838fd1498Szrj *
146938fd1498Szrj * Removes the characters in the range [i1,i2). In place,
147038fd1498Szrj * characters in the range [k1,k2) are inserted. If the length
147138fd1498Szrj * of result exceeds max_size(), length_error is thrown. The
147238fd1498Szrj * value of the string doesn't change if an error is thrown.
147338fd1498Szrj */
147438fd1498Szrj #if __cplusplus >= 201103L
147538fd1498Szrj template<class _InputIterator,
147638fd1498Szrj typename = std::_RequireInputIter<_InputIterator>>
147738fd1498Szrj __versa_string&
147838fd1498Szrj replace(const_iterator __i1, const_iterator __i2,
147938fd1498Szrj _InputIterator __k1, _InputIterator __k2)
148038fd1498Szrj {
148138fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
148238fd1498Szrj && __i2 <= _M_iend());
148338fd1498Szrj __glibcxx_requires_valid_range(__k1, __k2);
148438fd1498Szrj return this->_M_replace_dispatch(__i1, __i2, __k1, __k2,
148538fd1498Szrj std::__false_type());
148638fd1498Szrj }
148738fd1498Szrj #else
148838fd1498Szrj template<class _InputIterator>
148938fd1498Szrj __versa_string&
149038fd1498Szrj replace(iterator __i1, iterator __i2,
149138fd1498Szrj _InputIterator __k1, _InputIterator __k2)
149238fd1498Szrj {
149338fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
149438fd1498Szrj && __i2 <= _M_iend());
149538fd1498Szrj __glibcxx_requires_valid_range(__k1, __k2);
149638fd1498Szrj typedef typename std::__is_integer<_InputIterator>::__type _Integral;
149738fd1498Szrj return this->_M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
149838fd1498Szrj }
149938fd1498Szrj #endif
150038fd1498Szrj
150138fd1498Szrj // Specializations for the common case of pointer and iterator:
150238fd1498Szrj // useful to avoid the overhead of temporary buffering in _M_replace.
150338fd1498Szrj __versa_string&
150438fd1498Szrj #if __cplusplus >= 201103L
150538fd1498Szrj replace(const_iterator __i1, const_iterator __i2,
150638fd1498Szrj _CharT* __k1, _CharT* __k2)
150738fd1498Szrj #else
150838fd1498Szrj replace(iterator __i1, iterator __i2,
150938fd1498Szrj _CharT* __k1, _CharT* __k2)
151038fd1498Szrj #endif
151138fd1498Szrj {
151238fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
151338fd1498Szrj && __i2 <= _M_iend());
151438fd1498Szrj __glibcxx_requires_valid_range(__k1, __k2);
151538fd1498Szrj return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
151638fd1498Szrj __k1, __k2 - __k1);
151738fd1498Szrj }
151838fd1498Szrj
151938fd1498Szrj __versa_string&
152038fd1498Szrj #if __cplusplus >= 201103L
152138fd1498Szrj replace(const_iterator __i1, const_iterator __i2,
152238fd1498Szrj const _CharT* __k1, const _CharT* __k2)
152338fd1498Szrj #else
152438fd1498Szrj replace(iterator __i1, iterator __i2,
152538fd1498Szrj const _CharT* __k1, const _CharT* __k2)
152638fd1498Szrj #endif
152738fd1498Szrj {
152838fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
152938fd1498Szrj && __i2 <= _M_iend());
153038fd1498Szrj __glibcxx_requires_valid_range(__k1, __k2);
153138fd1498Szrj return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
153238fd1498Szrj __k1, __k2 - __k1);
153338fd1498Szrj }
153438fd1498Szrj
153538fd1498Szrj __versa_string&
153638fd1498Szrj #if __cplusplus >= 201103L
153738fd1498Szrj replace(const_iterator __i1, const_iterator __i2,
153838fd1498Szrj iterator __k1, iterator __k2)
153938fd1498Szrj #else
154038fd1498Szrj replace(iterator __i1, iterator __i2,
154138fd1498Szrj iterator __k1, iterator __k2)
154238fd1498Szrj #endif
154338fd1498Szrj {
154438fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
154538fd1498Szrj && __i2 <= _M_iend());
154638fd1498Szrj __glibcxx_requires_valid_range(__k1, __k2);
154738fd1498Szrj return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
154838fd1498Szrj __k1.base(), __k2 - __k1);
154938fd1498Szrj }
155038fd1498Szrj
155138fd1498Szrj __versa_string&
155238fd1498Szrj #if __cplusplus >= 201103L
155338fd1498Szrj replace(const_iterator __i1, const_iterator __i2,
155438fd1498Szrj const_iterator __k1, const_iterator __k2)
155538fd1498Szrj #else
155638fd1498Szrj replace(iterator __i1, iterator __i2,
155738fd1498Szrj const_iterator __k1, const_iterator __k2)
155838fd1498Szrj #endif
155938fd1498Szrj {
156038fd1498Szrj _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
156138fd1498Szrj && __i2 <= _M_iend());
156238fd1498Szrj __glibcxx_requires_valid_range(__k1, __k2);
156338fd1498Szrj return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
156438fd1498Szrj __k1.base(), __k2 - __k1);
156538fd1498Szrj }
156638fd1498Szrj
156738fd1498Szrj #if __cplusplus >= 201103L
156838fd1498Szrj /**
156938fd1498Szrj * @brief Replace range of characters with initializer_list.
157038fd1498Szrj * @param __i1 Iterator referencing start of range to replace.
157138fd1498Szrj * @param __i2 Iterator referencing end of range to replace.
157238fd1498Szrj * @param __l The initializer_list of characters to insert.
157338fd1498Szrj * @return Reference to this string.
157438fd1498Szrj * @throw std::length_error If new length exceeds @c max_size().
157538fd1498Szrj *
157638fd1498Szrj * Removes the characters in the range [i1,i2). In place,
157738fd1498Szrj * characters in the range [k1,k2) are inserted. If the length
157838fd1498Szrj * of result exceeds max_size(), length_error is thrown. The
157938fd1498Szrj * value of the string doesn't change if an error is thrown.
158038fd1498Szrj */
158138fd1498Szrj __versa_string&
158238fd1498Szrj replace(const_iterator __i1, const_iterator __i2,
158338fd1498Szrj std::initializer_list<_CharT> __l)
158438fd1498Szrj { return this->replace(__i1, __i2, __l.begin(), __l.end()); }
158538fd1498Szrj #endif // C++11
158638fd1498Szrj
158738fd1498Szrj private:
158838fd1498Szrj template<class _Integer>
158938fd1498Szrj __versa_string&
159038fd1498Szrj _M_replace_dispatch(const_iterator __i1, const_iterator __i2,
159138fd1498Szrj _Integer __n, _Integer __val, std::__true_type)
159238fd1498Szrj { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
159338fd1498Szrj
159438fd1498Szrj template<class _InputIterator>
159538fd1498Szrj __versa_string&
159638fd1498Szrj _M_replace_dispatch(const_iterator __i1, const_iterator __i2,
159738fd1498Szrj _InputIterator __k1, _InputIterator __k2,
159838fd1498Szrj std::__false_type);
159938fd1498Szrj
160038fd1498Szrj __versa_string&
160138fd1498Szrj _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
160238fd1498Szrj _CharT __c);
160338fd1498Szrj
160438fd1498Szrj __versa_string&
160538fd1498Szrj _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
160638fd1498Szrj const size_type __len2);
160738fd1498Szrj
160838fd1498Szrj __versa_string&
160938fd1498Szrj _M_append(const _CharT* __s, size_type __n);
161038fd1498Szrj
161138fd1498Szrj public:
161238fd1498Szrj
161338fd1498Szrj /**
161438fd1498Szrj * @brief Copy substring into C string.
161538fd1498Szrj * @param __s C string to copy value into.
161638fd1498Szrj * @param __n Number of characters to copy.
161738fd1498Szrj * @param __pos Index of first character to copy.
161838fd1498Szrj * @return Number of characters actually copied
161938fd1498Szrj * @throw std::out_of_range If pos > size().
162038fd1498Szrj *
162138fd1498Szrj * Copies up to @a __n characters starting at @a __pos into the
162238fd1498Szrj * C string @a s. If @a __pos is greater than size(),
162338fd1498Szrj * out_of_range is thrown.
162438fd1498Szrj */
162538fd1498Szrj size_type
162638fd1498Szrj copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
162738fd1498Szrj
162838fd1498Szrj /**
162938fd1498Szrj * @brief Swap contents with another string.
163038fd1498Szrj * @param __s String to swap with.
163138fd1498Szrj *
163238fd1498Szrj * Exchanges the contents of this string with that of @a __s in
163338fd1498Szrj * constant time.
163438fd1498Szrj */
163538fd1498Szrj void
163638fd1498Szrj swap(__versa_string& __s) _GLIBCXX_NOEXCEPT
163738fd1498Szrj { this->_M_swap(__s); }
163838fd1498Szrj
163938fd1498Szrj // String operations:
164038fd1498Szrj /**
164138fd1498Szrj * @brief Return const pointer to null-terminated contents.
164238fd1498Szrj *
164338fd1498Szrj * This is a handle to internal data. Do not modify or dire things may
164438fd1498Szrj * happen.
164538fd1498Szrj */
164638fd1498Szrj const _CharT*
164738fd1498Szrj c_str() const _GLIBCXX_NOEXCEPT
164838fd1498Szrj { return this->_M_data(); }
164938fd1498Szrj
165038fd1498Szrj /**
165138fd1498Szrj * @brief Return const pointer to contents.
165238fd1498Szrj *
165338fd1498Szrj * This is a handle to internal data. Do not modify or dire things may
165438fd1498Szrj * happen.
165538fd1498Szrj */
165638fd1498Szrj const _CharT*
165738fd1498Szrj data() const _GLIBCXX_NOEXCEPT
165838fd1498Szrj { return this->_M_data(); }
165938fd1498Szrj
166038fd1498Szrj /**
166138fd1498Szrj * @brief Return copy of allocator used to construct this string.
166238fd1498Szrj */
166338fd1498Szrj allocator_type
166438fd1498Szrj get_allocator() const _GLIBCXX_NOEXCEPT
166538fd1498Szrj { return allocator_type(this->_M_get_allocator()); }
166638fd1498Szrj
166738fd1498Szrj /**
166838fd1498Szrj * @brief Find position of a C substring.
166938fd1498Szrj * @param __s C string to locate.
167038fd1498Szrj * @param __pos Index of character to search from.
167138fd1498Szrj * @param __n Number of characters from @a __s to search for.
167238fd1498Szrj * @return Index of start of first occurrence.
167338fd1498Szrj *
167438fd1498Szrj * Starting from @a __pos, searches forward for the first @a
167538fd1498Szrj * __n characters in @a __s within this string. If found,
167638fd1498Szrj * returns the index where it begins. If not found, returns
167738fd1498Szrj * npos.
167838fd1498Szrj */
167938fd1498Szrj size_type
168038fd1498Szrj find(const _CharT* __s, size_type __pos, size_type __n) const;
168138fd1498Szrj
168238fd1498Szrj /**
168338fd1498Szrj * @brief Find position of a string.
168438fd1498Szrj * @param __str String to locate.
168538fd1498Szrj * @param __pos Index of character to search from (default 0).
168638fd1498Szrj * @return Index of start of first occurrence.
168738fd1498Szrj *
168838fd1498Szrj * Starting from @a __pos, searches forward for value of @a
168938fd1498Szrj * __str within this string. If found, returns the index where
169038fd1498Szrj * it begins. If not found, returns npos.
169138fd1498Szrj */
169238fd1498Szrj size_type
169338fd1498Szrj find(const __versa_string& __str, size_type __pos = 0) const
169438fd1498Szrj _GLIBCXX_NOEXCEPT
169538fd1498Szrj { return this->find(__str.data(), __pos, __str.size()); }
169638fd1498Szrj
169738fd1498Szrj /**
169838fd1498Szrj * @brief Find position of a C string.
169938fd1498Szrj * @param __s C string to locate.
170038fd1498Szrj * @param __pos Index of character to search from (default 0).
170138fd1498Szrj * @return Index of start of first occurrence.
170238fd1498Szrj *
170338fd1498Szrj * Starting from @a __pos, searches forward for the value of @a
170438fd1498Szrj * __s within this string. If found, returns the index where
170538fd1498Szrj * it begins. If not found, returns npos.
170638fd1498Szrj */
170738fd1498Szrj size_type
170838fd1498Szrj find(const _CharT* __s, size_type __pos = 0) const
170938fd1498Szrj {
171038fd1498Szrj __glibcxx_requires_string(__s);
171138fd1498Szrj return this->find(__s, __pos, traits_type::length(__s));
171238fd1498Szrj }
171338fd1498Szrj
171438fd1498Szrj /**
171538fd1498Szrj * @brief Find position of a character.
171638fd1498Szrj * @param __c Character to locate.
171738fd1498Szrj * @param __pos Index of character to search from (default 0).
171838fd1498Szrj * @return Index of first occurrence.
171938fd1498Szrj *
172038fd1498Szrj * Starting from @a __pos, searches forward for @a __c within
172138fd1498Szrj * this string. If found, returns the index where it was
172238fd1498Szrj * found. If not found, returns npos.
172338fd1498Szrj */
172438fd1498Szrj size_type
172538fd1498Szrj find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
172638fd1498Szrj
172738fd1498Szrj /**
172838fd1498Szrj * @brief Find last position of a string.
172938fd1498Szrj * @param __str String to locate.
173038fd1498Szrj * @param __pos Index of character to search back from (default end).
173138fd1498Szrj * @return Index of start of last occurrence.
173238fd1498Szrj *
173338fd1498Szrj * Starting from @a __pos, searches backward for value of @a
173438fd1498Szrj * __str within this string. If found, returns the index where
173538fd1498Szrj * it begins. If not found, returns npos.
173638fd1498Szrj */
173738fd1498Szrj size_type
173838fd1498Szrj rfind(const __versa_string& __str, size_type __pos = npos) const
173938fd1498Szrj _GLIBCXX_NOEXCEPT
174038fd1498Szrj { return this->rfind(__str.data(), __pos, __str.size()); }
174138fd1498Szrj
174238fd1498Szrj /**
174338fd1498Szrj * @brief Find last position of a C substring.
174438fd1498Szrj * @param __s C string to locate.
174538fd1498Szrj * @param __pos Index of character to search back from.
174638fd1498Szrj * @param __n Number of characters from s to search for.
174738fd1498Szrj * @return Index of start of last occurrence.
174838fd1498Szrj *
174938fd1498Szrj * Starting from @a __pos, searches backward for the first @a
175038fd1498Szrj * __n characters in @a __s within this string. If found,
175138fd1498Szrj * returns the index where it begins. If not found, returns
175238fd1498Szrj * npos.
175338fd1498Szrj */
175438fd1498Szrj size_type
175538fd1498Szrj rfind(const _CharT* __s, size_type __pos, size_type __n) const;
175638fd1498Szrj
175738fd1498Szrj /**
175838fd1498Szrj * @brief Find last position of a C string.
175938fd1498Szrj * @param __s C string to locate.
176038fd1498Szrj * @param __pos Index of character to start search at (default end).
176138fd1498Szrj * @return Index of start of last occurrence.
176238fd1498Szrj *
176338fd1498Szrj * Starting from @a __pos, searches backward for the value of
176438fd1498Szrj * @a __s within this string. If found, returns the index
176538fd1498Szrj * where it begins. If not found, returns npos.
176638fd1498Szrj */
176738fd1498Szrj size_type
176838fd1498Szrj rfind(const _CharT* __s, size_type __pos = npos) const
176938fd1498Szrj {
177038fd1498Szrj __glibcxx_requires_string(__s);
177138fd1498Szrj return this->rfind(__s, __pos, traits_type::length(__s));
177238fd1498Szrj }
177338fd1498Szrj
177438fd1498Szrj /**
177538fd1498Szrj * @brief Find last position of a character.
177638fd1498Szrj * @param __c Character to locate.
177738fd1498Szrj * @param __pos Index of character to search back from (default end).
177838fd1498Szrj * @return Index of last occurrence.
177938fd1498Szrj *
178038fd1498Szrj * Starting from @a __pos, searches backward for @a __c within
178138fd1498Szrj * this string. If found, returns the index where it was
178238fd1498Szrj * found. If not found, returns npos.
178338fd1498Szrj */
178438fd1498Szrj size_type
178538fd1498Szrj rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
178638fd1498Szrj
178738fd1498Szrj /**
178838fd1498Szrj * @brief Find position of a character of string.
178938fd1498Szrj * @param __str String containing characters to locate.
179038fd1498Szrj * @param __pos Index of character to search from (default 0).
179138fd1498Szrj * @return Index of first occurrence.
179238fd1498Szrj *
179338fd1498Szrj * Starting from @a __pos, searches forward for one of the characters of
179438fd1498Szrj * @a __str within this string. If found, returns the index where it was
179538fd1498Szrj * found. If not found, returns npos.
179638fd1498Szrj */
179738fd1498Szrj size_type
179838fd1498Szrj find_first_of(const __versa_string& __str, size_type __pos = 0) const
179938fd1498Szrj _GLIBCXX_NOEXCEPT
180038fd1498Szrj { return this->find_first_of(__str.data(), __pos, __str.size()); }
180138fd1498Szrj
180238fd1498Szrj /**
180338fd1498Szrj * @brief Find position of a character of C substring.
180438fd1498Szrj * @param __s String containing characters to locate.
180538fd1498Szrj * @param __pos Index of character to search from.
180638fd1498Szrj * @param __n Number of characters from s to search for.
180738fd1498Szrj * @return Index of first occurrence.
180838fd1498Szrj *
180938fd1498Szrj * Starting from @a __pos, searches forward for one of the
181038fd1498Szrj * first @a __n characters of @a __s within this string. If
181138fd1498Szrj * found, returns the index where it was found. If not found,
181238fd1498Szrj * returns npos.
181338fd1498Szrj */
181438fd1498Szrj size_type
181538fd1498Szrj find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
181638fd1498Szrj
181738fd1498Szrj /**
181838fd1498Szrj * @brief Find position of a character of C string.
181938fd1498Szrj * @param __s String containing characters to locate.
182038fd1498Szrj * @param __pos Index of character to search from (default 0).
182138fd1498Szrj * @return Index of first occurrence.
182238fd1498Szrj *
182338fd1498Szrj * Starting from @a __pos, searches forward for one of the
182438fd1498Szrj * characters of @a __s within this string. If found, returns
182538fd1498Szrj * the index where it was found. If not found, returns npos.
182638fd1498Szrj */
182738fd1498Szrj size_type
182838fd1498Szrj find_first_of(const _CharT* __s, size_type __pos = 0) const
182938fd1498Szrj {
183038fd1498Szrj __glibcxx_requires_string(__s);
183138fd1498Szrj return this->find_first_of(__s, __pos, traits_type::length(__s));
183238fd1498Szrj }
183338fd1498Szrj
183438fd1498Szrj /**
183538fd1498Szrj * @brief Find position of a character.
183638fd1498Szrj * @param __c Character to locate.
183738fd1498Szrj * @param __pos Index of character to search from (default 0).
183838fd1498Szrj * @return Index of first occurrence.
183938fd1498Szrj *
184038fd1498Szrj * Starting from @a __pos, searches forward for the character
184138fd1498Szrj * @a __c within this string. If found, returns the index
184238fd1498Szrj * where it was found. If not found, returns npos.
184338fd1498Szrj *
184438fd1498Szrj * Note: equivalent to find(c, pos).
184538fd1498Szrj */
184638fd1498Szrj size_type
184738fd1498Szrj find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
184838fd1498Szrj { return this->find(__c, __pos); }
184938fd1498Szrj
185038fd1498Szrj /**
185138fd1498Szrj * @brief Find last position of a character of string.
185238fd1498Szrj * @param __str String containing characters to locate.
185338fd1498Szrj * @param __pos Index of character to search back from (default end).
185438fd1498Szrj * @return Index of last occurrence.
185538fd1498Szrj *
185638fd1498Szrj * Starting from @a __pos, searches backward for one of the
185738fd1498Szrj * characters of @a __str within this string. If found,
185838fd1498Szrj * returns the index where it was found. If not found, returns
185938fd1498Szrj * npos.
186038fd1498Szrj */
186138fd1498Szrj size_type
186238fd1498Szrj find_last_of(const __versa_string& __str, size_type __pos = npos) const
186338fd1498Szrj _GLIBCXX_NOEXCEPT
186438fd1498Szrj { return this->find_last_of(__str.data(), __pos, __str.size()); }
186538fd1498Szrj
186638fd1498Szrj /**
186738fd1498Szrj * @brief Find last position of a character of C substring.
186838fd1498Szrj * @param __s C string containing characters to locate.
186938fd1498Szrj * @param __pos Index of character to search back from.
187038fd1498Szrj * @param __n Number of characters from s to search for.
187138fd1498Szrj * @return Index of last occurrence.
187238fd1498Szrj *
187338fd1498Szrj * Starting from @a __pos, searches backward for one of the
187438fd1498Szrj * first @a __n characters of @a __s within this string. If
187538fd1498Szrj * found, returns the index where it was found. If not found,
187638fd1498Szrj * returns npos.
187738fd1498Szrj */
187838fd1498Szrj size_type
187938fd1498Szrj find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
188038fd1498Szrj
188138fd1498Szrj /**
188238fd1498Szrj * @brief Find last position of a character of C string.
188338fd1498Szrj * @param __s C string containing characters to locate.
188438fd1498Szrj * @param __pos Index of character to search back from (default end).
188538fd1498Szrj * @return Index of last occurrence.
188638fd1498Szrj *
188738fd1498Szrj * Starting from @a __pos, searches backward for one of the
188838fd1498Szrj * characters of @a __s within this string. If found, returns
188938fd1498Szrj * the index where it was found. If not found, returns npos.
189038fd1498Szrj */
189138fd1498Szrj size_type
189238fd1498Szrj find_last_of(const _CharT* __s, size_type __pos = npos) const
189338fd1498Szrj {
189438fd1498Szrj __glibcxx_requires_string(__s);
189538fd1498Szrj return this->find_last_of(__s, __pos, traits_type::length(__s));
189638fd1498Szrj }
189738fd1498Szrj
189838fd1498Szrj /**
189938fd1498Szrj * @brief Find last position of a character.
190038fd1498Szrj * @param __c Character to locate.
190138fd1498Szrj * @param __pos Index of character to search back from (default end).
190238fd1498Szrj * @return Index of last occurrence.
190338fd1498Szrj *
190438fd1498Szrj * Starting from @a __pos, searches backward for @a __c within
190538fd1498Szrj * this string. If found, returns the index where it was
190638fd1498Szrj * found. If not found, returns npos.
190738fd1498Szrj *
190838fd1498Szrj * Note: equivalent to rfind(c, pos).
190938fd1498Szrj */
191038fd1498Szrj size_type
191138fd1498Szrj find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
191238fd1498Szrj { return this->rfind(__c, __pos); }
191338fd1498Szrj
191438fd1498Szrj /**
191538fd1498Szrj * @brief Find position of a character not in string.
191638fd1498Szrj * @param __str String containing characters to avoid.
191738fd1498Szrj * @param __pos Index of character to search from (default 0).
191838fd1498Szrj * @return Index of first occurrence.
191938fd1498Szrj *
192038fd1498Szrj * Starting from @a __pos, searches forward for a character not
192138fd1498Szrj * contained in @a __str within this string. If found, returns
192238fd1498Szrj * the index where it was found. If not found, returns npos.
192338fd1498Szrj */
192438fd1498Szrj size_type
192538fd1498Szrj find_first_not_of(const __versa_string& __str, size_type __pos = 0) const
192638fd1498Szrj _GLIBCXX_NOEXCEPT
192738fd1498Szrj { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
192838fd1498Szrj
192938fd1498Szrj /**
193038fd1498Szrj * @brief Find position of a character not in C substring.
193138fd1498Szrj * @param __s C string containing characters to avoid.
193238fd1498Szrj * @param __pos Index of character to search from.
193338fd1498Szrj * @param __n Number of characters from s to consider.
193438fd1498Szrj * @return Index of first occurrence.
193538fd1498Szrj *
193638fd1498Szrj * Starting from @a __pos, searches forward for a character not
193738fd1498Szrj * contained in the first @a __n characters of @a __s within
193838fd1498Szrj * this string. If found, returns the index where it was
193938fd1498Szrj * found. If not found, returns npos.
194038fd1498Szrj */
194138fd1498Szrj size_type
194238fd1498Szrj find_first_not_of(const _CharT* __s, size_type __pos,
194338fd1498Szrj size_type __n) const;
194438fd1498Szrj
194538fd1498Szrj /**
194638fd1498Szrj * @brief Find position of a character not in C string.
194738fd1498Szrj * @param __s C string containing characters to avoid.
194838fd1498Szrj * @param __pos Index of character to search from (default 0).
194938fd1498Szrj * @return Index of first occurrence.
195038fd1498Szrj *
195138fd1498Szrj * Starting from @a __pos, searches forward for a character not
195238fd1498Szrj * contained in @a __s within this string. If found, returns
195338fd1498Szrj * the index where it was found. If not found, returns npos.
195438fd1498Szrj */
195538fd1498Szrj size_type
195638fd1498Szrj find_first_not_of(const _CharT* __s, size_type __pos = 0) const
195738fd1498Szrj {
195838fd1498Szrj __glibcxx_requires_string(__s);
195938fd1498Szrj return this->find_first_not_of(__s, __pos, traits_type::length(__s));
196038fd1498Szrj }
196138fd1498Szrj
196238fd1498Szrj /**
196338fd1498Szrj * @brief Find position of a different character.
196438fd1498Szrj * @param __c Character to avoid.
196538fd1498Szrj * @param __pos Index of character to search from (default 0).
196638fd1498Szrj * @return Index of first occurrence.
196738fd1498Szrj *
196838fd1498Szrj * Starting from @a __pos, searches forward for a character
196938fd1498Szrj * other than @a __c within this string. If found, returns the
197038fd1498Szrj * index where it was found. If not found, returns npos.
197138fd1498Szrj */
197238fd1498Szrj size_type
197338fd1498Szrj find_first_not_of(_CharT __c, size_type __pos = 0) const
197438fd1498Szrj _GLIBCXX_NOEXCEPT;
197538fd1498Szrj
197638fd1498Szrj /**
197738fd1498Szrj * @brief Find last position of a character not in string.
197838fd1498Szrj * @param __str String containing characters to avoid.
197938fd1498Szrj * @param __pos Index of character to search back from (default end).
198038fd1498Szrj * @return Index of last occurrence.
198138fd1498Szrj *
198238fd1498Szrj * Starting from @a __pos, searches backward for a character
198338fd1498Szrj * not contained in @a __str within this string. If found,
198438fd1498Szrj * returns the index where it was found. If not found, returns
198538fd1498Szrj * npos.
198638fd1498Szrj */
198738fd1498Szrj size_type
198838fd1498Szrj find_last_not_of(const __versa_string& __str,
198938fd1498Szrj size_type __pos = npos) const _GLIBCXX_NOEXCEPT
199038fd1498Szrj { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
199138fd1498Szrj
199238fd1498Szrj /**
199338fd1498Szrj * @brief Find last position of a character not in C substring.
199438fd1498Szrj * @param __s C string containing characters to avoid.
199538fd1498Szrj * @param __pos Index of character to search back from.
199638fd1498Szrj * @param __n Number of characters from s to consider.
199738fd1498Szrj * @return Index of last occurrence.
199838fd1498Szrj *
199938fd1498Szrj * Starting from @a __pos, searches backward for a character
200038fd1498Szrj * not contained in the first @a __n characters of @a __s
200138fd1498Szrj * within this string. If found, returns the index where it
200238fd1498Szrj * was found. If not found, returns npos.
200338fd1498Szrj */
200438fd1498Szrj size_type
200538fd1498Szrj find_last_not_of(const _CharT* __s, size_type __pos,
200638fd1498Szrj size_type __n) const;
200738fd1498Szrj /**
200838fd1498Szrj * @brief Find last position of a character not in C string.
200938fd1498Szrj * @param __s C string containing characters to avoid.
201038fd1498Szrj * @param __pos Index of character to search back from (default end).
201138fd1498Szrj * @return Index of last occurrence.
201238fd1498Szrj *
201338fd1498Szrj * Starting from @a __pos, searches backward for a character
201438fd1498Szrj * not contained in @a __s within this string. If found,
201538fd1498Szrj * returns the index where it was found. If not found, returns
201638fd1498Szrj * npos.
201738fd1498Szrj */
201838fd1498Szrj size_type
201938fd1498Szrj find_last_not_of(const _CharT* __s, size_type __pos = npos) const
202038fd1498Szrj {
202138fd1498Szrj __glibcxx_requires_string(__s);
202238fd1498Szrj return this->find_last_not_of(__s, __pos, traits_type::length(__s));
202338fd1498Szrj }
202438fd1498Szrj
202538fd1498Szrj /**
202638fd1498Szrj * @brief Find last position of a different character.
202738fd1498Szrj * @param __c Character to avoid.
202838fd1498Szrj * @param __pos Index of character to search back from (default end).
202938fd1498Szrj * @return Index of last occurrence.
203038fd1498Szrj *
203138fd1498Szrj * Starting from @a __pos, searches backward for a character
203238fd1498Szrj * other than @a __c within this string. If found, returns the
203338fd1498Szrj * index where it was found. If not found, returns npos.
203438fd1498Szrj */
203538fd1498Szrj size_type
203638fd1498Szrj find_last_not_of(_CharT __c, size_type __pos = npos) const
203738fd1498Szrj _GLIBCXX_NOEXCEPT;
203838fd1498Szrj
203938fd1498Szrj /**
204038fd1498Szrj * @brief Get a substring.
204138fd1498Szrj * @param __pos Index of first character (default 0).
204238fd1498Szrj * @param __n Number of characters in substring (default remainder).
204338fd1498Szrj * @return The new string.
204438fd1498Szrj * @throw std::out_of_range If pos > size().
204538fd1498Szrj *
204638fd1498Szrj * Construct and return a new string using the @a __n
204738fd1498Szrj * characters starting at @a __pos. If the string is too
204838fd1498Szrj * short, use the remainder of the characters. If @a __pos is
204938fd1498Szrj * beyond the end of the string, out_of_range is thrown.
205038fd1498Szrj */
205138fd1498Szrj __versa_string
205238fd1498Szrj substr(size_type __pos = 0, size_type __n = npos) const
205338fd1498Szrj {
205438fd1498Szrj return __versa_string(*this, _M_check(__pos, "__versa_string::substr"),
205538fd1498Szrj __n);
205638fd1498Szrj }
205738fd1498Szrj
205838fd1498Szrj /**
205938fd1498Szrj * @brief Compare to a string.
206038fd1498Szrj * @param __str String to compare against.
206138fd1498Szrj * @return Integer < 0, 0, or > 0.
206238fd1498Szrj *
206338fd1498Szrj * Returns an integer < 0 if this string is ordered before @a
206438fd1498Szrj * __str, 0 if their values are equivalent, or > 0 if this
206538fd1498Szrj * string is ordered after @a __str. Determines the effective
206638fd1498Szrj * length rlen of the strings to compare as the smallest of
206738fd1498Szrj * size() and str.size(). The function then compares the two
206838fd1498Szrj * strings by calling traits::compare(data(), str.data(),rlen).
206938fd1498Szrj * If the result of the comparison is nonzero returns it,
207038fd1498Szrj * otherwise the shorter one is ordered first.
207138fd1498Szrj */
207238fd1498Szrj int
207338fd1498Szrj compare(const __versa_string& __str) const
207438fd1498Szrj {
207538fd1498Szrj if (this->_M_compare(__str))
207638fd1498Szrj return 0;
207738fd1498Szrj
207838fd1498Szrj const size_type __size = this->size();
207938fd1498Szrj const size_type __osize = __str.size();
208038fd1498Szrj const size_type __len = std::min(__size, __osize);
208138fd1498Szrj
208238fd1498Szrj int __r = traits_type::compare(this->_M_data(), __str.data(), __len);
208338fd1498Szrj if (!__r)
208438fd1498Szrj __r = this->_S_compare(__size, __osize);
208538fd1498Szrj return __r;
208638fd1498Szrj }
208738fd1498Szrj
208838fd1498Szrj /**
208938fd1498Szrj * @brief Compare substring to a string.
209038fd1498Szrj * @param __pos Index of first character of substring.
209138fd1498Szrj * @param __n Number of characters in substring.
209238fd1498Szrj * @param __str String to compare against.
209338fd1498Szrj * @return Integer < 0, 0, or > 0.
209438fd1498Szrj *
209538fd1498Szrj * Form the substring of this string from the @a __n characters
209638fd1498Szrj * starting at @a __pos. Returns an integer < 0 if the
209738fd1498Szrj * substring is ordered before @a __str, 0 if their values are
209838fd1498Szrj * equivalent, or > 0 if the substring is ordered after @a
209938fd1498Szrj * __str. Determines the effective length rlen of the strings
210038fd1498Szrj * to compare as the smallest of the length of the substring
210138fd1498Szrj * and @a __str.size(). The function then compares the two
210238fd1498Szrj * strings by calling
210338fd1498Szrj * traits::compare(substring.data(),str.data(),rlen). If the
210438fd1498Szrj * result of the comparison is nonzero returns it, otherwise
210538fd1498Szrj * the shorter one is ordered first.
210638fd1498Szrj */
210738fd1498Szrj int
210838fd1498Szrj compare(size_type __pos, size_type __n,
210938fd1498Szrj const __versa_string& __str) const;
211038fd1498Szrj
211138fd1498Szrj /**
211238fd1498Szrj * @brief Compare substring to a substring.
211338fd1498Szrj * @param __pos1 Index of first character of substring.
211438fd1498Szrj * @param __n1 Number of characters in substring.
211538fd1498Szrj * @param __str String to compare against.
211638fd1498Szrj * @param __pos2 Index of first character of substring of str.
211738fd1498Szrj * @param __n2 Number of characters in substring of str.
211838fd1498Szrj * @return Integer < 0, 0, or > 0.
211938fd1498Szrj *
212038fd1498Szrj * Form the substring of this string from the @a __n1
212138fd1498Szrj * characters starting at @a __pos1. Form the substring of @a
212238fd1498Szrj * __str from the @a __n2 characters starting at @a __pos2.
212338fd1498Szrj * Returns an integer < 0 if this substring is ordered before
212438fd1498Szrj * the substring of @a __str, 0 if their values are equivalent,
212538fd1498Szrj * or > 0 if this substring is ordered after the substring of
212638fd1498Szrj * @a __str. Determines the effective length rlen of the
212738fd1498Szrj * strings to compare as the smallest of the lengths of the
212838fd1498Szrj * substrings. The function then compares the two strings by
212938fd1498Szrj * calling
213038fd1498Szrj * traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
213138fd1498Szrj * If the result of the comparison is nonzero returns it,
213238fd1498Szrj * otherwise the shorter one is ordered first.
213338fd1498Szrj */
213438fd1498Szrj int
213538fd1498Szrj compare(size_type __pos1, size_type __n1, const __versa_string& __str,
213638fd1498Szrj size_type __pos2, size_type __n2) const;
213738fd1498Szrj
213838fd1498Szrj /**
213938fd1498Szrj * @brief Compare to a C string.
214038fd1498Szrj * @param __s C string to compare against.
214138fd1498Szrj * @return Integer < 0, 0, or > 0.
214238fd1498Szrj *
214338fd1498Szrj * Returns an integer < 0 if this string is ordered before @a
214438fd1498Szrj * __s, 0 if their values are equivalent, or > 0 if this string
214538fd1498Szrj * is ordered after @a __s. Determines the effective length
214638fd1498Szrj * rlen of the strings to compare as the smallest of size() and
214738fd1498Szrj * the length of a string constructed from @a __s. The
214838fd1498Szrj * function then compares the two strings by calling
214938fd1498Szrj * traits::compare(data(),s,rlen). If the result of the
215038fd1498Szrj * comparison is nonzero returns it, otherwise the shorter one
215138fd1498Szrj * is ordered first.
215238fd1498Szrj */
215338fd1498Szrj int
215438fd1498Szrj compare(const _CharT* __s) const;
215538fd1498Szrj
215638fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS
215738fd1498Szrj // 5 String::compare specification questionable
215838fd1498Szrj /**
215938fd1498Szrj * @brief Compare substring to a C string.
216038fd1498Szrj * @param __pos Index of first character of substring.
216138fd1498Szrj * @param __n1 Number of characters in substring.
216238fd1498Szrj * @param __s C string to compare against.
216338fd1498Szrj * @return Integer < 0, 0, or > 0.
216438fd1498Szrj *
216538fd1498Szrj * Form the substring of this string from the @a __n1
216638fd1498Szrj * characters starting at @a __pos. Returns an integer < 0 if
216738fd1498Szrj * the substring is ordered before @a __s, 0 if their values
216838fd1498Szrj * are equivalent, or > 0 if the substring is ordered after @a
216938fd1498Szrj * __s. Determines the effective length rlen of the strings to
217038fd1498Szrj * compare as the smallest of the length of the substring and
217138fd1498Szrj * the length of a string constructed from @a __s. The
217238fd1498Szrj * function then compares the two string by calling
217338fd1498Szrj * traits::compare(substring.data(),s,rlen). If the result of
217438fd1498Szrj * the comparison is nonzero returns it, otherwise the shorter
217538fd1498Szrj * one is ordered first.
217638fd1498Szrj */
217738fd1498Szrj int
217838fd1498Szrj compare(size_type __pos, size_type __n1, const _CharT* __s) const;
217938fd1498Szrj
218038fd1498Szrj /**
218138fd1498Szrj * @brief Compare substring against a character array.
218238fd1498Szrj * @param __pos Index of first character of substring.
218338fd1498Szrj * @param __n1 Number of characters in substring.
218438fd1498Szrj * @param __s character array to compare against.
218538fd1498Szrj * @param __n2 Number of characters of s.
218638fd1498Szrj * @return Integer < 0, 0, or > 0.
218738fd1498Szrj *
218838fd1498Szrj * Form the substring of this string from the @a __n1
218938fd1498Szrj * characters starting at @a __pos. Form a string from the
219038fd1498Szrj * first @a __n2 characters of @a __s. Returns an integer < 0
219138fd1498Szrj * if this substring is ordered before the string from @a __s,
219238fd1498Szrj * 0 if their values are equivalent, or > 0 if this substring
219338fd1498Szrj * is ordered after the string from @a __s. Determines the
219438fd1498Szrj * effective length rlen of the strings to compare as the
219538fd1498Szrj * smallest of the length of the substring and @a __n2. The
219638fd1498Szrj * function then compares the two strings by calling
219738fd1498Szrj * traits::compare(substring.data(),__s,rlen). If the result of
219838fd1498Szrj * the comparison is nonzero returns it, otherwise the shorter
219938fd1498Szrj * one is ordered first.
220038fd1498Szrj *
220138fd1498Szrj * NB: __s must have at least n2 characters, <em>\\0</em> has no special
220238fd1498Szrj * meaning.
220338fd1498Szrj */
220438fd1498Szrj int
220538fd1498Szrj compare(size_type __pos, size_type __n1, const _CharT* __s,
220638fd1498Szrj size_type __n2) const;
220738fd1498Szrj };
220838fd1498Szrj
220938fd1498Szrj // operator+
221038fd1498Szrj /**
221138fd1498Szrj * @brief Concatenate two strings.
221238fd1498Szrj * @param __lhs First string.
221338fd1498Szrj * @param __rhs Last string.
221438fd1498Szrj * @return New string with value of @a __lhs followed by @a __rhs.
221538fd1498Szrj */
221638fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
221738fd1498Szrj template <typename, typename, typename> class _Base>
221838fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>
221938fd1498Szrj operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
222038fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
222138fd1498Szrj
222238fd1498Szrj /**
222338fd1498Szrj * @brief Concatenate C string and string.
222438fd1498Szrj * @param __lhs First string.
222538fd1498Szrj * @param __rhs Last string.
222638fd1498Szrj * @return New string with value of @a __lhs followed by @a __rhs.
222738fd1498Szrj */
222838fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
222938fd1498Szrj template <typename, typename, typename> class _Base>
223038fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>
223138fd1498Szrj operator+(const _CharT* __lhs,
223238fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
223338fd1498Szrj
223438fd1498Szrj /**
223538fd1498Szrj * @brief Concatenate character and string.
223638fd1498Szrj * @param __lhs First string.
223738fd1498Szrj * @param __rhs Last string.
223838fd1498Szrj * @return New string with @a __lhs followed by @a __rhs.
223938fd1498Szrj */
224038fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
224138fd1498Szrj template <typename, typename, typename> class _Base>
224238fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>
224338fd1498Szrj operator+(_CharT __lhs,
224438fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
224538fd1498Szrj
224638fd1498Szrj /**
224738fd1498Szrj * @brief Concatenate string and C string.
224838fd1498Szrj * @param __lhs First string.
224938fd1498Szrj * @param __rhs Last string.
225038fd1498Szrj * @return New string with @a __lhs followed by @a __rhs.
225138fd1498Szrj */
225238fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
225338fd1498Szrj template <typename, typename, typename> class _Base>
225438fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>
225538fd1498Szrj operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
225638fd1498Szrj const _CharT* __rhs);
225738fd1498Szrj
225838fd1498Szrj /**
225938fd1498Szrj * @brief Concatenate string and character.
226038fd1498Szrj * @param __lhs First string.
226138fd1498Szrj * @param __rhs Last string.
226238fd1498Szrj * @return New string with @a __lhs followed by @a __rhs.
226338fd1498Szrj */
226438fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
226538fd1498Szrj template <typename, typename, typename> class _Base>
226638fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>
226738fd1498Szrj operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
226838fd1498Szrj _CharT __rhs);
226938fd1498Szrj
227038fd1498Szrj #if __cplusplus >= 201103L
227138fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
227238fd1498Szrj template <typename, typename, typename> class _Base>
227338fd1498Szrj inline __versa_string<_CharT, _Traits, _Alloc, _Base>
227438fd1498Szrj operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs,
227538fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
227638fd1498Szrj { return std::move(__lhs.append(__rhs)); }
227738fd1498Szrj
227838fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
227938fd1498Szrj template <typename, typename, typename> class _Base>
228038fd1498Szrj inline __versa_string<_CharT, _Traits, _Alloc, _Base>
228138fd1498Szrj operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
228238fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs)
228338fd1498Szrj { return std::move(__rhs.insert(0, __lhs)); }
228438fd1498Szrj
228538fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
228638fd1498Szrj template <typename, typename, typename> class _Base>
228738fd1498Szrj inline __versa_string<_CharT, _Traits, _Alloc, _Base>
228838fd1498Szrj operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs,
228938fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs)
229038fd1498Szrj {
229138fd1498Szrj const auto __size = __lhs.size() + __rhs.size();
229238fd1498Szrj const bool __cond = (__size > __lhs.capacity()
229338fd1498Szrj && __size <= __rhs.capacity());
229438fd1498Szrj return __cond ? std::move(__rhs.insert(0, __lhs))
229538fd1498Szrj : std::move(__lhs.append(__rhs));
229638fd1498Szrj }
229738fd1498Szrj
229838fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
229938fd1498Szrj template <typename, typename, typename> class _Base>
230038fd1498Szrj inline __versa_string<_CharT, _Traits, _Alloc, _Base>
230138fd1498Szrj operator+(const _CharT* __lhs,
230238fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs)
230338fd1498Szrj { return std::move(__rhs.insert(0, __lhs)); }
230438fd1498Szrj
230538fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
230638fd1498Szrj template <typename, typename, typename> class _Base>
230738fd1498Szrj inline __versa_string<_CharT, _Traits, _Alloc, _Base>
230838fd1498Szrj operator+(_CharT __lhs,
230938fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs)
231038fd1498Szrj { return std::move(__rhs.insert(0, 1, __lhs)); }
231138fd1498Szrj
231238fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
231338fd1498Szrj template <typename, typename, typename> class _Base>
231438fd1498Szrj inline __versa_string<_CharT, _Traits, _Alloc, _Base>
231538fd1498Szrj operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs,
231638fd1498Szrj const _CharT* __rhs)
231738fd1498Szrj { return std::move(__lhs.append(__rhs)); }
231838fd1498Szrj
231938fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
232038fd1498Szrj template <typename, typename, typename> class _Base>
232138fd1498Szrj inline __versa_string<_CharT, _Traits, _Alloc, _Base>
232238fd1498Szrj operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs,
232338fd1498Szrj _CharT __rhs)
232438fd1498Szrj { return std::move(__lhs.append(1, __rhs)); }
232538fd1498Szrj #endif
232638fd1498Szrj
232738fd1498Szrj // operator ==
232838fd1498Szrj /**
232938fd1498Szrj * @brief Test equivalence of two strings.
233038fd1498Szrj * @param __lhs First string.
233138fd1498Szrj * @param __rhs Second string.
233238fd1498Szrj * @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise.
233338fd1498Szrj */
233438fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
233538fd1498Szrj template <typename, typename, typename> class _Base>
233638fd1498Szrj inline bool
233738fd1498Szrj operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
233838fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
233938fd1498Szrj { return __lhs.compare(__rhs) == 0; }
234038fd1498Szrj
234138fd1498Szrj template<typename _CharT,
234238fd1498Szrj template <typename, typename, typename> class _Base>
234338fd1498Szrj inline typename __enable_if<std::__is_char<_CharT>::__value, bool>::__type
234438fd1498Szrj operator==(const __versa_string<_CharT, std::char_traits<_CharT>,
234538fd1498Szrj std::allocator<_CharT>, _Base>& __lhs,
234638fd1498Szrj const __versa_string<_CharT, std::char_traits<_CharT>,
234738fd1498Szrj std::allocator<_CharT>, _Base>& __rhs)
234838fd1498Szrj { return (__lhs.size() == __rhs.size()
234938fd1498Szrj && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
235038fd1498Szrj __lhs.size())); }
235138fd1498Szrj
235238fd1498Szrj /**
235338fd1498Szrj * @brief Test equivalence of C string and string.
235438fd1498Szrj * @param __lhs C string.
235538fd1498Szrj * @param __rhs String.
235638fd1498Szrj * @return True if @a __rhs.compare(@a __lhs) == 0. False otherwise.
235738fd1498Szrj */
235838fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
235938fd1498Szrj template <typename, typename, typename> class _Base>
236038fd1498Szrj inline bool
236138fd1498Szrj operator==(const _CharT* __lhs,
236238fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
236338fd1498Szrj { return __rhs.compare(__lhs) == 0; }
236438fd1498Szrj
236538fd1498Szrj /**
236638fd1498Szrj * @brief Test equivalence of string and C string.
236738fd1498Szrj * @param __lhs String.
236838fd1498Szrj * @param __rhs C string.
236938fd1498Szrj * @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise.
237038fd1498Szrj */
237138fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
237238fd1498Szrj template <typename, typename, typename> class _Base>
237338fd1498Szrj inline bool
237438fd1498Szrj operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
237538fd1498Szrj const _CharT* __rhs)
237638fd1498Szrj { return __lhs.compare(__rhs) == 0; }
237738fd1498Szrj
237838fd1498Szrj // operator !=
237938fd1498Szrj /**
238038fd1498Szrj * @brief Test difference of two strings.
238138fd1498Szrj * @param __lhs First string.
238238fd1498Szrj * @param __rhs Second string.
238338fd1498Szrj * @return True if @a __lhs.compare(@a __rhs) != 0. False otherwise.
238438fd1498Szrj */
238538fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
238638fd1498Szrj template <typename, typename, typename> class _Base>
238738fd1498Szrj inline bool
238838fd1498Szrj operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
238938fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
239038fd1498Szrj { return !(__lhs == __rhs); }
239138fd1498Szrj
239238fd1498Szrj /**
239338fd1498Szrj * @brief Test difference of C string and string.
239438fd1498Szrj * @param __lhs C string.
239538fd1498Szrj * @param __rhs String.
239638fd1498Szrj * @return True if @a __rhs.compare(@a __lhs) != 0. False otherwise.
239738fd1498Szrj */
239838fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
239938fd1498Szrj template <typename, typename, typename> class _Base>
240038fd1498Szrj inline bool
240138fd1498Szrj operator!=(const _CharT* __lhs,
240238fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
240338fd1498Szrj { return !(__lhs == __rhs); }
240438fd1498Szrj
240538fd1498Szrj /**
240638fd1498Szrj * @brief Test difference of string and C string.
240738fd1498Szrj * @param __lhs String.
240838fd1498Szrj * @param __rhs C string.
240938fd1498Szrj * @return True if @a __lhs.compare(@a __rhs) != 0. False otherwise.
241038fd1498Szrj */
241138fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
241238fd1498Szrj template <typename, typename, typename> class _Base>
241338fd1498Szrj inline bool
241438fd1498Szrj operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
241538fd1498Szrj const _CharT* __rhs)
241638fd1498Szrj { return !(__lhs == __rhs); }
241738fd1498Szrj
241838fd1498Szrj // operator <
241938fd1498Szrj /**
242038fd1498Szrj * @brief Test if string precedes string.
242138fd1498Szrj * @param __lhs First string.
242238fd1498Szrj * @param __rhs Second string.
242338fd1498Szrj * @return True if @a __lhs precedes @a __rhs. False otherwise.
242438fd1498Szrj */
242538fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
242638fd1498Szrj template <typename, typename, typename> class _Base>
242738fd1498Szrj inline bool
242838fd1498Szrj operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
242938fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
243038fd1498Szrj { return __lhs.compare(__rhs) < 0; }
243138fd1498Szrj
243238fd1498Szrj /**
243338fd1498Szrj * @brief Test if string precedes C string.
243438fd1498Szrj * @param __lhs String.
243538fd1498Szrj * @param __rhs C string.
243638fd1498Szrj * @return True if @a __lhs precedes @a __rhs. False otherwise.
243738fd1498Szrj */
243838fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
243938fd1498Szrj template <typename, typename, typename> class _Base>
244038fd1498Szrj inline bool
244138fd1498Szrj operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
244238fd1498Szrj const _CharT* __rhs)
244338fd1498Szrj { return __lhs.compare(__rhs) < 0; }
244438fd1498Szrj
244538fd1498Szrj /**
244638fd1498Szrj * @brief Test if C string precedes string.
244738fd1498Szrj * @param __lhs C string.
244838fd1498Szrj * @param __rhs String.
244938fd1498Szrj * @return True if @a __lhs precedes @a __rhs. False otherwise.
245038fd1498Szrj */
245138fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
245238fd1498Szrj template <typename, typename, typename> class _Base>
245338fd1498Szrj inline bool
245438fd1498Szrj operator<(const _CharT* __lhs,
245538fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
245638fd1498Szrj { return __rhs.compare(__lhs) > 0; }
245738fd1498Szrj
245838fd1498Szrj // operator >
245938fd1498Szrj /**
246038fd1498Szrj * @brief Test if string follows string.
246138fd1498Szrj * @param __lhs First string.
246238fd1498Szrj * @param __rhs Second string.
246338fd1498Szrj * @return True if @a __lhs follows @a __rhs. False otherwise.
246438fd1498Szrj */
246538fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
246638fd1498Szrj template <typename, typename, typename> class _Base>
246738fd1498Szrj inline bool
246838fd1498Szrj operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
246938fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
247038fd1498Szrj { return __lhs.compare(__rhs) > 0; }
247138fd1498Szrj
247238fd1498Szrj /**
247338fd1498Szrj * @brief Test if string follows C string.
247438fd1498Szrj * @param __lhs String.
247538fd1498Szrj * @param __rhs C string.
247638fd1498Szrj * @return True if @a __lhs follows @a __rhs. False otherwise.
247738fd1498Szrj */
247838fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
247938fd1498Szrj template <typename, typename, typename> class _Base>
248038fd1498Szrj inline bool
248138fd1498Szrj operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
248238fd1498Szrj const _CharT* __rhs)
248338fd1498Szrj { return __lhs.compare(__rhs) > 0; }
248438fd1498Szrj
248538fd1498Szrj /**
248638fd1498Szrj * @brief Test if C string follows string.
248738fd1498Szrj * @param __lhs C string.
248838fd1498Szrj * @param __rhs String.
248938fd1498Szrj * @return True if @a __lhs follows @a __rhs. False otherwise.
249038fd1498Szrj */
249138fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
249238fd1498Szrj template <typename, typename, typename> class _Base>
249338fd1498Szrj inline bool
249438fd1498Szrj operator>(const _CharT* __lhs,
249538fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
249638fd1498Szrj { return __rhs.compare(__lhs) < 0; }
249738fd1498Szrj
249838fd1498Szrj // operator <=
249938fd1498Szrj /**
250038fd1498Szrj * @brief Test if string doesn't follow string.
250138fd1498Szrj * @param __lhs First string.
250238fd1498Szrj * @param __rhs Second string.
250338fd1498Szrj * @return True if @a __lhs doesn't follow @a __rhs. False otherwise.
250438fd1498Szrj */
250538fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
250638fd1498Szrj template <typename, typename, typename> class _Base>
250738fd1498Szrj inline bool
250838fd1498Szrj operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
250938fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
251038fd1498Szrj { return __lhs.compare(__rhs) <= 0; }
251138fd1498Szrj
251238fd1498Szrj /**
251338fd1498Szrj * @brief Test if string doesn't follow C string.
251438fd1498Szrj * @param __lhs String.
251538fd1498Szrj * @param __rhs C string.
251638fd1498Szrj * @return True if @a __lhs doesn't follow @a __rhs. False otherwise.
251738fd1498Szrj */
251838fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
251938fd1498Szrj template <typename, typename, typename> class _Base>
252038fd1498Szrj inline bool
252138fd1498Szrj operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
252238fd1498Szrj const _CharT* __rhs)
252338fd1498Szrj { return __lhs.compare(__rhs) <= 0; }
252438fd1498Szrj
252538fd1498Szrj /**
252638fd1498Szrj * @brief Test if C string doesn't follow string.
252738fd1498Szrj * @param __lhs C string.
252838fd1498Szrj * @param __rhs String.
252938fd1498Szrj * @return True if @a __lhs doesn't follow @a __rhs. False otherwise.
253038fd1498Szrj */
253138fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
253238fd1498Szrj template <typename, typename, typename> class _Base>
253338fd1498Szrj inline bool
253438fd1498Szrj operator<=(const _CharT* __lhs,
253538fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
253638fd1498Szrj { return __rhs.compare(__lhs) >= 0; }
253738fd1498Szrj
253838fd1498Szrj // operator >=
253938fd1498Szrj /**
254038fd1498Szrj * @brief Test if string doesn't precede string.
254138fd1498Szrj * @param __lhs First string.
254238fd1498Szrj * @param __rhs Second string.
254338fd1498Szrj * @return True if @a __lhs doesn't precede @a __rhs. False otherwise.
254438fd1498Szrj */
254538fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
254638fd1498Szrj template <typename, typename, typename> class _Base>
254738fd1498Szrj inline bool
254838fd1498Szrj operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
254938fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
255038fd1498Szrj { return __lhs.compare(__rhs) >= 0; }
255138fd1498Szrj
255238fd1498Szrj /**
255338fd1498Szrj * @brief Test if string doesn't precede C string.
255438fd1498Szrj * @param __lhs String.
255538fd1498Szrj * @param __rhs C string.
255638fd1498Szrj * @return True if @a __lhs doesn't precede @a __rhs. False otherwise.
255738fd1498Szrj */
255838fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
255938fd1498Szrj template <typename, typename, typename> class _Base>
256038fd1498Szrj inline bool
256138fd1498Szrj operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
256238fd1498Szrj const _CharT* __rhs)
256338fd1498Szrj { return __lhs.compare(__rhs) >= 0; }
256438fd1498Szrj
256538fd1498Szrj /**
256638fd1498Szrj * @brief Test if C string doesn't precede string.
256738fd1498Szrj * @param __lhs C string.
256838fd1498Szrj * @param __rhs String.
256938fd1498Szrj * @return True if @a __lhs doesn't precede @a __rhs. False otherwise.
257038fd1498Szrj */
257138fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
257238fd1498Szrj template <typename, typename, typename> class _Base>
257338fd1498Szrj inline bool
257438fd1498Szrj operator>=(const _CharT* __lhs,
257538fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
257638fd1498Szrj { return __rhs.compare(__lhs) <= 0; }
257738fd1498Szrj
257838fd1498Szrj /**
257938fd1498Szrj * @brief Swap contents of two strings.
258038fd1498Szrj * @param __lhs First string.
258138fd1498Szrj * @param __rhs Second string.
258238fd1498Szrj *
258338fd1498Szrj * Exchanges the contents of @a __lhs and @a __rhs in constant time.
258438fd1498Szrj */
258538fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
258638fd1498Szrj template <typename, typename, typename> class _Base>
258738fd1498Szrj inline void
258838fd1498Szrj swap(__versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
258938fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
259038fd1498Szrj { __lhs.swap(__rhs); }
259138fd1498Szrj
259238fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
259338fd1498Szrj } // namespace
259438fd1498Szrj
_GLIBCXX_VISIBILITY(default)259538fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default)
259638fd1498Szrj {
259738fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
259838fd1498Szrj
259938fd1498Szrj /**
260038fd1498Szrj * @brief Read stream into a string.
260138fd1498Szrj * @param __is Input stream.
260238fd1498Szrj * @param __str Buffer to store into.
260338fd1498Szrj * @return Reference to the input stream.
260438fd1498Szrj *
260538fd1498Szrj * Stores characters from @a __is into @a __str until whitespace is
260638fd1498Szrj * found, the end of the stream is encountered, or str.max_size()
260738fd1498Szrj * is reached. If is.width() is non-zero, that is the limit on the
260838fd1498Szrj * number of characters stored into @a __str. Any previous
260938fd1498Szrj * contents of @a __str are erased.
261038fd1498Szrj */
261138fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
261238fd1498Szrj template <typename, typename, typename> class _Base>
261338fd1498Szrj basic_istream<_CharT, _Traits>&
261438fd1498Szrj operator>>(basic_istream<_CharT, _Traits>& __is,
261538fd1498Szrj __gnu_cxx::__versa_string<_CharT, _Traits,
261638fd1498Szrj _Alloc, _Base>& __str);
261738fd1498Szrj
261838fd1498Szrj /**
261938fd1498Szrj * @brief Write string to a stream.
262038fd1498Szrj * @param __os Output stream.
262138fd1498Szrj * @param __str String to write out.
262238fd1498Szrj * @return Reference to the output stream.
262338fd1498Szrj *
262438fd1498Szrj * Output characters of @a __str into os following the same rules as for
262538fd1498Szrj * writing a C string.
262638fd1498Szrj */
262738fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
262838fd1498Szrj template <typename, typename, typename> class _Base>
262938fd1498Szrj inline basic_ostream<_CharT, _Traits>&
263038fd1498Szrj operator<<(basic_ostream<_CharT, _Traits>& __os,
263138fd1498Szrj const __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc,
263238fd1498Szrj _Base>& __str)
263338fd1498Szrj {
263438fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS
263538fd1498Szrj // 586. string inserter not a formatted function
263638fd1498Szrj return __ostream_insert(__os, __str.data(), __str.size());
263738fd1498Szrj }
263838fd1498Szrj
263938fd1498Szrj /**
264038fd1498Szrj * @brief Read a line from stream into a string.
264138fd1498Szrj * @param __is Input stream.
264238fd1498Szrj * @param __str Buffer to store into.
264338fd1498Szrj * @param __delim Character marking end of line.
264438fd1498Szrj * @return Reference to the input stream.
264538fd1498Szrj *
264638fd1498Szrj * Stores characters from @a __is into @a __str until @a __delim is
264738fd1498Szrj * found, the end of the stream is encountered, or str.max_size()
264838fd1498Szrj * is reached. If is.width() is non-zero, that is the limit on the
264938fd1498Szrj * number of characters stored into @a __str. Any previous
265038fd1498Szrj * contents of @a __str are erased. If @a delim was encountered,
265138fd1498Szrj * it is extracted but not stored into @a __str.
265238fd1498Szrj */
265338fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
265438fd1498Szrj template <typename, typename, typename> class _Base>
265538fd1498Szrj basic_istream<_CharT, _Traits>&
265638fd1498Szrj getline(basic_istream<_CharT, _Traits>& __is,
265738fd1498Szrj __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str,
265838fd1498Szrj _CharT __delim);
265938fd1498Szrj
266038fd1498Szrj /**
266138fd1498Szrj * @brief Read a line from stream into a string.
266238fd1498Szrj * @param __is Input stream.
266338fd1498Szrj * @param __str Buffer to store into.
266438fd1498Szrj * @return Reference to the input stream.
266538fd1498Szrj *
266638fd1498Szrj * Stores characters from is into @a __str until '\n' is
266738fd1498Szrj * found, the end of the stream is encountered, or str.max_size()
266838fd1498Szrj * is reached. If is.width() is non-zero, that is the limit on the
266938fd1498Szrj * number of characters stored into @a __str. Any previous
267038fd1498Szrj * contents of @a __str are erased. If end of line was
267138fd1498Szrj * encountered, it is extracted but not stored into @a __str.
267238fd1498Szrj */
267338fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc,
267438fd1498Szrj template <typename, typename, typename> class _Base>
267538fd1498Szrj inline basic_istream<_CharT, _Traits>&
267638fd1498Szrj getline(basic_istream<_CharT, _Traits>& __is,
267738fd1498Szrj __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str)
267838fd1498Szrj { return getline(__is, __str, __is.widen('\n')); }
267938fd1498Szrj
268038fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
268138fd1498Szrj } // namespace
268238fd1498Szrj
268338fd1498Szrj #if __cplusplus >= 201103L
268438fd1498Szrj
268538fd1498Szrj #include <ext/string_conversions.h>
268638fd1498Szrj
_GLIBCXX_VISIBILITY(default)268738fd1498Szrj namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
268838fd1498Szrj {
268938fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
269038fd1498Szrj
269138fd1498Szrj #if _GLIBCXX_USE_C99_STDLIB
269238fd1498Szrj // 21.4 Numeric Conversions [string.conversions].
269338fd1498Szrj inline int
269438fd1498Szrj stoi(const __vstring& __str, std::size_t* __idx = 0, int __base = 10)
269538fd1498Szrj { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
269638fd1498Szrj __idx, __base); }
269738fd1498Szrj
269838fd1498Szrj inline long
269938fd1498Szrj stol(const __vstring& __str, std::size_t* __idx = 0, int __base = 10)
270038fd1498Szrj { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
270138fd1498Szrj __idx, __base); }
270238fd1498Szrj
270338fd1498Szrj inline unsigned long
270438fd1498Szrj stoul(const __vstring& __str, std::size_t* __idx = 0, int __base = 10)
270538fd1498Szrj { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
270638fd1498Szrj __idx, __base); }
270738fd1498Szrj
270838fd1498Szrj inline long long
270938fd1498Szrj stoll(const __vstring& __str, std::size_t* __idx = 0, int __base = 10)
271038fd1498Szrj { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
271138fd1498Szrj __idx, __base); }
271238fd1498Szrj
271338fd1498Szrj inline unsigned long long
271438fd1498Szrj stoull(const __vstring& __str, std::size_t* __idx, int __base = 10)
271538fd1498Szrj { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
271638fd1498Szrj __idx, __base); }
271738fd1498Szrj
271838fd1498Szrj // NB: strtof vs strtod.
271938fd1498Szrj inline float
272038fd1498Szrj stof(const __vstring& __str, std::size_t* __idx = 0)
272138fd1498Szrj { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }
272238fd1498Szrj
272338fd1498Szrj inline double
272438fd1498Szrj stod(const __vstring& __str, std::size_t* __idx = 0)
272538fd1498Szrj { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }
272638fd1498Szrj
272738fd1498Szrj inline long double
272838fd1498Szrj stold(const __vstring& __str, std::size_t* __idx = 0)
272938fd1498Szrj { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }
273038fd1498Szrj #endif // _GLIBCXX_USE_C99_STDLIB
273138fd1498Szrj
273238fd1498Szrj #if _GLIBCXX_USE_C99_STDIO
273338fd1498Szrj // NB: (v)snprintf vs sprintf.
273438fd1498Szrj
273538fd1498Szrj // DR 1261.
273638fd1498Szrj inline __vstring
273738fd1498Szrj to_string(int __val)
273838fd1498Szrj { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 4 * sizeof(int),
273938fd1498Szrj "%d", __val); }
274038fd1498Szrj
274138fd1498Szrj inline __vstring
274238fd1498Szrj to_string(unsigned __val)
274338fd1498Szrj { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
274438fd1498Szrj 4 * sizeof(unsigned),
274538fd1498Szrj "%u", __val); }
274638fd1498Szrj
274738fd1498Szrj inline __vstring
274838fd1498Szrj to_string(long __val)
274938fd1498Szrj { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
275038fd1498Szrj 4 * sizeof(long),
275138fd1498Szrj "%ld", __val); }
275238fd1498Szrj
275338fd1498Szrj inline __vstring
275438fd1498Szrj to_string(unsigned long __val)
275538fd1498Szrj { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
275638fd1498Szrj 4 * sizeof(unsigned long),
275738fd1498Szrj "%lu", __val); }
275838fd1498Szrj
275938fd1498Szrj
276038fd1498Szrj inline __vstring
276138fd1498Szrj to_string(long long __val)
276238fd1498Szrj { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
276338fd1498Szrj 4 * sizeof(long long),
276438fd1498Szrj "%lld", __val); }
276538fd1498Szrj
276638fd1498Szrj inline __vstring
276738fd1498Szrj to_string(unsigned long long __val)
276838fd1498Szrj { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
276938fd1498Szrj 4 * sizeof(unsigned long long),
277038fd1498Szrj "%llu", __val); }
277138fd1498Szrj
277238fd1498Szrj inline __vstring
277338fd1498Szrj to_string(float __val)
277438fd1498Szrj {
277538fd1498Szrj const int __n = __numeric_traits<float>::__max_exponent10 + 20;
277638fd1498Szrj return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n,
277738fd1498Szrj "%f", __val);
277838fd1498Szrj }
277938fd1498Szrj
278038fd1498Szrj inline __vstring
278138fd1498Szrj to_string(double __val)
278238fd1498Szrj {
278338fd1498Szrj const int __n = __numeric_traits<double>::__max_exponent10 + 20;
278438fd1498Szrj return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n,
278538fd1498Szrj "%f", __val);
278638fd1498Szrj }
278738fd1498Szrj
278838fd1498Szrj inline __vstring
278938fd1498Szrj to_string(long double __val)
279038fd1498Szrj {
279138fd1498Szrj const int __n = __numeric_traits<long double>::__max_exponent10 + 20;
279238fd1498Szrj return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n,
279338fd1498Szrj "%Lf", __val);
279438fd1498Szrj }
279538fd1498Szrj #endif // _GLIBCXX_USE_C99_STDIO
279638fd1498Szrj
279738fd1498Szrj #if defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_WCHAR
279838fd1498Szrj inline int
279938fd1498Szrj stoi(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
280038fd1498Szrj { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
280138fd1498Szrj __idx, __base); }
280238fd1498Szrj
280338fd1498Szrj inline long
280438fd1498Szrj stol(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
280538fd1498Szrj { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
280638fd1498Szrj __idx, __base); }
280738fd1498Szrj
280838fd1498Szrj inline unsigned long
280938fd1498Szrj stoul(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
281038fd1498Szrj { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
281138fd1498Szrj __idx, __base); }
281238fd1498Szrj
281338fd1498Szrj inline long long
281438fd1498Szrj stoll(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
281538fd1498Szrj { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
281638fd1498Szrj __idx, __base); }
281738fd1498Szrj
281838fd1498Szrj inline unsigned long long
281938fd1498Szrj stoull(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
282038fd1498Szrj { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
282138fd1498Szrj __idx, __base); }
282238fd1498Szrj
282338fd1498Szrj // NB: wcstof vs wcstod.
282438fd1498Szrj inline float
282538fd1498Szrj stof(const __wvstring& __str, std::size_t* __idx = 0)
282638fd1498Szrj { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }
282738fd1498Szrj
282838fd1498Szrj inline double
282938fd1498Szrj stod(const __wvstring& __str, std::size_t* __idx = 0)
283038fd1498Szrj { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }
283138fd1498Szrj
283238fd1498Szrj inline long double
283338fd1498Szrj stold(const __wvstring& __str, std::size_t* __idx = 0)
283438fd1498Szrj { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
283538fd1498Szrj
283638fd1498Szrj #ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
283738fd1498Szrj // DR 1261.
283838fd1498Szrj inline __wvstring
283938fd1498Szrj to_wstring(int __val)
284038fd1498Szrj { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
284138fd1498Szrj 4 * sizeof(int),
284238fd1498Szrj L"%d", __val); }
284338fd1498Szrj
284438fd1498Szrj inline __wvstring
284538fd1498Szrj to_wstring(unsigned __val)
284638fd1498Szrj { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
284738fd1498Szrj 4 * sizeof(unsigned),
284838fd1498Szrj L"%u", __val); }
284938fd1498Szrj
285038fd1498Szrj inline __wvstring
285138fd1498Szrj to_wstring(long __val)
285238fd1498Szrj { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
285338fd1498Szrj 4 * sizeof(long),
285438fd1498Szrj L"%ld", __val); }
285538fd1498Szrj
285638fd1498Szrj inline __wvstring
285738fd1498Szrj to_wstring(unsigned long __val)
285838fd1498Szrj { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
285938fd1498Szrj 4 * sizeof(unsigned long),
286038fd1498Szrj L"%lu", __val); }
286138fd1498Szrj
286238fd1498Szrj inline __wvstring
286338fd1498Szrj to_wstring(long long __val)
286438fd1498Szrj { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
286538fd1498Szrj 4 * sizeof(long long),
286638fd1498Szrj L"%lld", __val); }
286738fd1498Szrj
286838fd1498Szrj inline __wvstring
286938fd1498Szrj to_wstring(unsigned long long __val)
287038fd1498Szrj { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
287138fd1498Szrj 4 * sizeof(unsigned long long),
287238fd1498Szrj L"%llu", __val); }
287338fd1498Szrj
287438fd1498Szrj inline __wvstring
287538fd1498Szrj to_wstring(float __val)
287638fd1498Szrj {
287738fd1498Szrj const int __n = __numeric_traits<float>::__max_exponent10 + 20;
287838fd1498Szrj return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n,
287938fd1498Szrj L"%f", __val);
288038fd1498Szrj }
288138fd1498Szrj
288238fd1498Szrj inline __wvstring
288338fd1498Szrj to_wstring(double __val)
288438fd1498Szrj {
288538fd1498Szrj const int __n = __numeric_traits<double>::__max_exponent10 + 20;
288638fd1498Szrj return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n,
288738fd1498Szrj L"%f", __val);
288838fd1498Szrj }
288938fd1498Szrj
289038fd1498Szrj inline __wvstring
289138fd1498Szrj to_wstring(long double __val)
289238fd1498Szrj {
289338fd1498Szrj const int __n = __numeric_traits<long double>::__max_exponent10 + 20;
289438fd1498Szrj return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n,
289538fd1498Szrj L"%Lf", __val);
289638fd1498Szrj }
289738fd1498Szrj #endif // _GLIBCXX_HAVE_BROKEN_VSWPRINTF
289838fd1498Szrj #endif // _GLIBCXX_USE_WCHAR_T && _GLIBCXX_USE_C99_WCHAR
289938fd1498Szrj
290038fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
290138fd1498Szrj } // namespace
290238fd1498Szrj
290338fd1498Szrj #endif
290438fd1498Szrj
290538fd1498Szrj #if __cplusplus >= 201103L
290638fd1498Szrj
290738fd1498Szrj #include <bits/functional_hash.h>
290838fd1498Szrj
_GLIBCXX_VISIBILITY(default)290938fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default)
291038fd1498Szrj {
291138fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
291238fd1498Szrj
291338fd1498Szrj /// std::hash specialization for __vstring.
291438fd1498Szrj template<>
291538fd1498Szrj struct hash<__gnu_cxx::__vstring>
291638fd1498Szrj : public __hash_base<size_t, __gnu_cxx::__vstring>
291738fd1498Szrj {
291838fd1498Szrj size_t
291938fd1498Szrj operator()(const __gnu_cxx::__vstring& __s) const noexcept
292038fd1498Szrj { return std::_Hash_impl::hash(__s.data(), __s.length()); }
292138fd1498Szrj };
292238fd1498Szrj
292338fd1498Szrj #ifdef _GLIBCXX_USE_WCHAR_T
292438fd1498Szrj /// std::hash specialization for __wvstring.
292538fd1498Szrj template<>
292638fd1498Szrj struct hash<__gnu_cxx::__wvstring>
292738fd1498Szrj : public __hash_base<size_t, __gnu_cxx::__wvstring>
292838fd1498Szrj {
292938fd1498Szrj size_t
293038fd1498Szrj operator()(const __gnu_cxx::__wvstring& __s) const noexcept
293138fd1498Szrj { return std::_Hash_impl::hash(__s.data(),
293238fd1498Szrj __s.length() * sizeof(wchar_t)); }
293338fd1498Szrj };
293438fd1498Szrj #endif
293538fd1498Szrj
293638fd1498Szrj #ifdef _GLIBCXX_USE_C99_STDINT_TR1
293738fd1498Szrj /// std::hash specialization for __u16vstring.
293838fd1498Szrj template<>
293938fd1498Szrj struct hash<__gnu_cxx::__u16vstring>
294038fd1498Szrj : public __hash_base<size_t, __gnu_cxx::__u16vstring>
294138fd1498Szrj {
294238fd1498Szrj size_t
294338fd1498Szrj operator()(const __gnu_cxx::__u16vstring& __s) const noexcept
294438fd1498Szrj { return std::_Hash_impl::hash(__s.data(),
294538fd1498Szrj __s.length() * sizeof(char16_t)); }
294638fd1498Szrj };
294738fd1498Szrj
294838fd1498Szrj /// std::hash specialization for __u32vstring.
294938fd1498Szrj template<>
295038fd1498Szrj struct hash<__gnu_cxx::__u32vstring>
295138fd1498Szrj : public __hash_base<size_t, __gnu_cxx::__u32vstring>
295238fd1498Szrj {
295338fd1498Szrj size_t
295438fd1498Szrj operator()(const __gnu_cxx::__u32vstring& __s) const noexcept
295538fd1498Szrj { return std::_Hash_impl::hash(__s.data(),
295638fd1498Szrj __s.length() * sizeof(char32_t)); }
295738fd1498Szrj };
295838fd1498Szrj #endif
295938fd1498Szrj
296038fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
296138fd1498Szrj } // namespace
296238fd1498Szrj
296338fd1498Szrj #endif // C++11
296438fd1498Szrj
2965*58e805e6Szrj #include <ext/vstring.tcc>
296638fd1498Szrj
296738fd1498Szrj #endif /* _VSTRING_H */
2968