1f8a1b7d9SAlexander Kabaev // Versatile string -*- C++ -*-
2f8a1b7d9SAlexander Kabaev 
3f8a1b7d9SAlexander Kabaev // Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
4f8a1b7d9SAlexander Kabaev //
5f8a1b7d9SAlexander Kabaev // This file is part of the GNU ISO C++ Library.  This library is free
6f8a1b7d9SAlexander Kabaev // software; you can redistribute it and/or modify it under the
7f8a1b7d9SAlexander Kabaev // terms of the GNU General Public License as published by the
8f8a1b7d9SAlexander Kabaev // Free Software Foundation; either version 2, or (at your option)
9f8a1b7d9SAlexander Kabaev // any later version.
10f8a1b7d9SAlexander Kabaev 
11f8a1b7d9SAlexander Kabaev // This library is distributed in the hope that it will be useful,
12f8a1b7d9SAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of
13f8a1b7d9SAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14f8a1b7d9SAlexander Kabaev // GNU General Public License for more details.
15f8a1b7d9SAlexander Kabaev 
16f8a1b7d9SAlexander Kabaev // You should have received a copy of the GNU General Public License along
17f8a1b7d9SAlexander Kabaev // with this library; see the file COPYING.  If not, write to the Free
18f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19f8a1b7d9SAlexander Kabaev // USA.
20f8a1b7d9SAlexander Kabaev 
21f8a1b7d9SAlexander Kabaev // As a special exception, you may use this file as part of a free software
22f8a1b7d9SAlexander Kabaev // library without restriction.  Specifically, if other files instantiate
23f8a1b7d9SAlexander Kabaev // templates or use macros or inline functions from this file, or you compile
24f8a1b7d9SAlexander Kabaev // this file and link it with other files to produce an executable, this
25f8a1b7d9SAlexander Kabaev // file does not by itself cause the resulting executable to be covered by
26f8a1b7d9SAlexander Kabaev // the GNU General Public License.  This exception does not however
27f8a1b7d9SAlexander Kabaev // invalidate any other reasons why the executable file might be covered by
28f8a1b7d9SAlexander Kabaev // the GNU General Public License.
29f8a1b7d9SAlexander Kabaev 
30f8a1b7d9SAlexander Kabaev /** @file ext/vstring.h
31f8a1b7d9SAlexander Kabaev  *  This file is a GNU extension to the Standard C++ Library.
32f8a1b7d9SAlexander Kabaev  */
33f8a1b7d9SAlexander Kabaev 
34f8a1b7d9SAlexander Kabaev #ifndef _VSTRING_H
35f8a1b7d9SAlexander Kabaev #define _VSTRING_H 1
36f8a1b7d9SAlexander Kabaev 
37f8a1b7d9SAlexander Kabaev #pragma GCC system_header
38f8a1b7d9SAlexander Kabaev 
39f8a1b7d9SAlexander Kabaev #include <ext/vstring_util.h>
40f8a1b7d9SAlexander Kabaev #include <ext/rc_string_base.h>
41f8a1b7d9SAlexander Kabaev #include <ext/sso_string_base.h>
42f8a1b7d9SAlexander Kabaev 
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)43f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
44f8a1b7d9SAlexander Kabaev 
45f8a1b7d9SAlexander Kabaev   /**
46f8a1b7d9SAlexander Kabaev    *  @class __versa_string vstring.h
47f8a1b7d9SAlexander Kabaev    *  @brief  Managing sequences of characters and character-like objects.
48f8a1b7d9SAlexander Kabaev    */
49f8a1b7d9SAlexander Kabaev 
50f8a1b7d9SAlexander Kabaev   // Template class __versa_string
51f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
52f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
53f8a1b7d9SAlexander Kabaev     class __versa_string
54f8a1b7d9SAlexander Kabaev     : private _Base<_CharT, _Traits, _Alloc>
55f8a1b7d9SAlexander Kabaev     {
56f8a1b7d9SAlexander Kabaev       typedef _Base<_CharT, _Traits, _Alloc>                __vstring_base;
57f8a1b7d9SAlexander Kabaev       typedef typename __vstring_base::_CharT_alloc_type    _CharT_alloc_type;
58f8a1b7d9SAlexander Kabaev 
59f8a1b7d9SAlexander Kabaev       // Types:
60f8a1b7d9SAlexander Kabaev     public:
61f8a1b7d9SAlexander Kabaev       typedef _Traits					    traits_type;
62f8a1b7d9SAlexander Kabaev       typedef typename _Traits::char_type		    value_type;
63f8a1b7d9SAlexander Kabaev       typedef _Alloc					    allocator_type;
64f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::size_type	    size_type;
65f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::difference_type   difference_type;
66f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::reference	    reference;
67f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::const_reference   const_reference;
68f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::pointer	    pointer;
69f8a1b7d9SAlexander Kabaev       typedef typename _CharT_alloc_type::const_pointer	    const_pointer;
70f8a1b7d9SAlexander Kabaev       typedef __gnu_cxx::__normal_iterator<pointer, __versa_string>  iterator;
71f8a1b7d9SAlexander Kabaev       typedef __gnu_cxx::__normal_iterator<const_pointer, __versa_string>
72f8a1b7d9SAlexander Kabaev                                                             const_iterator;
73f8a1b7d9SAlexander Kabaev       typedef std::reverse_iterator<const_iterator>	const_reverse_iterator;
74f8a1b7d9SAlexander Kabaev       typedef std::reverse_iterator<iterator>		    reverse_iterator;
75f8a1b7d9SAlexander Kabaev 
76f8a1b7d9SAlexander Kabaev       // Data Member (public):
77f8a1b7d9SAlexander Kabaev       ///  Value returned by various member functions when they fail.
78f8a1b7d9SAlexander Kabaev       static const size_type	npos = static_cast<size_type>(-1);
79f8a1b7d9SAlexander Kabaev 
80f8a1b7d9SAlexander Kabaev     private:
81f8a1b7d9SAlexander Kabaev       size_type
82f8a1b7d9SAlexander Kabaev       _M_check(size_type __pos, const char* __s) const
83f8a1b7d9SAlexander Kabaev       {
84f8a1b7d9SAlexander Kabaev 	if (__pos > this->size())
85f8a1b7d9SAlexander Kabaev 	  std::__throw_out_of_range(__N(__s));
86f8a1b7d9SAlexander Kabaev 	return __pos;
87f8a1b7d9SAlexander Kabaev       }
88f8a1b7d9SAlexander Kabaev 
89f8a1b7d9SAlexander Kabaev       void
90f8a1b7d9SAlexander Kabaev       _M_check_length(size_type __n1, size_type __n2, const char* __s) const
91f8a1b7d9SAlexander Kabaev       {
92f8a1b7d9SAlexander Kabaev 	if (this->max_size() - (this->size() - __n1) < __n2)
93f8a1b7d9SAlexander Kabaev 	  std::__throw_length_error(__N(__s));
94f8a1b7d9SAlexander Kabaev       }
95f8a1b7d9SAlexander Kabaev 
96f8a1b7d9SAlexander Kabaev       // NB: _M_limit doesn't check for a bad __pos value.
97f8a1b7d9SAlexander Kabaev       size_type
98f8a1b7d9SAlexander Kabaev       _M_limit(size_type __pos, size_type __off) const
99f8a1b7d9SAlexander Kabaev       {
100f8a1b7d9SAlexander Kabaev 	const bool __testoff =  __off < this->size() - __pos;
101f8a1b7d9SAlexander Kabaev 	return __testoff ? __off : this->size() - __pos;
102f8a1b7d9SAlexander Kabaev       }
103f8a1b7d9SAlexander Kabaev 
104f8a1b7d9SAlexander Kabaev       // True if _Rep and source do not overlap.
105f8a1b7d9SAlexander Kabaev       bool
106f8a1b7d9SAlexander Kabaev       _M_disjunct(const _CharT* __s) const
107f8a1b7d9SAlexander Kabaev       {
108f8a1b7d9SAlexander Kabaev 	return (std::less<const _CharT*>()(__s, this->_M_data())
109f8a1b7d9SAlexander Kabaev 		|| std::less<const _CharT*>()(this->_M_data()
110f8a1b7d9SAlexander Kabaev 					      + this->size(), __s));
111f8a1b7d9SAlexander Kabaev       }
112f8a1b7d9SAlexander Kabaev 
113f8a1b7d9SAlexander Kabaev       // For the internal use we have functions similar to `begin'/`end'
114f8a1b7d9SAlexander Kabaev       // but they do not call _M_leak.
115f8a1b7d9SAlexander Kabaev       iterator
116f8a1b7d9SAlexander Kabaev       _M_ibegin() const
117f8a1b7d9SAlexander Kabaev       { return iterator(this->_M_data()); }
118f8a1b7d9SAlexander Kabaev 
119f8a1b7d9SAlexander Kabaev       iterator
120f8a1b7d9SAlexander Kabaev       _M_iend() const
121f8a1b7d9SAlexander Kabaev       { return iterator(this->_M_data() + this->_M_length()); }
122f8a1b7d9SAlexander Kabaev 
123f8a1b7d9SAlexander Kabaev     public:
124f8a1b7d9SAlexander Kabaev       // Construct/copy/destroy:
125f8a1b7d9SAlexander Kabaev       // NB: We overload ctors in some cases instead of using default
126f8a1b7d9SAlexander Kabaev       // arguments, per 17.4.4.4 para. 2 item 2.
127f8a1b7d9SAlexander Kabaev 
128f8a1b7d9SAlexander Kabaev       /**
129f8a1b7d9SAlexander Kabaev        *  @brief  Default constructor creates an empty string.
130f8a1b7d9SAlexander Kabaev        */
131f8a1b7d9SAlexander Kabaev       __versa_string()
132f8a1b7d9SAlexander Kabaev       : __vstring_base() { }
133f8a1b7d9SAlexander Kabaev 
134f8a1b7d9SAlexander Kabaev       /**
135f8a1b7d9SAlexander Kabaev        *  @brief  Construct an empty string using allocator @a a.
136f8a1b7d9SAlexander Kabaev        */
137f8a1b7d9SAlexander Kabaev       explicit
138f8a1b7d9SAlexander Kabaev       __versa_string(const _Alloc& __a)
139f8a1b7d9SAlexander Kabaev       : __vstring_base(__a) { }
140f8a1b7d9SAlexander Kabaev 
141f8a1b7d9SAlexander Kabaev       // NB: per LWG issue 42, semantics different from IS:
142f8a1b7d9SAlexander Kabaev       /**
143f8a1b7d9SAlexander Kabaev        *  @brief  Construct string with copy of value of @a str.
144f8a1b7d9SAlexander Kabaev        *  @param  str  Source string.
145f8a1b7d9SAlexander Kabaev        */
146f8a1b7d9SAlexander Kabaev       __versa_string(const __versa_string& __str)
147f8a1b7d9SAlexander Kabaev       : __vstring_base(__str) { }
148f8a1b7d9SAlexander Kabaev 
149f8a1b7d9SAlexander Kabaev       /**
150f8a1b7d9SAlexander Kabaev        *  @brief  Construct string as copy of a substring.
151f8a1b7d9SAlexander Kabaev        *  @param  str  Source string.
152f8a1b7d9SAlexander Kabaev        *  @param  pos  Index of first character to copy from.
153f8a1b7d9SAlexander Kabaev        *  @param  n  Number of characters to copy (default remainder).
154f8a1b7d9SAlexander Kabaev        */
155f8a1b7d9SAlexander Kabaev       __versa_string(const __versa_string& __str, size_type __pos,
156f8a1b7d9SAlexander Kabaev 		     size_type __n = npos)
157f8a1b7d9SAlexander Kabaev       : __vstring_base(__str._M_data()
158f8a1b7d9SAlexander Kabaev 		       + __str._M_check(__pos,
159f8a1b7d9SAlexander Kabaev 					"__versa_string::__versa_string"),
160f8a1b7d9SAlexander Kabaev 		       __str._M_data() + __str._M_limit(__pos, __n)
161f8a1b7d9SAlexander Kabaev 		       + __pos, _Alloc()) { }
162f8a1b7d9SAlexander Kabaev 
163f8a1b7d9SAlexander Kabaev       /**
164f8a1b7d9SAlexander Kabaev        *  @brief  Construct string as copy of a substring.
165f8a1b7d9SAlexander Kabaev        *  @param  str  Source string.
166f8a1b7d9SAlexander Kabaev        *  @param  pos  Index of first character to copy from.
167f8a1b7d9SAlexander Kabaev        *  @param  n  Number of characters to copy.
168f8a1b7d9SAlexander Kabaev        *  @param  a  Allocator to use.
169f8a1b7d9SAlexander Kabaev        */
170f8a1b7d9SAlexander Kabaev       __versa_string(const __versa_string& __str, size_type __pos,
171f8a1b7d9SAlexander Kabaev 		     size_type __n, const _Alloc& __a)
172f8a1b7d9SAlexander Kabaev       : __vstring_base(__str._M_data()
173f8a1b7d9SAlexander Kabaev 		       + __str._M_check(__pos,
174f8a1b7d9SAlexander Kabaev 					"__versa_string::__versa_string"),
175f8a1b7d9SAlexander Kabaev 		       __str._M_data() + __str._M_limit(__pos, __n)
176f8a1b7d9SAlexander Kabaev 		       + __pos, __a) { }
177f8a1b7d9SAlexander Kabaev 
178f8a1b7d9SAlexander Kabaev       /**
179f8a1b7d9SAlexander Kabaev        *  @brief  Construct string initialized by a character array.
180f8a1b7d9SAlexander Kabaev        *  @param  s  Source character array.
181f8a1b7d9SAlexander Kabaev        *  @param  n  Number of characters to copy.
182f8a1b7d9SAlexander Kabaev        *  @param  a  Allocator to use (default is default allocator).
183f8a1b7d9SAlexander Kabaev        *
184f8a1b7d9SAlexander Kabaev        *  NB: @a s must have at least @a n characters, '\0' has no special
185f8a1b7d9SAlexander Kabaev        *  meaning.
186f8a1b7d9SAlexander Kabaev        */
187f8a1b7d9SAlexander Kabaev       __versa_string(const _CharT* __s, size_type __n,
188f8a1b7d9SAlexander Kabaev 		     const _Alloc& __a = _Alloc())
189f8a1b7d9SAlexander Kabaev       : __vstring_base(__s, __s + __n, __a) { }
190f8a1b7d9SAlexander Kabaev 
191f8a1b7d9SAlexander Kabaev       /**
192f8a1b7d9SAlexander Kabaev        *  @brief  Construct string as copy of a C string.
193f8a1b7d9SAlexander Kabaev        *  @param  s  Source C string.
194f8a1b7d9SAlexander Kabaev        *  @param  a  Allocator to use (default is default allocator).
195f8a1b7d9SAlexander Kabaev        */
196f8a1b7d9SAlexander Kabaev       __versa_string(const _CharT* __s, const _Alloc& __a = _Alloc())
197f8a1b7d9SAlexander Kabaev       : __vstring_base(__s, __s ? __s + traits_type::length(__s) :
198f8a1b7d9SAlexander Kabaev 		       __s + npos, __a) { }
199f8a1b7d9SAlexander Kabaev 
200f8a1b7d9SAlexander Kabaev       /**
201f8a1b7d9SAlexander Kabaev        *  @brief  Construct string as multiple characters.
202f8a1b7d9SAlexander Kabaev        *  @param  n  Number of characters.
203f8a1b7d9SAlexander Kabaev        *  @param  c  Character to use.
204f8a1b7d9SAlexander Kabaev        *  @param  a  Allocator to use (default is default allocator).
205f8a1b7d9SAlexander Kabaev        */
206f8a1b7d9SAlexander Kabaev       __versa_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
207f8a1b7d9SAlexander Kabaev       : __vstring_base(__n, __c, __a) { }
208f8a1b7d9SAlexander Kabaev 
209f8a1b7d9SAlexander Kabaev       /**
210f8a1b7d9SAlexander Kabaev        *  @brief  Construct string as copy of a range.
211f8a1b7d9SAlexander Kabaev        *  @param  beg  Start of range.
212f8a1b7d9SAlexander Kabaev        *  @param  end  End of range.
213f8a1b7d9SAlexander Kabaev        *  @param  a  Allocator to use (default is default allocator).
214f8a1b7d9SAlexander Kabaev        */
215f8a1b7d9SAlexander Kabaev       template<class _InputIterator>
216f8a1b7d9SAlexander Kabaev         __versa_string(_InputIterator __beg, _InputIterator __end,
217f8a1b7d9SAlexander Kabaev 		       const _Alloc& __a = _Alloc())
218f8a1b7d9SAlexander Kabaev 	: __vstring_base(__beg, __end, __a) { }
219f8a1b7d9SAlexander Kabaev 
220f8a1b7d9SAlexander Kabaev       /**
221f8a1b7d9SAlexander Kabaev        *  @brief  Destroy the string instance.
222f8a1b7d9SAlexander Kabaev        */
223f8a1b7d9SAlexander Kabaev       ~__versa_string() { }
224f8a1b7d9SAlexander Kabaev 
225f8a1b7d9SAlexander Kabaev       /**
226f8a1b7d9SAlexander Kabaev        *  @brief  Assign the value of @a str to this string.
227f8a1b7d9SAlexander Kabaev        *  @param  str  Source string.
228f8a1b7d9SAlexander Kabaev        */
229f8a1b7d9SAlexander Kabaev       __versa_string&
230f8a1b7d9SAlexander Kabaev       operator=(const __versa_string& __str)
231f8a1b7d9SAlexander Kabaev       { return this->assign(__str); }
232f8a1b7d9SAlexander Kabaev 
233f8a1b7d9SAlexander Kabaev       /**
234f8a1b7d9SAlexander Kabaev        *  @brief  Copy contents of @a s into this string.
235f8a1b7d9SAlexander Kabaev        *  @param  s  Source null-terminated string.
236f8a1b7d9SAlexander Kabaev        */
237f8a1b7d9SAlexander Kabaev       __versa_string&
238f8a1b7d9SAlexander Kabaev       operator=(const _CharT* __s)
239f8a1b7d9SAlexander Kabaev       { return this->assign(__s); }
240f8a1b7d9SAlexander Kabaev 
241f8a1b7d9SAlexander Kabaev       /**
242f8a1b7d9SAlexander Kabaev        *  @brief  Set value to string of length 1.
243f8a1b7d9SAlexander Kabaev        *  @param  c  Source character.
244f8a1b7d9SAlexander Kabaev        *
245f8a1b7d9SAlexander Kabaev        *  Assigning to a character makes this string length 1 and
246f8a1b7d9SAlexander Kabaev        *  (*this)[0] == @a c.
247f8a1b7d9SAlexander Kabaev        */
248f8a1b7d9SAlexander Kabaev       __versa_string&
249f8a1b7d9SAlexander Kabaev       operator=(_CharT __c)
250f8a1b7d9SAlexander Kabaev       {
251f8a1b7d9SAlexander Kabaev 	this->assign(1, __c);
252f8a1b7d9SAlexander Kabaev 	return *this;
253f8a1b7d9SAlexander Kabaev       }
254f8a1b7d9SAlexander Kabaev 
255f8a1b7d9SAlexander Kabaev       // Iterators:
256f8a1b7d9SAlexander Kabaev       /**
257f8a1b7d9SAlexander Kabaev        *  Returns a read/write iterator that points to the first character in
258f8a1b7d9SAlexander Kabaev        *  the %string.  Unshares the string.
259f8a1b7d9SAlexander Kabaev        */
260f8a1b7d9SAlexander Kabaev       iterator
261f8a1b7d9SAlexander Kabaev       begin()
262f8a1b7d9SAlexander Kabaev       {
263f8a1b7d9SAlexander Kabaev 	this->_M_leak();
264f8a1b7d9SAlexander Kabaev 	return iterator(this->_M_data());
265f8a1b7d9SAlexander Kabaev       }
266f8a1b7d9SAlexander Kabaev 
267f8a1b7d9SAlexander Kabaev       /**
268f8a1b7d9SAlexander Kabaev        *  Returns a read-only (constant) iterator that points to the first
269f8a1b7d9SAlexander Kabaev        *  character in the %string.
270f8a1b7d9SAlexander Kabaev        */
271f8a1b7d9SAlexander Kabaev       const_iterator
272f8a1b7d9SAlexander Kabaev       begin() const
273f8a1b7d9SAlexander Kabaev       { return const_iterator(this->_M_data()); }
274f8a1b7d9SAlexander Kabaev 
275f8a1b7d9SAlexander Kabaev       /**
276f8a1b7d9SAlexander Kabaev        *  Returns a read/write iterator that points one past the last
277f8a1b7d9SAlexander Kabaev        *  character in the %string.  Unshares the string.
278f8a1b7d9SAlexander Kabaev        */
279f8a1b7d9SAlexander Kabaev       iterator
280f8a1b7d9SAlexander Kabaev       end()
281f8a1b7d9SAlexander Kabaev       {
282f8a1b7d9SAlexander Kabaev 	this->_M_leak();
283f8a1b7d9SAlexander Kabaev 	return iterator(this->_M_data() + this->size());
284f8a1b7d9SAlexander Kabaev       }
285f8a1b7d9SAlexander Kabaev 
286f8a1b7d9SAlexander Kabaev       /**
287f8a1b7d9SAlexander Kabaev        *  Returns a read-only (constant) iterator that points one past the
288f8a1b7d9SAlexander Kabaev        *  last character in the %string.
289f8a1b7d9SAlexander Kabaev        */
290f8a1b7d9SAlexander Kabaev       const_iterator
291f8a1b7d9SAlexander Kabaev       end() const
292f8a1b7d9SAlexander Kabaev       { return const_iterator(this->_M_data() + this->size()); }
293f8a1b7d9SAlexander Kabaev 
294f8a1b7d9SAlexander Kabaev       /**
295f8a1b7d9SAlexander Kabaev        *  Returns a read/write reverse iterator that points to the last
296f8a1b7d9SAlexander Kabaev        *  character in the %string.  Iteration is done in reverse element
297f8a1b7d9SAlexander Kabaev        *  order.  Unshares the string.
298f8a1b7d9SAlexander Kabaev        */
299f8a1b7d9SAlexander Kabaev       reverse_iterator
300f8a1b7d9SAlexander Kabaev       rbegin()
301f8a1b7d9SAlexander Kabaev       { return reverse_iterator(this->end()); }
302f8a1b7d9SAlexander Kabaev 
303f8a1b7d9SAlexander Kabaev       /**
304f8a1b7d9SAlexander Kabaev        *  Returns a read-only (constant) reverse iterator that points
305f8a1b7d9SAlexander Kabaev        *  to the last character in the %string.  Iteration is done in
306f8a1b7d9SAlexander Kabaev        *  reverse element order.
307f8a1b7d9SAlexander Kabaev        */
308f8a1b7d9SAlexander Kabaev       const_reverse_iterator
309f8a1b7d9SAlexander Kabaev       rbegin() const
310f8a1b7d9SAlexander Kabaev       { return const_reverse_iterator(this->end()); }
311f8a1b7d9SAlexander Kabaev 
312f8a1b7d9SAlexander Kabaev       /**
313f8a1b7d9SAlexander Kabaev        *  Returns a read/write reverse iterator that points to one before the
314f8a1b7d9SAlexander Kabaev        *  first character in the %string.  Iteration is done in reverse
315f8a1b7d9SAlexander Kabaev        *  element order.  Unshares the string.
316f8a1b7d9SAlexander Kabaev        */
317f8a1b7d9SAlexander Kabaev       reverse_iterator
318f8a1b7d9SAlexander Kabaev       rend()
319f8a1b7d9SAlexander Kabaev       { return reverse_iterator(this->begin()); }
320f8a1b7d9SAlexander Kabaev 
321f8a1b7d9SAlexander Kabaev       /**
322f8a1b7d9SAlexander Kabaev        *  Returns a read-only (constant) reverse iterator that points
323f8a1b7d9SAlexander Kabaev        *  to one before the first character in the %string.  Iteration
324f8a1b7d9SAlexander Kabaev        *  is done in reverse element order.
325f8a1b7d9SAlexander Kabaev        */
326f8a1b7d9SAlexander Kabaev       const_reverse_iterator
327f8a1b7d9SAlexander Kabaev       rend() const
328f8a1b7d9SAlexander Kabaev       { return const_reverse_iterator(this->begin()); }
329f8a1b7d9SAlexander Kabaev 
330f8a1b7d9SAlexander Kabaev     public:
331f8a1b7d9SAlexander Kabaev       // Capacity:
332f8a1b7d9SAlexander Kabaev       ///  Returns the number of characters in the string, not including any
333f8a1b7d9SAlexander Kabaev       ///  null-termination.
334f8a1b7d9SAlexander Kabaev       size_type
335f8a1b7d9SAlexander Kabaev       size() const
336f8a1b7d9SAlexander Kabaev       { return this->_M_length(); }
337f8a1b7d9SAlexander Kabaev 
338f8a1b7d9SAlexander Kabaev       ///  Returns the number of characters in the string, not including any
339f8a1b7d9SAlexander Kabaev       ///  null-termination.
340f8a1b7d9SAlexander Kabaev       size_type
341f8a1b7d9SAlexander Kabaev       length() const
342f8a1b7d9SAlexander Kabaev       { return this->_M_length(); }
343f8a1b7d9SAlexander Kabaev 
344f8a1b7d9SAlexander Kabaev       /// Returns the size() of the largest possible %string.
345f8a1b7d9SAlexander Kabaev       size_type
346f8a1b7d9SAlexander Kabaev       max_size() const
347f8a1b7d9SAlexander Kabaev       { return this->_M_max_size(); }
348f8a1b7d9SAlexander Kabaev 
349f8a1b7d9SAlexander Kabaev       /**
350f8a1b7d9SAlexander Kabaev        *  @brief  Resizes the %string to the specified number of characters.
351f8a1b7d9SAlexander Kabaev        *  @param  n  Number of characters the %string should contain.
352f8a1b7d9SAlexander Kabaev        *  @param  c  Character to fill any new elements.
353f8a1b7d9SAlexander Kabaev        *
354f8a1b7d9SAlexander Kabaev        *  This function will %resize the %string to the specified
355f8a1b7d9SAlexander Kabaev        *  number of characters.  If the number is smaller than the
356f8a1b7d9SAlexander Kabaev        *  %string's current size the %string is truncated, otherwise
357f8a1b7d9SAlexander Kabaev        *  the %string is extended and new elements are set to @a c.
358f8a1b7d9SAlexander Kabaev        */
359f8a1b7d9SAlexander Kabaev       void
360f8a1b7d9SAlexander Kabaev       resize(size_type __n, _CharT __c);
361f8a1b7d9SAlexander Kabaev 
362f8a1b7d9SAlexander Kabaev       /**
363f8a1b7d9SAlexander Kabaev        *  @brief  Resizes the %string to the specified number of characters.
364f8a1b7d9SAlexander Kabaev        *  @param  n  Number of characters the %string should contain.
365f8a1b7d9SAlexander Kabaev        *
366f8a1b7d9SAlexander Kabaev        *  This function will resize the %string to the specified length.  If
367f8a1b7d9SAlexander Kabaev        *  the new size is smaller than the %string's current size the %string
368f8a1b7d9SAlexander Kabaev        *  is truncated, otherwise the %string is extended and new characters
369f8a1b7d9SAlexander Kabaev        *  are default-constructed.  For basic types such as char, this means
370f8a1b7d9SAlexander Kabaev        *  setting them to 0.
371f8a1b7d9SAlexander Kabaev        */
372f8a1b7d9SAlexander Kabaev       void
373f8a1b7d9SAlexander Kabaev       resize(size_type __n)
374f8a1b7d9SAlexander Kabaev       { this->resize(__n, _CharT()); }
375f8a1b7d9SAlexander Kabaev 
376f8a1b7d9SAlexander Kabaev       /**
377f8a1b7d9SAlexander Kabaev        *  Returns the total number of characters that the %string can hold
378f8a1b7d9SAlexander Kabaev        *  before needing to allocate more memory.
379f8a1b7d9SAlexander Kabaev        */
380f8a1b7d9SAlexander Kabaev       size_type
381f8a1b7d9SAlexander Kabaev       capacity() const
382f8a1b7d9SAlexander Kabaev       { return this->_M_capacity(); }
383f8a1b7d9SAlexander Kabaev 
384f8a1b7d9SAlexander Kabaev       /**
385f8a1b7d9SAlexander Kabaev        *  @brief  Attempt to preallocate enough memory for specified number of
386f8a1b7d9SAlexander Kabaev        *          characters.
387f8a1b7d9SAlexander Kabaev        *  @param  res_arg  Number of characters required.
388f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If @a res_arg exceeds @c max_size().
389f8a1b7d9SAlexander Kabaev        *
390f8a1b7d9SAlexander Kabaev        *  This function attempts to reserve enough memory for the
391f8a1b7d9SAlexander Kabaev        *  %string to hold the specified number of characters.  If the
392f8a1b7d9SAlexander Kabaev        *  number requested is more than max_size(), length_error is
393f8a1b7d9SAlexander Kabaev        *  thrown.
394f8a1b7d9SAlexander Kabaev        *
395f8a1b7d9SAlexander Kabaev        *  The advantage of this function is that if optimal code is a
396f8a1b7d9SAlexander Kabaev        *  necessity and the user can determine the string length that will be
397f8a1b7d9SAlexander Kabaev        *  required, the user can reserve the memory in %advance, and thus
398f8a1b7d9SAlexander Kabaev        *  prevent a possible reallocation of memory and copying of %string
399f8a1b7d9SAlexander Kabaev        *  data.
400f8a1b7d9SAlexander Kabaev        */
401f8a1b7d9SAlexander Kabaev       void
402f8a1b7d9SAlexander Kabaev       reserve(size_type __res_arg = 0)
403f8a1b7d9SAlexander Kabaev       { this->_M_reserve(__res_arg); }
404f8a1b7d9SAlexander Kabaev 
405f8a1b7d9SAlexander Kabaev       /**
406f8a1b7d9SAlexander Kabaev        *  Erases the string, making it empty.
407f8a1b7d9SAlexander Kabaev        */
408f8a1b7d9SAlexander Kabaev       void
409f8a1b7d9SAlexander Kabaev       clear()
410f8a1b7d9SAlexander Kabaev       { this->_M_clear(); }
411f8a1b7d9SAlexander Kabaev 
412f8a1b7d9SAlexander Kabaev       /**
413f8a1b7d9SAlexander Kabaev        *  Returns true if the %string is empty.  Equivalent to *this == "".
414f8a1b7d9SAlexander Kabaev        */
415f8a1b7d9SAlexander Kabaev       bool
416f8a1b7d9SAlexander Kabaev       empty() const
417f8a1b7d9SAlexander Kabaev       { return this->size() == 0; }
418f8a1b7d9SAlexander Kabaev 
419f8a1b7d9SAlexander Kabaev       // Element access:
420f8a1b7d9SAlexander Kabaev       /**
421f8a1b7d9SAlexander Kabaev        *  @brief  Subscript access to the data contained in the %string.
422f8a1b7d9SAlexander Kabaev        *  @param  pos  The index of the character to access.
423f8a1b7d9SAlexander Kabaev        *  @return  Read-only (constant) reference to the character.
424f8a1b7d9SAlexander Kabaev        *
425f8a1b7d9SAlexander Kabaev        *  This operator allows for easy, array-style, data access.
426f8a1b7d9SAlexander Kabaev        *  Note that data access with this operator is unchecked and
427f8a1b7d9SAlexander Kabaev        *  out_of_range lookups are not defined. (For checked lookups
428f8a1b7d9SAlexander Kabaev        *  see at().)
429f8a1b7d9SAlexander Kabaev        */
430f8a1b7d9SAlexander Kabaev       const_reference
431f8a1b7d9SAlexander Kabaev       operator[] (size_type __pos) const
432f8a1b7d9SAlexander Kabaev       {
433f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_ASSERT(__pos <= this->size());
434f8a1b7d9SAlexander Kabaev 	return this->_M_data()[__pos];
435f8a1b7d9SAlexander Kabaev       }
436f8a1b7d9SAlexander Kabaev 
437f8a1b7d9SAlexander Kabaev       /**
438f8a1b7d9SAlexander Kabaev        *  @brief  Subscript access to the data contained in the %string.
439f8a1b7d9SAlexander Kabaev        *  @param  pos  The index of the character to access.
440f8a1b7d9SAlexander Kabaev        *  @return  Read/write reference to the character.
441f8a1b7d9SAlexander Kabaev        *
442f8a1b7d9SAlexander Kabaev        *  This operator allows for easy, array-style, data access.
443f8a1b7d9SAlexander Kabaev        *  Note that data access with this operator is unchecked and
444f8a1b7d9SAlexander Kabaev        *  out_of_range lookups are not defined. (For checked lookups
445f8a1b7d9SAlexander Kabaev        *  see at().)  Unshares the string.
446f8a1b7d9SAlexander Kabaev        */
447f8a1b7d9SAlexander Kabaev       reference
448f8a1b7d9SAlexander Kabaev       operator[](size_type __pos)
449f8a1b7d9SAlexander Kabaev       {
450f8a1b7d9SAlexander Kabaev         // allow pos == size() as v3 extension:
451f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_ASSERT(__pos <= this->size());
452f8a1b7d9SAlexander Kabaev         // but be strict in pedantic mode:
453f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(__pos < this->size());
454f8a1b7d9SAlexander Kabaev 	this->_M_leak();
455f8a1b7d9SAlexander Kabaev 	return this->_M_data()[__pos];
456f8a1b7d9SAlexander Kabaev       }
457f8a1b7d9SAlexander Kabaev 
458f8a1b7d9SAlexander Kabaev       /**
459f8a1b7d9SAlexander Kabaev        *  @brief  Provides access to the data contained in the %string.
460f8a1b7d9SAlexander Kabaev        *  @param n The index of the character to access.
461f8a1b7d9SAlexander Kabaev        *  @return  Read-only (const) reference to the character.
462f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a n is an invalid index.
463f8a1b7d9SAlexander Kabaev        *
464f8a1b7d9SAlexander Kabaev        *  This function provides for safer data access.  The parameter is
465f8a1b7d9SAlexander Kabaev        *  first checked that it is in the range of the string.  The function
466f8a1b7d9SAlexander Kabaev        *  throws out_of_range if the check fails.
467f8a1b7d9SAlexander Kabaev        */
468f8a1b7d9SAlexander Kabaev       const_reference
469f8a1b7d9SAlexander Kabaev       at(size_type __n) const
470f8a1b7d9SAlexander Kabaev       {
471f8a1b7d9SAlexander Kabaev 	if (__n >= this->size())
472f8a1b7d9SAlexander Kabaev 	  std::__throw_out_of_range(__N("__versa_string::at"));
473f8a1b7d9SAlexander Kabaev 	return this->_M_data()[__n];
474f8a1b7d9SAlexander Kabaev       }
475f8a1b7d9SAlexander Kabaev 
476f8a1b7d9SAlexander Kabaev       /**
477f8a1b7d9SAlexander Kabaev        *  @brief  Provides access to the data contained in the %string.
478f8a1b7d9SAlexander Kabaev        *  @param n The index of the character to access.
479f8a1b7d9SAlexander Kabaev        *  @return  Read/write reference to the character.
480f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a n is an invalid index.
481f8a1b7d9SAlexander Kabaev        *
482f8a1b7d9SAlexander Kabaev        *  This function provides for safer data access.  The parameter is
483f8a1b7d9SAlexander Kabaev        *  first checked that it is in the range of the string.  The function
484f8a1b7d9SAlexander Kabaev        *  throws out_of_range if the check fails.  Success results in
485f8a1b7d9SAlexander Kabaev        *  unsharing the string.
486f8a1b7d9SAlexander Kabaev        */
487f8a1b7d9SAlexander Kabaev       reference
488f8a1b7d9SAlexander Kabaev       at(size_type __n)
489f8a1b7d9SAlexander Kabaev       {
490f8a1b7d9SAlexander Kabaev 	if (__n >= this->size())
491f8a1b7d9SAlexander Kabaev 	  std::__throw_out_of_range(__N("__versa_string::at"));
492f8a1b7d9SAlexander Kabaev 	this->_M_leak();
493f8a1b7d9SAlexander Kabaev 	return this->_M_data()[__n];
494f8a1b7d9SAlexander Kabaev       }
495f8a1b7d9SAlexander Kabaev 
496f8a1b7d9SAlexander Kabaev       // Modifiers:
497f8a1b7d9SAlexander Kabaev       /**
498f8a1b7d9SAlexander Kabaev        *  @brief  Append a string to this string.
499f8a1b7d9SAlexander Kabaev        *  @param str  The string to append.
500f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
501f8a1b7d9SAlexander Kabaev        */
502f8a1b7d9SAlexander Kabaev       __versa_string&
503f8a1b7d9SAlexander Kabaev       operator+=(const __versa_string& __str)
504f8a1b7d9SAlexander Kabaev       { return this->append(__str); }
505f8a1b7d9SAlexander Kabaev 
506f8a1b7d9SAlexander Kabaev       /**
507f8a1b7d9SAlexander Kabaev        *  @brief  Append a C string.
508f8a1b7d9SAlexander Kabaev        *  @param s  The C string to append.
509f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
510f8a1b7d9SAlexander Kabaev        */
511f8a1b7d9SAlexander Kabaev       __versa_string&
512f8a1b7d9SAlexander Kabaev       operator+=(const _CharT* __s)
513f8a1b7d9SAlexander Kabaev       { return this->append(__s); }
514f8a1b7d9SAlexander Kabaev 
515f8a1b7d9SAlexander Kabaev       /**
516f8a1b7d9SAlexander Kabaev        *  @brief  Append a character.
517f8a1b7d9SAlexander Kabaev        *  @param c  The character to append.
518f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
519f8a1b7d9SAlexander Kabaev        */
520f8a1b7d9SAlexander Kabaev       __versa_string&
521f8a1b7d9SAlexander Kabaev       operator+=(_CharT __c)
522f8a1b7d9SAlexander Kabaev       {
523f8a1b7d9SAlexander Kabaev 	this->push_back(__c);
524f8a1b7d9SAlexander Kabaev 	return *this;
525f8a1b7d9SAlexander Kabaev       }
526f8a1b7d9SAlexander Kabaev 
527f8a1b7d9SAlexander Kabaev       /**
528f8a1b7d9SAlexander Kabaev        *  @brief  Append a string to this string.
529f8a1b7d9SAlexander Kabaev        *  @param str  The string to append.
530f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
531f8a1b7d9SAlexander Kabaev        */
532f8a1b7d9SAlexander Kabaev       __versa_string&
533f8a1b7d9SAlexander Kabaev       append(const __versa_string& __str)
534f8a1b7d9SAlexander Kabaev       { return _M_append(__str._M_data(), __str.size()); }
535f8a1b7d9SAlexander Kabaev 
536f8a1b7d9SAlexander Kabaev       /**
537f8a1b7d9SAlexander Kabaev        *  @brief  Append a substring.
538f8a1b7d9SAlexander Kabaev        *  @param str  The string to append.
539f8a1b7d9SAlexander Kabaev        *  @param pos  Index of the first character of str to append.
540f8a1b7d9SAlexander Kabaev        *  @param n  The number of characters to append.
541f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
542f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range if @a pos is not a valid index.
543f8a1b7d9SAlexander Kabaev        *
544f8a1b7d9SAlexander Kabaev        *  This function appends @a n characters from @a str starting at @a pos
545f8a1b7d9SAlexander Kabaev        *  to this string.  If @a n is is larger than the number of available
546f8a1b7d9SAlexander Kabaev        *  characters in @a str, the remainder of @a str is appended.
547f8a1b7d9SAlexander Kabaev        */
548f8a1b7d9SAlexander Kabaev       __versa_string&
549f8a1b7d9SAlexander Kabaev       append(const __versa_string& __str, size_type __pos, size_type __n)
550f8a1b7d9SAlexander Kabaev       { return _M_append(__str._M_data()
551f8a1b7d9SAlexander Kabaev 			 + __str._M_check(__pos, "__versa_string::append"),
552f8a1b7d9SAlexander Kabaev 			 __str._M_limit(__pos, __n)); }
553f8a1b7d9SAlexander Kabaev 
554f8a1b7d9SAlexander Kabaev       /**
555f8a1b7d9SAlexander Kabaev        *  @brief  Append a C substring.
556f8a1b7d9SAlexander Kabaev        *  @param s  The C string to append.
557f8a1b7d9SAlexander Kabaev        *  @param n  The number of characters to append.
558f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
559f8a1b7d9SAlexander Kabaev        */
560f8a1b7d9SAlexander Kabaev       __versa_string&
561f8a1b7d9SAlexander Kabaev       append(const _CharT* __s, size_type __n)
562f8a1b7d9SAlexander Kabaev       {
563f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string_len(__s, __n);
564f8a1b7d9SAlexander Kabaev 	_M_check_length(size_type(0), __n, "__versa_string::append");
565f8a1b7d9SAlexander Kabaev 	return _M_append(__s, __n);
566f8a1b7d9SAlexander Kabaev       }
567f8a1b7d9SAlexander Kabaev 
568f8a1b7d9SAlexander Kabaev       /**
569f8a1b7d9SAlexander Kabaev        *  @brief  Append a C string.
570f8a1b7d9SAlexander Kabaev        *  @param s  The C string to append.
571f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
572f8a1b7d9SAlexander Kabaev        */
573f8a1b7d9SAlexander Kabaev       __versa_string&
574f8a1b7d9SAlexander Kabaev       append(const _CharT* __s)
575f8a1b7d9SAlexander Kabaev       {
576f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
577f8a1b7d9SAlexander Kabaev 	const size_type __n = traits_type::length(__s);
578f8a1b7d9SAlexander Kabaev 	_M_check_length(size_type(0), __n, "__versa_string::append");
579f8a1b7d9SAlexander Kabaev 	return _M_append(__s, __n);
580f8a1b7d9SAlexander Kabaev       }
581f8a1b7d9SAlexander Kabaev 
582f8a1b7d9SAlexander Kabaev       /**
583f8a1b7d9SAlexander Kabaev        *  @brief  Append multiple characters.
584f8a1b7d9SAlexander Kabaev        *  @param n  The number of characters to append.
585f8a1b7d9SAlexander Kabaev        *  @param c  The character to use.
586f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
587f8a1b7d9SAlexander Kabaev        *
588f8a1b7d9SAlexander Kabaev        *  Appends n copies of c to this string.
589f8a1b7d9SAlexander Kabaev        */
590f8a1b7d9SAlexander Kabaev       __versa_string&
591f8a1b7d9SAlexander Kabaev       append(size_type __n, _CharT __c)
592f8a1b7d9SAlexander Kabaev       { return _M_replace_aux(this->size(), size_type(0), __n, __c); }
593f8a1b7d9SAlexander Kabaev 
594f8a1b7d9SAlexander Kabaev       /**
595f8a1b7d9SAlexander Kabaev        *  @brief  Append a range of characters.
596f8a1b7d9SAlexander Kabaev        *  @param first  Iterator referencing the first character to append.
597f8a1b7d9SAlexander Kabaev        *  @param last  Iterator marking the end of the range.
598f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
599f8a1b7d9SAlexander Kabaev        *
600f8a1b7d9SAlexander Kabaev        *  Appends characters in the range [first,last) to this string.
601f8a1b7d9SAlexander Kabaev        */
602f8a1b7d9SAlexander Kabaev       template<class _InputIterator>
603f8a1b7d9SAlexander Kabaev         __versa_string&
604f8a1b7d9SAlexander Kabaev         append(_InputIterator __first, _InputIterator __last)
605f8a1b7d9SAlexander Kabaev         { return this->replace(_M_iend(), _M_iend(), __first, __last); }
606f8a1b7d9SAlexander Kabaev 
607f8a1b7d9SAlexander Kabaev       /**
608f8a1b7d9SAlexander Kabaev        *  @brief  Append a single character.
609f8a1b7d9SAlexander Kabaev        *  @param c  Character to append.
610f8a1b7d9SAlexander Kabaev        */
611f8a1b7d9SAlexander Kabaev       void
612f8a1b7d9SAlexander Kabaev       push_back(_CharT __c)
613f8a1b7d9SAlexander Kabaev       {
614f8a1b7d9SAlexander Kabaev 	const size_type __size = this->size();
615f8a1b7d9SAlexander Kabaev 	if (__size + 1 > this->capacity() || this->_M_is_shared())
616f8a1b7d9SAlexander Kabaev 	  this->_M_mutate(__size, size_type(0), 0, size_type(1));
617f8a1b7d9SAlexander Kabaev 	traits_type::assign(this->_M_data()[__size], __c);
618f8a1b7d9SAlexander Kabaev 	this->_M_set_length(__size + 1);
619f8a1b7d9SAlexander Kabaev       }
620f8a1b7d9SAlexander Kabaev 
621f8a1b7d9SAlexander Kabaev       /**
622f8a1b7d9SAlexander Kabaev        *  @brief  Set value to contents of another string.
623f8a1b7d9SAlexander Kabaev        *  @param  str  Source string to use.
624f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
625f8a1b7d9SAlexander Kabaev        */
626f8a1b7d9SAlexander Kabaev       __versa_string&
627f8a1b7d9SAlexander Kabaev       assign(const __versa_string& __str)
628f8a1b7d9SAlexander Kabaev       {
629f8a1b7d9SAlexander Kabaev 	this->_M_assign(__str);
630f8a1b7d9SAlexander Kabaev 	return *this;
631f8a1b7d9SAlexander Kabaev       }
632f8a1b7d9SAlexander Kabaev 
633f8a1b7d9SAlexander Kabaev       /**
634f8a1b7d9SAlexander Kabaev        *  @brief  Set value to a substring of a string.
635f8a1b7d9SAlexander Kabaev        *  @param str  The string to use.
636f8a1b7d9SAlexander Kabaev        *  @param pos  Index of the first character of str.
637f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters to use.
638f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
639f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range if @a pos is not a valid index.
640f8a1b7d9SAlexander Kabaev        *
641f8a1b7d9SAlexander Kabaev        *  This function sets this string to the substring of @a str consisting
642f8a1b7d9SAlexander Kabaev        *  of @a n characters at @a pos.  If @a n is is larger than the number
643f8a1b7d9SAlexander Kabaev        *  of available characters in @a str, the remainder of @a str is used.
644f8a1b7d9SAlexander Kabaev        */
645f8a1b7d9SAlexander Kabaev       __versa_string&
646f8a1b7d9SAlexander Kabaev       assign(const __versa_string& __str, size_type __pos, size_type __n)
647f8a1b7d9SAlexander Kabaev       { return _M_replace(size_type(0), this->size(), __str._M_data()
648f8a1b7d9SAlexander Kabaev 			  + __str._M_check(__pos, "__versa_string::assign"),
649f8a1b7d9SAlexander Kabaev 			  __str._M_limit(__pos, __n)); }
650f8a1b7d9SAlexander Kabaev 
651f8a1b7d9SAlexander Kabaev       /**
652f8a1b7d9SAlexander Kabaev        *  @brief  Set value to a C substring.
653f8a1b7d9SAlexander Kabaev        *  @param s  The C string to use.
654f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters to use.
655f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
656f8a1b7d9SAlexander Kabaev        *
657f8a1b7d9SAlexander Kabaev        *  This function sets the value of this string to the first @a n
658f8a1b7d9SAlexander Kabaev        *  characters of @a s.  If @a n is is larger than the number of
659f8a1b7d9SAlexander Kabaev        *  available characters in @a s, the remainder of @a s is used.
660f8a1b7d9SAlexander Kabaev        */
661f8a1b7d9SAlexander Kabaev       __versa_string&
662f8a1b7d9SAlexander Kabaev       assign(const _CharT* __s, size_type __n)
663f8a1b7d9SAlexander Kabaev       {
664f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string_len(__s, __n);
665f8a1b7d9SAlexander Kabaev 	return _M_replace(size_type(0), this->size(), __s, __n);
666f8a1b7d9SAlexander Kabaev       }
667f8a1b7d9SAlexander Kabaev 
668f8a1b7d9SAlexander Kabaev       /**
669f8a1b7d9SAlexander Kabaev        *  @brief  Set value to contents of a C string.
670f8a1b7d9SAlexander Kabaev        *  @param s  The C string to use.
671f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
672f8a1b7d9SAlexander Kabaev        *
673f8a1b7d9SAlexander Kabaev        *  This function sets the value of this string to the value of @a s.
674f8a1b7d9SAlexander Kabaev        *  The data is copied, so there is no dependence on @a s once the
675f8a1b7d9SAlexander Kabaev        *  function returns.
676f8a1b7d9SAlexander Kabaev        */
677f8a1b7d9SAlexander Kabaev       __versa_string&
678f8a1b7d9SAlexander Kabaev       assign(const _CharT* __s)
679f8a1b7d9SAlexander Kabaev       {
680f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
681f8a1b7d9SAlexander Kabaev 	return _M_replace(size_type(0), this->size(), __s,
682f8a1b7d9SAlexander Kabaev 			  traits_type::length(__s));
683f8a1b7d9SAlexander Kabaev       }
684f8a1b7d9SAlexander Kabaev 
685f8a1b7d9SAlexander Kabaev       /**
686f8a1b7d9SAlexander Kabaev        *  @brief  Set value to multiple characters.
687f8a1b7d9SAlexander Kabaev        *  @param n  Length of the resulting string.
688f8a1b7d9SAlexander Kabaev        *  @param c  The character to use.
689f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
690f8a1b7d9SAlexander Kabaev        *
691f8a1b7d9SAlexander Kabaev        *  This function sets the value of this string to @a n copies of
692f8a1b7d9SAlexander Kabaev        *  character @a c.
693f8a1b7d9SAlexander Kabaev        */
694f8a1b7d9SAlexander Kabaev       __versa_string&
695f8a1b7d9SAlexander Kabaev       assign(size_type __n, _CharT __c)
696f8a1b7d9SAlexander Kabaev       { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
697f8a1b7d9SAlexander Kabaev 
698f8a1b7d9SAlexander Kabaev       /**
699f8a1b7d9SAlexander Kabaev        *  @brief  Set value to a range of characters.
700f8a1b7d9SAlexander Kabaev        *  @param first  Iterator referencing the first character to append.
701f8a1b7d9SAlexander Kabaev        *  @param last  Iterator marking the end of the range.
702f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
703f8a1b7d9SAlexander Kabaev        *
704f8a1b7d9SAlexander Kabaev        *  Sets value of string to characters in the range [first,last).
705f8a1b7d9SAlexander Kabaev       */
706f8a1b7d9SAlexander Kabaev       template<class _InputIterator>
707f8a1b7d9SAlexander Kabaev         __versa_string&
708f8a1b7d9SAlexander Kabaev         assign(_InputIterator __first, _InputIterator __last)
709f8a1b7d9SAlexander Kabaev         { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
710f8a1b7d9SAlexander Kabaev 
711f8a1b7d9SAlexander Kabaev       /**
712f8a1b7d9SAlexander Kabaev        *  @brief  Insert multiple characters.
713f8a1b7d9SAlexander Kabaev        *  @param p  Iterator referencing location in string to insert at.
714f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters to insert
715f8a1b7d9SAlexander Kabaev        *  @param c  The character to insert.
716f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
717f8a1b7d9SAlexander Kabaev        *
718f8a1b7d9SAlexander Kabaev        *  Inserts @a n copies of character @a c starting at the position
719f8a1b7d9SAlexander Kabaev        *  referenced by iterator @a p.  If adding characters causes the length
720f8a1b7d9SAlexander Kabaev        *  to exceed max_size(), length_error is thrown.  The value of the
721f8a1b7d9SAlexander Kabaev        *  string doesn't change if an error is thrown.
722f8a1b7d9SAlexander Kabaev       */
723f8a1b7d9SAlexander Kabaev       void
724f8a1b7d9SAlexander Kabaev       insert(iterator __p, size_type __n, _CharT __c)
725f8a1b7d9SAlexander Kabaev       {	this->replace(__p, __p, __n, __c);  }
726f8a1b7d9SAlexander Kabaev 
727f8a1b7d9SAlexander Kabaev       /**
728f8a1b7d9SAlexander Kabaev        *  @brief  Insert a range of characters.
729f8a1b7d9SAlexander Kabaev        *  @param p  Iterator referencing location in string to insert at.
730f8a1b7d9SAlexander Kabaev        *  @param beg  Start of range.
731f8a1b7d9SAlexander Kabaev        *  @param end  End of range.
732f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
733f8a1b7d9SAlexander Kabaev        *
734f8a1b7d9SAlexander Kabaev        *  Inserts characters in range [beg,end).  If adding characters causes
735f8a1b7d9SAlexander Kabaev        *  the length to exceed max_size(), length_error is thrown.  The value
736f8a1b7d9SAlexander Kabaev        *  of the string doesn't change if an error is thrown.
737f8a1b7d9SAlexander Kabaev       */
738f8a1b7d9SAlexander Kabaev       template<class _InputIterator>
739f8a1b7d9SAlexander Kabaev         void
740f8a1b7d9SAlexander Kabaev         insert(iterator __p, _InputIterator __beg, _InputIterator __end)
741f8a1b7d9SAlexander Kabaev         { this->replace(__p, __p, __beg, __end); }
742f8a1b7d9SAlexander Kabaev 
743f8a1b7d9SAlexander Kabaev       /**
744f8a1b7d9SAlexander Kabaev        *  @brief  Insert value of a string.
745f8a1b7d9SAlexander Kabaev        *  @param pos1  Iterator referencing location in string to insert at.
746f8a1b7d9SAlexander Kabaev        *  @param str  The string to insert.
747f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
748f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
749f8a1b7d9SAlexander Kabaev        *
750f8a1b7d9SAlexander Kabaev        *  Inserts value of @a str starting at @a pos1.  If adding characters
751f8a1b7d9SAlexander Kabaev        *  causes the length to exceed max_size(), length_error is thrown.  The
752f8a1b7d9SAlexander Kabaev        *  value of the string doesn't change if an error is thrown.
753f8a1b7d9SAlexander Kabaev       */
754f8a1b7d9SAlexander Kabaev       __versa_string&
755f8a1b7d9SAlexander Kabaev       insert(size_type __pos1, const __versa_string& __str)
756f8a1b7d9SAlexander Kabaev       { return this->replace(__pos1, size_type(0),
757f8a1b7d9SAlexander Kabaev 			     __str._M_data(), __str.size()); }
758f8a1b7d9SAlexander Kabaev 
759f8a1b7d9SAlexander Kabaev       /**
760f8a1b7d9SAlexander Kabaev        *  @brief  Insert a substring.
761f8a1b7d9SAlexander Kabaev        *  @param pos1  Iterator referencing location in string to insert at.
762f8a1b7d9SAlexander Kabaev        *  @param str  The string to insert.
763f8a1b7d9SAlexander Kabaev        *  @param pos2  Start of characters in str to insert.
764f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters to insert.
765f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
766f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
767f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos1 > size() or
768f8a1b7d9SAlexander Kabaev        *  @a pos2 > @a str.size().
769f8a1b7d9SAlexander Kabaev        *
770f8a1b7d9SAlexander Kabaev        *  Starting at @a pos1, insert @a n character of @a str beginning with
771f8a1b7d9SAlexander Kabaev        *  @a pos2.  If adding characters causes the length to exceed
772f8a1b7d9SAlexander Kabaev        *  max_size(), length_error is thrown.  If @a pos1 is beyond the end of
773f8a1b7d9SAlexander Kabaev        *  this string or @a pos2 is beyond the end of @a str, out_of_range is
774f8a1b7d9SAlexander Kabaev        *  thrown.  The value of the string doesn't change if an error is
775f8a1b7d9SAlexander Kabaev        *  thrown.
776f8a1b7d9SAlexander Kabaev       */
777f8a1b7d9SAlexander Kabaev       __versa_string&
778f8a1b7d9SAlexander Kabaev       insert(size_type __pos1, const __versa_string& __str,
779f8a1b7d9SAlexander Kabaev 	     size_type __pos2, size_type __n)
780f8a1b7d9SAlexander Kabaev       { return this->replace(__pos1, size_type(0), __str._M_data()
781f8a1b7d9SAlexander Kabaev 			     + __str._M_check(__pos2, "__versa_string::insert"),
782f8a1b7d9SAlexander Kabaev 			     __str._M_limit(__pos2, __n)); }
783f8a1b7d9SAlexander Kabaev 
784f8a1b7d9SAlexander Kabaev       /**
785f8a1b7d9SAlexander Kabaev        *  @brief  Insert a C substring.
786f8a1b7d9SAlexander Kabaev        *  @param pos  Iterator referencing location in string to insert at.
787f8a1b7d9SAlexander Kabaev        *  @param s  The C string to insert.
788f8a1b7d9SAlexander Kabaev        *  @param n  The number of characters to insert.
789f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
790f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
791f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos is beyond the end of this
792f8a1b7d9SAlexander Kabaev        *  string.
793f8a1b7d9SAlexander Kabaev        *
794f8a1b7d9SAlexander Kabaev        *  Inserts the first @a n characters of @a s starting at @a pos.  If
795f8a1b7d9SAlexander Kabaev        *  adding characters causes the length to exceed max_size(),
796f8a1b7d9SAlexander Kabaev        *  length_error is thrown.  If @a pos is beyond end(), out_of_range is
797f8a1b7d9SAlexander Kabaev        *  thrown.  The value of the string doesn't change if an error is
798f8a1b7d9SAlexander Kabaev        *  thrown.
799f8a1b7d9SAlexander Kabaev       */
800f8a1b7d9SAlexander Kabaev       __versa_string&
801f8a1b7d9SAlexander Kabaev       insert(size_type __pos, const _CharT* __s, size_type __n)
802f8a1b7d9SAlexander Kabaev       { return this->replace(__pos, size_type(0), __s, __n); }
803f8a1b7d9SAlexander Kabaev 
804f8a1b7d9SAlexander Kabaev       /**
805f8a1b7d9SAlexander Kabaev        *  @brief  Insert a C string.
806f8a1b7d9SAlexander Kabaev        *  @param pos  Iterator referencing location in string to insert at.
807f8a1b7d9SAlexander Kabaev        *  @param s  The C string to insert.
808f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
809f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
810f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos is beyond the end of this
811f8a1b7d9SAlexander Kabaev        *  string.
812f8a1b7d9SAlexander Kabaev        *
813f8a1b7d9SAlexander Kabaev        *  Inserts the first @a n characters of @a s starting at @a pos.  If
814f8a1b7d9SAlexander Kabaev        *  adding characters causes the length to exceed max_size(),
815f8a1b7d9SAlexander Kabaev        *  length_error is thrown.  If @a pos is beyond end(), out_of_range is
816f8a1b7d9SAlexander Kabaev        *  thrown.  The value of the string doesn't change if an error is
817f8a1b7d9SAlexander Kabaev        *  thrown.
818f8a1b7d9SAlexander Kabaev       */
819f8a1b7d9SAlexander Kabaev       __versa_string&
820f8a1b7d9SAlexander Kabaev       insert(size_type __pos, const _CharT* __s)
821f8a1b7d9SAlexander Kabaev       {
822f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
823f8a1b7d9SAlexander Kabaev 	return this->replace(__pos, size_type(0), __s,
824f8a1b7d9SAlexander Kabaev 			     traits_type::length(__s));
825f8a1b7d9SAlexander Kabaev       }
826f8a1b7d9SAlexander Kabaev 
827f8a1b7d9SAlexander Kabaev       /**
828f8a1b7d9SAlexander Kabaev        *  @brief  Insert multiple characters.
829f8a1b7d9SAlexander Kabaev        *  @param pos  Index in string to insert at.
830f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters to insert
831f8a1b7d9SAlexander Kabaev        *  @param c  The character to insert.
832f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
833f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
834f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos is beyond the end of this
835f8a1b7d9SAlexander Kabaev        *  string.
836f8a1b7d9SAlexander Kabaev        *
837f8a1b7d9SAlexander Kabaev        *  Inserts @a n copies of character @a c starting at index @a pos.  If
838f8a1b7d9SAlexander Kabaev        *  adding characters causes the length to exceed max_size(),
839f8a1b7d9SAlexander Kabaev        *  length_error is thrown.  If @a pos > length(), out_of_range is
840f8a1b7d9SAlexander Kabaev        *  thrown.  The value of the string doesn't change if an error is
841f8a1b7d9SAlexander Kabaev        *  thrown.
842f8a1b7d9SAlexander Kabaev       */
843f8a1b7d9SAlexander Kabaev       __versa_string&
844f8a1b7d9SAlexander Kabaev       insert(size_type __pos, size_type __n, _CharT __c)
845f8a1b7d9SAlexander Kabaev       { return _M_replace_aux(_M_check(__pos, "__versa_string::insert"),
846f8a1b7d9SAlexander Kabaev 			      size_type(0), __n, __c); }
847f8a1b7d9SAlexander Kabaev 
848f8a1b7d9SAlexander Kabaev       /**
849f8a1b7d9SAlexander Kabaev        *  @brief  Insert one character.
850f8a1b7d9SAlexander Kabaev        *  @param p  Iterator referencing position in string to insert at.
851f8a1b7d9SAlexander Kabaev        *  @param c  The character to insert.
852f8a1b7d9SAlexander Kabaev        *  @return  Iterator referencing newly inserted char.
853f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
854f8a1b7d9SAlexander Kabaev        *
855f8a1b7d9SAlexander Kabaev        *  Inserts character @a c at position referenced by @a p.  If adding
856f8a1b7d9SAlexander Kabaev        *  character causes the length to exceed max_size(), length_error is
857f8a1b7d9SAlexander Kabaev        *  thrown.  If @a p is beyond end of string, out_of_range is thrown.
858f8a1b7d9SAlexander Kabaev        *  The value of the string doesn't change if an error is thrown.
859f8a1b7d9SAlexander Kabaev       */
860f8a1b7d9SAlexander Kabaev       iterator
861f8a1b7d9SAlexander Kabaev       insert(iterator __p, _CharT __c)
862f8a1b7d9SAlexander Kabaev       {
863f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
864f8a1b7d9SAlexander Kabaev 	const size_type __pos = __p - _M_ibegin();
865f8a1b7d9SAlexander Kabaev 	_M_replace_aux(__pos, size_type(0), size_type(1), __c);
866f8a1b7d9SAlexander Kabaev 	this->_M_set_leaked();
867f8a1b7d9SAlexander Kabaev 	return iterator(this->_M_data() + __pos);
868f8a1b7d9SAlexander Kabaev       }
869f8a1b7d9SAlexander Kabaev 
870f8a1b7d9SAlexander Kabaev       /**
871f8a1b7d9SAlexander Kabaev        *  @brief  Remove characters.
872f8a1b7d9SAlexander Kabaev        *  @param pos  Index of first character to remove (default 0).
873f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters to remove (default remainder).
874f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
875f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos is beyond the end of this
876f8a1b7d9SAlexander Kabaev        *  string.
877f8a1b7d9SAlexander Kabaev        *
878f8a1b7d9SAlexander Kabaev        *  Removes @a n characters from this string starting at @a pos.  The
879f8a1b7d9SAlexander Kabaev        *  length of the string is reduced by @a n.  If there are < @a n
880f8a1b7d9SAlexander Kabaev        *  characters to remove, the remainder of the string is truncated.  If
881f8a1b7d9SAlexander Kabaev        *  @a p is beyond end of string, out_of_range is thrown.  The value of
882f8a1b7d9SAlexander Kabaev        *  the string doesn't change if an error is thrown.
883f8a1b7d9SAlexander Kabaev       */
884f8a1b7d9SAlexander Kabaev       __versa_string&
885f8a1b7d9SAlexander Kabaev       erase(size_type __pos = 0, size_type __n = npos)
886f8a1b7d9SAlexander Kabaev       {
887f8a1b7d9SAlexander Kabaev 	this->_M_erase(_M_check(__pos, "__versa_string::erase"),
888f8a1b7d9SAlexander Kabaev 		       _M_limit(__pos, __n));
889f8a1b7d9SAlexander Kabaev 	return *this;
890f8a1b7d9SAlexander Kabaev       }
891f8a1b7d9SAlexander Kabaev 
892f8a1b7d9SAlexander Kabaev       /**
893f8a1b7d9SAlexander Kabaev        *  @brief  Remove one character.
894f8a1b7d9SAlexander Kabaev        *  @param position  Iterator referencing the character to remove.
895f8a1b7d9SAlexander Kabaev        *  @return  iterator referencing same location after removal.
896f8a1b7d9SAlexander Kabaev        *
897f8a1b7d9SAlexander Kabaev        *  Removes the character at @a position from this string. The value
898f8a1b7d9SAlexander Kabaev        *  of the string doesn't change if an error is thrown.
899f8a1b7d9SAlexander Kabaev       */
900f8a1b7d9SAlexander Kabaev       iterator
901f8a1b7d9SAlexander Kabaev       erase(iterator __position)
902f8a1b7d9SAlexander Kabaev       {
903f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
904f8a1b7d9SAlexander Kabaev 				 && __position < _M_iend());
905f8a1b7d9SAlexander Kabaev 	const size_type __pos = __position - _M_ibegin();
906f8a1b7d9SAlexander Kabaev 	this->_M_erase(__pos, size_type(1));
907f8a1b7d9SAlexander Kabaev 	this->_M_set_leaked();
908f8a1b7d9SAlexander Kabaev 	return iterator(this->_M_data() + __pos);
909f8a1b7d9SAlexander Kabaev       }
910f8a1b7d9SAlexander Kabaev 
911f8a1b7d9SAlexander Kabaev       /**
912f8a1b7d9SAlexander Kabaev        *  @brief  Remove a range of characters.
913f8a1b7d9SAlexander Kabaev        *  @param first  Iterator referencing the first character to remove.
914f8a1b7d9SAlexander Kabaev        *  @param last  Iterator referencing the end of the range.
915f8a1b7d9SAlexander Kabaev        *  @return  Iterator referencing location of first after removal.
916f8a1b7d9SAlexander Kabaev        *
917f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [first,last) from this string.
918f8a1b7d9SAlexander Kabaev        *  The value of the string doesn't change if an error is thrown.
919f8a1b7d9SAlexander Kabaev       */
920f8a1b7d9SAlexander Kabaev       iterator
921f8a1b7d9SAlexander Kabaev       erase(iterator __first, iterator __last)
922f8a1b7d9SAlexander Kabaev       {
923f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last
924f8a1b7d9SAlexander Kabaev 				 && __last <= _M_iend());
925f8a1b7d9SAlexander Kabaev         const size_type __pos = __first - _M_ibegin();
926f8a1b7d9SAlexander Kabaev 	this->_M_erase(__pos, __last - __first);
927f8a1b7d9SAlexander Kabaev 	this->_M_set_leaked();
928f8a1b7d9SAlexander Kabaev 	return iterator(this->_M_data() + __pos);
929f8a1b7d9SAlexander Kabaev       }
930f8a1b7d9SAlexander Kabaev 
931f8a1b7d9SAlexander Kabaev       /**
932f8a1b7d9SAlexander Kabaev        *  @brief  Replace characters with value from another string.
933f8a1b7d9SAlexander Kabaev        *  @param pos  Index of first character to replace.
934f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters to be replaced.
935f8a1b7d9SAlexander Kabaev        *  @param str  String to insert.
936f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
937f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos is beyond the end of this
938f8a1b7d9SAlexander Kabaev        *  string.
939f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
940f8a1b7d9SAlexander Kabaev        *
941f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [pos,pos+n) from this string.
942f8a1b7d9SAlexander Kabaev        *  In place, the value of @a str is inserted.  If @a pos is beyond end
943f8a1b7d9SAlexander Kabaev        *  of string, out_of_range is thrown.  If the length of the result
944f8a1b7d9SAlexander Kabaev        *  exceeds max_size(), length_error is thrown.  The value of the string
945f8a1b7d9SAlexander Kabaev        *  doesn't change if an error is thrown.
946f8a1b7d9SAlexander Kabaev       */
947f8a1b7d9SAlexander Kabaev       __versa_string&
948f8a1b7d9SAlexander Kabaev       replace(size_type __pos, size_type __n, const __versa_string& __str)
949f8a1b7d9SAlexander Kabaev       { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
950f8a1b7d9SAlexander Kabaev 
951f8a1b7d9SAlexander Kabaev       /**
952f8a1b7d9SAlexander Kabaev        *  @brief  Replace characters with value from another string.
953f8a1b7d9SAlexander Kabaev        *  @param pos1  Index of first character to replace.
954f8a1b7d9SAlexander Kabaev        *  @param n1  Number of characters to be replaced.
955f8a1b7d9SAlexander Kabaev        *  @param str  String to insert.
956f8a1b7d9SAlexander Kabaev        *  @param pos2  Index of first character of str to use.
957f8a1b7d9SAlexander Kabaev        *  @param n2  Number of characters from str to use.
958f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
959f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos1 > size() or @a pos2 >
960f8a1b7d9SAlexander Kabaev        *  str.size().
961f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
962f8a1b7d9SAlexander Kabaev        *
963f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [pos1,pos1 + n) from this
964f8a1b7d9SAlexander Kabaev        *  string.  In place, the value of @a str is inserted.  If @a pos is
965f8a1b7d9SAlexander Kabaev        *  beyond end of string, out_of_range is thrown.  If the length of the
966f8a1b7d9SAlexander Kabaev        *  result exceeds max_size(), length_error is thrown.  The value of the
967f8a1b7d9SAlexander Kabaev        *  string doesn't change if an error is thrown.
968f8a1b7d9SAlexander Kabaev       */
969f8a1b7d9SAlexander Kabaev       __versa_string&
970f8a1b7d9SAlexander Kabaev       replace(size_type __pos1, size_type __n1, const __versa_string& __str,
971f8a1b7d9SAlexander Kabaev 	      size_type __pos2, size_type __n2)
972f8a1b7d9SAlexander Kabaev       {
973f8a1b7d9SAlexander Kabaev 	return this->replace(__pos1, __n1, __str._M_data()
974f8a1b7d9SAlexander Kabaev 			     + __str._M_check(__pos2,
975f8a1b7d9SAlexander Kabaev 					      "__versa_string::replace"),
976f8a1b7d9SAlexander Kabaev 			     __str._M_limit(__pos2, __n2));
977f8a1b7d9SAlexander Kabaev       }
978f8a1b7d9SAlexander Kabaev 
979f8a1b7d9SAlexander Kabaev       /**
980f8a1b7d9SAlexander Kabaev        *  @brief  Replace characters with value of a C substring.
981f8a1b7d9SAlexander Kabaev        *  @param pos  Index of first character to replace.
982f8a1b7d9SAlexander Kabaev        *  @param n1  Number of characters to be replaced.
983f8a1b7d9SAlexander Kabaev        *  @param s  C string to insert.
984f8a1b7d9SAlexander Kabaev        *  @param n2  Number of characters from @a s to use.
985f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
986f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos1 > size().
987f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
988f8a1b7d9SAlexander Kabaev        *
989f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [pos,pos + n1) from this string.
990f8a1b7d9SAlexander Kabaev        *  In place, the first @a n2 characters of @a s are inserted, or all
991f8a1b7d9SAlexander Kabaev        *  of @a s if @a n2 is too large.  If @a pos is beyond end of string,
992f8a1b7d9SAlexander Kabaev        *  out_of_range is thrown.  If the length of result exceeds max_size(),
993f8a1b7d9SAlexander Kabaev        *  length_error is thrown.  The value of the string doesn't change if
994f8a1b7d9SAlexander Kabaev        *  an error is thrown.
995f8a1b7d9SAlexander Kabaev       */
996f8a1b7d9SAlexander Kabaev       __versa_string&
997f8a1b7d9SAlexander Kabaev       replace(size_type __pos, size_type __n1, const _CharT* __s,
998f8a1b7d9SAlexander Kabaev 	      size_type __n2)
999f8a1b7d9SAlexander Kabaev       {
1000f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string_len(__s, __n2);
1001f8a1b7d9SAlexander Kabaev 	return _M_replace(_M_check(__pos, "__versa_string::replace"),
1002f8a1b7d9SAlexander Kabaev 			  _M_limit(__pos, __n1), __s, __n2);
1003f8a1b7d9SAlexander Kabaev       }
1004f8a1b7d9SAlexander Kabaev 
1005f8a1b7d9SAlexander Kabaev       /**
1006f8a1b7d9SAlexander Kabaev        *  @brief  Replace characters with value of a C string.
1007f8a1b7d9SAlexander Kabaev        *  @param pos  Index of first character to replace.
1008f8a1b7d9SAlexander Kabaev        *  @param n1  Number of characters to be replaced.
1009f8a1b7d9SAlexander Kabaev        *  @param s  C string to insert.
1010f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
1011f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos > size().
1012f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1013f8a1b7d9SAlexander Kabaev        *
1014f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [pos,pos + n1) from this string.
1015f8a1b7d9SAlexander Kabaev        *  In place, the first @a n characters of @a s are inserted.  If @a
1016f8a1b7d9SAlexander Kabaev        *  pos is beyond end of string, out_of_range is thrown.  If the length
1017f8a1b7d9SAlexander Kabaev        *  of result exceeds max_size(), length_error is thrown.  The value of
1018f8a1b7d9SAlexander Kabaev        *  the string doesn't change if an error is thrown.
1019f8a1b7d9SAlexander Kabaev       */
1020f8a1b7d9SAlexander Kabaev       __versa_string&
1021f8a1b7d9SAlexander Kabaev       replace(size_type __pos, size_type __n1, const _CharT* __s)
1022f8a1b7d9SAlexander Kabaev       {
1023f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
1024f8a1b7d9SAlexander Kabaev 	return this->replace(__pos, __n1, __s, traits_type::length(__s));
1025f8a1b7d9SAlexander Kabaev       }
1026f8a1b7d9SAlexander Kabaev 
1027f8a1b7d9SAlexander Kabaev       /**
1028f8a1b7d9SAlexander Kabaev        *  @brief  Replace characters with multiple characters.
1029f8a1b7d9SAlexander Kabaev        *  @param pos  Index of first character to replace.
1030f8a1b7d9SAlexander Kabaev        *  @param n1  Number of characters to be replaced.
1031f8a1b7d9SAlexander Kabaev        *  @param n2  Number of characters to insert.
1032f8a1b7d9SAlexander Kabaev        *  @param c  Character to insert.
1033f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
1034f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If @a pos > size().
1035f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1036f8a1b7d9SAlexander Kabaev        *
1037f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [pos,pos + n1) from this string.
1038f8a1b7d9SAlexander Kabaev        *  In place, @a n2 copies of @a c are inserted.  If @a pos is beyond
1039f8a1b7d9SAlexander Kabaev        *  end of string, out_of_range is thrown.  If the length of result
1040f8a1b7d9SAlexander Kabaev        *  exceeds max_size(), length_error is thrown.  The value of the string
1041f8a1b7d9SAlexander Kabaev        *  doesn't change if an error is thrown.
1042f8a1b7d9SAlexander Kabaev       */
1043f8a1b7d9SAlexander Kabaev       __versa_string&
1044f8a1b7d9SAlexander Kabaev       replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
1045f8a1b7d9SAlexander Kabaev       { return _M_replace_aux(_M_check(__pos, "__versa_string::replace"),
1046f8a1b7d9SAlexander Kabaev 			      _M_limit(__pos, __n1), __n2, __c); }
1047f8a1b7d9SAlexander Kabaev 
1048f8a1b7d9SAlexander Kabaev       /**
1049f8a1b7d9SAlexander Kabaev        *  @brief  Replace range of characters with string.
1050f8a1b7d9SAlexander Kabaev        *  @param i1  Iterator referencing start of range to replace.
1051f8a1b7d9SAlexander Kabaev        *  @param i2  Iterator referencing end of range to replace.
1052f8a1b7d9SAlexander Kabaev        *  @param str  String value to insert.
1053f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
1054f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1055f8a1b7d9SAlexander Kabaev        *
1056f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [i1,i2).  In place, the value of
1057f8a1b7d9SAlexander Kabaev        *  @a str is inserted.  If the length of result exceeds max_size(),
1058f8a1b7d9SAlexander Kabaev        *  length_error is thrown.  The value of the string doesn't change if
1059f8a1b7d9SAlexander Kabaev        *  an error is thrown.
1060f8a1b7d9SAlexander Kabaev       */
1061f8a1b7d9SAlexander Kabaev       __versa_string&
1062f8a1b7d9SAlexander Kabaev       replace(iterator __i1, iterator __i2, const __versa_string& __str)
1063f8a1b7d9SAlexander Kabaev       { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
1064f8a1b7d9SAlexander Kabaev 
1065f8a1b7d9SAlexander Kabaev       /**
1066f8a1b7d9SAlexander Kabaev        *  @brief  Replace range of characters with C substring.
1067f8a1b7d9SAlexander Kabaev        *  @param i1  Iterator referencing start of range to replace.
1068f8a1b7d9SAlexander Kabaev        *  @param i2  Iterator referencing end of range to replace.
1069f8a1b7d9SAlexander Kabaev        *  @param s  C string value to insert.
1070f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters from s to insert.
1071f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
1072f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1073f8a1b7d9SAlexander Kabaev        *
1074f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [i1,i2).  In place, the first @a
1075f8a1b7d9SAlexander Kabaev        *  n characters of @a s are inserted.  If the length of result exceeds
1076f8a1b7d9SAlexander Kabaev        *  max_size(), length_error is thrown.  The value of the string doesn't
1077f8a1b7d9SAlexander Kabaev        *  change if an error is thrown.
1078f8a1b7d9SAlexander Kabaev       */
1079f8a1b7d9SAlexander Kabaev       __versa_string&
1080f8a1b7d9SAlexander Kabaev       replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
1081f8a1b7d9SAlexander Kabaev       {
1082f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1083f8a1b7d9SAlexander Kabaev 				 && __i2 <= _M_iend());
1084f8a1b7d9SAlexander Kabaev 	return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
1085f8a1b7d9SAlexander Kabaev       }
1086f8a1b7d9SAlexander Kabaev 
1087f8a1b7d9SAlexander Kabaev       /**
1088f8a1b7d9SAlexander Kabaev        *  @brief  Replace range of characters with C string.
1089f8a1b7d9SAlexander Kabaev        *  @param i1  Iterator referencing start of range to replace.
1090f8a1b7d9SAlexander Kabaev        *  @param i2  Iterator referencing end of range to replace.
1091f8a1b7d9SAlexander Kabaev        *  @param s  C string value to insert.
1092f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
1093f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1094f8a1b7d9SAlexander Kabaev        *
1095f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [i1,i2).  In place, the
1096f8a1b7d9SAlexander Kabaev        *  characters of @a s are inserted.  If the length of result exceeds
1097f8a1b7d9SAlexander Kabaev        *  max_size(), length_error is thrown.  The value of the string doesn't
1098f8a1b7d9SAlexander Kabaev        *  change if an error is thrown.
1099f8a1b7d9SAlexander Kabaev       */
1100f8a1b7d9SAlexander Kabaev       __versa_string&
1101f8a1b7d9SAlexander Kabaev       replace(iterator __i1, iterator __i2, const _CharT* __s)
1102f8a1b7d9SAlexander Kabaev       {
1103f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
1104f8a1b7d9SAlexander Kabaev 	return this->replace(__i1, __i2, __s, traits_type::length(__s));
1105f8a1b7d9SAlexander Kabaev       }
1106f8a1b7d9SAlexander Kabaev 
1107f8a1b7d9SAlexander Kabaev       /**
1108f8a1b7d9SAlexander Kabaev        *  @brief  Replace range of characters with multiple characters
1109f8a1b7d9SAlexander Kabaev        *  @param i1  Iterator referencing start of range to replace.
1110f8a1b7d9SAlexander Kabaev        *  @param i2  Iterator referencing end of range to replace.
1111f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters to insert.
1112f8a1b7d9SAlexander Kabaev        *  @param c  Character to insert.
1113f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
1114f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1115f8a1b7d9SAlexander Kabaev        *
1116f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [i1,i2).  In place, @a n copies
1117f8a1b7d9SAlexander Kabaev        *  of @a c are inserted.  If the length of result exceeds max_size(),
1118f8a1b7d9SAlexander Kabaev        *  length_error is thrown.  The value of the string doesn't change if
1119f8a1b7d9SAlexander Kabaev        *  an error is thrown.
1120f8a1b7d9SAlexander Kabaev       */
1121f8a1b7d9SAlexander Kabaev       __versa_string&
1122f8a1b7d9SAlexander Kabaev       replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
1123f8a1b7d9SAlexander Kabaev       {
1124f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1125f8a1b7d9SAlexander Kabaev 				 && __i2 <= _M_iend());
1126f8a1b7d9SAlexander Kabaev 	return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
1127f8a1b7d9SAlexander Kabaev       }
1128f8a1b7d9SAlexander Kabaev 
1129f8a1b7d9SAlexander Kabaev       /**
1130f8a1b7d9SAlexander Kabaev        *  @brief  Replace range of characters with range.
1131f8a1b7d9SAlexander Kabaev        *  @param i1  Iterator referencing start of range to replace.
1132f8a1b7d9SAlexander Kabaev        *  @param i2  Iterator referencing end of range to replace.
1133f8a1b7d9SAlexander Kabaev        *  @param k1  Iterator referencing start of range to insert.
1134f8a1b7d9SAlexander Kabaev        *  @param k2  Iterator referencing end of range to insert.
1135f8a1b7d9SAlexander Kabaev        *  @return  Reference to this string.
1136f8a1b7d9SAlexander Kabaev        *  @throw  std::length_error  If new length exceeds @c max_size().
1137f8a1b7d9SAlexander Kabaev        *
1138f8a1b7d9SAlexander Kabaev        *  Removes the characters in the range [i1,i2).  In place, characters
1139f8a1b7d9SAlexander Kabaev        *  in the range [k1,k2) are inserted.  If the length of result exceeds
1140f8a1b7d9SAlexander Kabaev        *  max_size(), length_error is thrown.  The value of the string doesn't
1141f8a1b7d9SAlexander Kabaev        *  change if an error is thrown.
1142f8a1b7d9SAlexander Kabaev       */
1143f8a1b7d9SAlexander Kabaev       template<class _InputIterator>
1144f8a1b7d9SAlexander Kabaev         __versa_string&
1145f8a1b7d9SAlexander Kabaev         replace(iterator __i1, iterator __i2,
1146f8a1b7d9SAlexander Kabaev 		_InputIterator __k1, _InputIterator __k2)
1147f8a1b7d9SAlexander Kabaev         {
1148f8a1b7d9SAlexander Kabaev 	  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1149f8a1b7d9SAlexander Kabaev 				   && __i2 <= _M_iend());
1150f8a1b7d9SAlexander Kabaev 	  __glibcxx_requires_valid_range(__k1, __k2);
1151f8a1b7d9SAlexander Kabaev 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1152f8a1b7d9SAlexander Kabaev 	  return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
1153f8a1b7d9SAlexander Kabaev 	}
1154f8a1b7d9SAlexander Kabaev 
1155f8a1b7d9SAlexander Kabaev       // Specializations for the common case of pointer and iterator:
1156f8a1b7d9SAlexander Kabaev       // useful to avoid the overhead of temporary buffering in _M_replace.
1157f8a1b7d9SAlexander Kabaev       __versa_string&
1158f8a1b7d9SAlexander Kabaev       replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
1159f8a1b7d9SAlexander Kabaev       {
1160f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1161f8a1b7d9SAlexander Kabaev 				 && __i2 <= _M_iend());
1162f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_valid_range(__k1, __k2);
1163f8a1b7d9SAlexander Kabaev 	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1164f8a1b7d9SAlexander Kabaev 			     __k1, __k2 - __k1);
1165f8a1b7d9SAlexander Kabaev       }
1166f8a1b7d9SAlexander Kabaev 
1167f8a1b7d9SAlexander Kabaev       __versa_string&
1168f8a1b7d9SAlexander Kabaev       replace(iterator __i1, iterator __i2,
1169f8a1b7d9SAlexander Kabaev 	      const _CharT* __k1, const _CharT* __k2)
1170f8a1b7d9SAlexander Kabaev       {
1171f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1172f8a1b7d9SAlexander Kabaev 				 && __i2 <= _M_iend());
1173f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_valid_range(__k1, __k2);
1174f8a1b7d9SAlexander Kabaev 	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1175f8a1b7d9SAlexander Kabaev 			     __k1, __k2 - __k1);
1176f8a1b7d9SAlexander Kabaev       }
1177f8a1b7d9SAlexander Kabaev 
1178f8a1b7d9SAlexander Kabaev       __versa_string&
1179f8a1b7d9SAlexander Kabaev       replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
1180f8a1b7d9SAlexander Kabaev       {
1181f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1182f8a1b7d9SAlexander Kabaev 				 && __i2 <= _M_iend());
1183f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_valid_range(__k1, __k2);
1184f8a1b7d9SAlexander Kabaev 	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1185f8a1b7d9SAlexander Kabaev 			     __k1.base(), __k2 - __k1);
1186f8a1b7d9SAlexander Kabaev       }
1187f8a1b7d9SAlexander Kabaev 
1188f8a1b7d9SAlexander Kabaev       __versa_string&
1189f8a1b7d9SAlexander Kabaev       replace(iterator __i1, iterator __i2,
1190f8a1b7d9SAlexander Kabaev 	      const_iterator __k1, const_iterator __k2)
1191f8a1b7d9SAlexander Kabaev       {
1192f8a1b7d9SAlexander Kabaev 	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1193f8a1b7d9SAlexander Kabaev 				 && __i2 <= _M_iend());
1194f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_valid_range(__k1, __k2);
1195f8a1b7d9SAlexander Kabaev 	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1196f8a1b7d9SAlexander Kabaev 			     __k1.base(), __k2 - __k1);
1197f8a1b7d9SAlexander Kabaev       }
1198f8a1b7d9SAlexander Kabaev 
1199f8a1b7d9SAlexander Kabaev     private:
1200f8a1b7d9SAlexander Kabaev       template<class _Integer>
1201f8a1b7d9SAlexander Kabaev 	__versa_string&
1202f8a1b7d9SAlexander Kabaev 	_M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
1203f8a1b7d9SAlexander Kabaev 			    _Integer __val, std::__true_type)
1204f8a1b7d9SAlexander Kabaev         { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
1205f8a1b7d9SAlexander Kabaev 
1206f8a1b7d9SAlexander Kabaev       template<class _InputIterator>
1207f8a1b7d9SAlexander Kabaev 	__versa_string&
1208f8a1b7d9SAlexander Kabaev 	_M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
1209f8a1b7d9SAlexander Kabaev 			    _InputIterator __k2, std::__false_type);
1210f8a1b7d9SAlexander Kabaev 
1211f8a1b7d9SAlexander Kabaev       __versa_string&
1212f8a1b7d9SAlexander Kabaev       _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
1213f8a1b7d9SAlexander Kabaev 		     _CharT __c);
1214f8a1b7d9SAlexander Kabaev 
1215f8a1b7d9SAlexander Kabaev       __versa_string&
1216f8a1b7d9SAlexander Kabaev       _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
1217f8a1b7d9SAlexander Kabaev 		 const size_type __len2);
1218f8a1b7d9SAlexander Kabaev 
1219f8a1b7d9SAlexander Kabaev       __versa_string&
1220f8a1b7d9SAlexander Kabaev       _M_append(const _CharT* __s, size_type __n);
1221f8a1b7d9SAlexander Kabaev 
1222f8a1b7d9SAlexander Kabaev     public:
1223f8a1b7d9SAlexander Kabaev 
1224f8a1b7d9SAlexander Kabaev       /**
1225f8a1b7d9SAlexander Kabaev        *  @brief  Copy substring into C string.
1226f8a1b7d9SAlexander Kabaev        *  @param s  C string to copy value into.
1227f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters to copy.
1228f8a1b7d9SAlexander Kabaev        *  @param pos  Index of first character to copy.
1229f8a1b7d9SAlexander Kabaev        *  @return  Number of characters actually copied
1230f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If pos > size().
1231f8a1b7d9SAlexander Kabaev        *
1232f8a1b7d9SAlexander Kabaev        *  Copies up to @a n characters starting at @a pos into the C string @a
1233f8a1b7d9SAlexander Kabaev        *  s.  If @a pos is greater than size(), out_of_range is thrown.
1234f8a1b7d9SAlexander Kabaev       */
1235f8a1b7d9SAlexander Kabaev       size_type
1236f8a1b7d9SAlexander Kabaev       copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
1237f8a1b7d9SAlexander Kabaev 
1238f8a1b7d9SAlexander Kabaev       /**
1239f8a1b7d9SAlexander Kabaev        *  @brief  Swap contents with another string.
1240f8a1b7d9SAlexander Kabaev        *  @param s  String to swap with.
1241f8a1b7d9SAlexander Kabaev        *
1242f8a1b7d9SAlexander Kabaev        *  Exchanges the contents of this string with that of @a s in constant
1243f8a1b7d9SAlexander Kabaev        *  time.
1244f8a1b7d9SAlexander Kabaev       */
1245f8a1b7d9SAlexander Kabaev       void
1246f8a1b7d9SAlexander Kabaev       swap(__versa_string& __s)
1247f8a1b7d9SAlexander Kabaev       { this->_M_swap(__s); }
1248f8a1b7d9SAlexander Kabaev 
1249f8a1b7d9SAlexander Kabaev       // String operations:
1250f8a1b7d9SAlexander Kabaev       /**
1251f8a1b7d9SAlexander Kabaev        *  @brief  Return const pointer to null-terminated contents.
1252f8a1b7d9SAlexander Kabaev        *
1253f8a1b7d9SAlexander Kabaev        *  This is a handle to internal data.  Do not modify or dire things may
1254f8a1b7d9SAlexander Kabaev        *  happen.
1255f8a1b7d9SAlexander Kabaev       */
1256f8a1b7d9SAlexander Kabaev       const _CharT*
1257f8a1b7d9SAlexander Kabaev       c_str() const
1258f8a1b7d9SAlexander Kabaev       { return this->_M_data(); }
1259f8a1b7d9SAlexander Kabaev 
1260f8a1b7d9SAlexander Kabaev       /**
1261f8a1b7d9SAlexander Kabaev        *  @brief  Return const pointer to contents.
1262f8a1b7d9SAlexander Kabaev        *
1263f8a1b7d9SAlexander Kabaev        *  This is a handle to internal data.  Do not modify or dire things may
1264f8a1b7d9SAlexander Kabaev        *  happen.
1265f8a1b7d9SAlexander Kabaev       */
1266f8a1b7d9SAlexander Kabaev       const _CharT*
1267f8a1b7d9SAlexander Kabaev       data() const
1268f8a1b7d9SAlexander Kabaev       { return this->_M_data(); }
1269f8a1b7d9SAlexander Kabaev 
1270f8a1b7d9SAlexander Kabaev       /**
1271f8a1b7d9SAlexander Kabaev        *  @brief  Return copy of allocator used to construct this string.
1272f8a1b7d9SAlexander Kabaev       */
1273f8a1b7d9SAlexander Kabaev       allocator_type
1274f8a1b7d9SAlexander Kabaev       get_allocator() const
1275f8a1b7d9SAlexander Kabaev       { return allocator_type(this->_M_get_allocator()); }
1276f8a1b7d9SAlexander Kabaev 
1277f8a1b7d9SAlexander Kabaev       /**
1278f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a C substring.
1279f8a1b7d9SAlexander Kabaev        *  @param s  C string to locate.
1280f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search from.
1281f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters from @a s to search for.
1282f8a1b7d9SAlexander Kabaev        *  @return  Index of start of first occurrence.
1283f8a1b7d9SAlexander Kabaev        *
1284f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for the first @a n characters
1285f8a1b7d9SAlexander Kabaev        *  in @a s within this string.  If found, returns the index where it
1286f8a1b7d9SAlexander Kabaev        *  begins.  If not found, returns npos.
1287f8a1b7d9SAlexander Kabaev       */
1288f8a1b7d9SAlexander Kabaev       size_type
1289f8a1b7d9SAlexander Kabaev       find(const _CharT* __s, size_type __pos, size_type __n) const;
1290f8a1b7d9SAlexander Kabaev 
1291f8a1b7d9SAlexander Kabaev       /**
1292f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a string.
1293f8a1b7d9SAlexander Kabaev        *  @param str  String to locate.
1294f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1295f8a1b7d9SAlexander Kabaev        *  @return  Index of start of first occurrence.
1296f8a1b7d9SAlexander Kabaev        *
1297f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for value of @a str within
1298f8a1b7d9SAlexander Kabaev        *  this string.  If found, returns the index where it begins.  If not
1299f8a1b7d9SAlexander Kabaev        *  found, returns npos.
1300f8a1b7d9SAlexander Kabaev       */
1301f8a1b7d9SAlexander Kabaev       size_type
1302f8a1b7d9SAlexander Kabaev       find(const __versa_string& __str, size_type __pos = 0) const
1303f8a1b7d9SAlexander Kabaev       { return this->find(__str.data(), __pos, __str.size()); }
1304f8a1b7d9SAlexander Kabaev 
1305f8a1b7d9SAlexander Kabaev       /**
1306f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a C string.
1307f8a1b7d9SAlexander Kabaev        *  @param s  C string to locate.
1308f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1309f8a1b7d9SAlexander Kabaev        *  @return  Index of start of first occurrence.
1310f8a1b7d9SAlexander Kabaev        *
1311f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for the value of @a s within
1312f8a1b7d9SAlexander Kabaev        *  this string.  If found, returns the index where it begins.  If not
1313f8a1b7d9SAlexander Kabaev        *  found, returns npos.
1314f8a1b7d9SAlexander Kabaev       */
1315f8a1b7d9SAlexander Kabaev       size_type
1316f8a1b7d9SAlexander Kabaev       find(const _CharT* __s, size_type __pos = 0) const
1317f8a1b7d9SAlexander Kabaev       {
1318f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
1319f8a1b7d9SAlexander Kabaev 	return this->find(__s, __pos, traits_type::length(__s));
1320f8a1b7d9SAlexander Kabaev       }
1321f8a1b7d9SAlexander Kabaev 
1322f8a1b7d9SAlexander Kabaev       /**
1323f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a character.
1324f8a1b7d9SAlexander Kabaev        *  @param c  Character to locate.
1325f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1326f8a1b7d9SAlexander Kabaev        *  @return  Index of first occurrence.
1327f8a1b7d9SAlexander Kabaev        *
1328f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for @a c within this string.
1329f8a1b7d9SAlexander Kabaev        *  If found, returns the index where it was found.  If not found,
1330f8a1b7d9SAlexander Kabaev        *  returns npos.
1331f8a1b7d9SAlexander Kabaev       */
1332f8a1b7d9SAlexander Kabaev       size_type
1333f8a1b7d9SAlexander Kabaev       find(_CharT __c, size_type __pos = 0) const;
1334f8a1b7d9SAlexander Kabaev 
1335f8a1b7d9SAlexander Kabaev       /**
1336f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a string.
1337f8a1b7d9SAlexander Kabaev        *  @param str  String to locate.
1338f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search back from (default end).
1339f8a1b7d9SAlexander Kabaev        *  @return  Index of start of last occurrence.
1340f8a1b7d9SAlexander Kabaev        *
1341f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for value of @a str within
1342f8a1b7d9SAlexander Kabaev        *  this string.  If found, returns the index where it begins.  If not
1343f8a1b7d9SAlexander Kabaev        *  found, returns npos.
1344f8a1b7d9SAlexander Kabaev       */
1345f8a1b7d9SAlexander Kabaev       size_type
1346f8a1b7d9SAlexander Kabaev       rfind(const __versa_string& __str, size_type __pos = npos) const
1347f8a1b7d9SAlexander Kabaev       { return this->rfind(__str.data(), __pos, __str.size()); }
1348f8a1b7d9SAlexander Kabaev 
1349f8a1b7d9SAlexander Kabaev       /**
1350f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a C substring.
1351f8a1b7d9SAlexander Kabaev        *  @param s  C string to locate.
1352f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search back from.
1353f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters from s to search for.
1354f8a1b7d9SAlexander Kabaev        *  @return  Index of start of last occurrence.
1355f8a1b7d9SAlexander Kabaev        *
1356f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for the first @a n
1357f8a1b7d9SAlexander Kabaev        *  characters in @a s within this string.  If found, returns the index
1358f8a1b7d9SAlexander Kabaev        *  where it begins.  If not found, returns npos.
1359f8a1b7d9SAlexander Kabaev       */
1360f8a1b7d9SAlexander Kabaev       size_type
1361f8a1b7d9SAlexander Kabaev       rfind(const _CharT* __s, size_type __pos, size_type __n) const;
1362f8a1b7d9SAlexander Kabaev 
1363f8a1b7d9SAlexander Kabaev       /**
1364f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a C string.
1365f8a1b7d9SAlexander Kabaev        *  @param s  C string to locate.
1366f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to start search at (default end).
1367f8a1b7d9SAlexander Kabaev        *  @return  Index of start of  last occurrence.
1368f8a1b7d9SAlexander Kabaev        *
1369f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for the value of @a s within
1370f8a1b7d9SAlexander Kabaev        *  this string.  If found, returns the index where it begins.  If not
1371f8a1b7d9SAlexander Kabaev        *  found, returns npos.
1372f8a1b7d9SAlexander Kabaev       */
1373f8a1b7d9SAlexander Kabaev       size_type
1374f8a1b7d9SAlexander Kabaev       rfind(const _CharT* __s, size_type __pos = npos) const
1375f8a1b7d9SAlexander Kabaev       {
1376f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
1377f8a1b7d9SAlexander Kabaev 	return this->rfind(__s, __pos, traits_type::length(__s));
1378f8a1b7d9SAlexander Kabaev       }
1379f8a1b7d9SAlexander Kabaev 
1380f8a1b7d9SAlexander Kabaev       /**
1381f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a character.
1382f8a1b7d9SAlexander Kabaev        *  @param c  Character to locate.
1383f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search back from (default end).
1384f8a1b7d9SAlexander Kabaev        *  @return  Index of last occurrence.
1385f8a1b7d9SAlexander Kabaev        *
1386f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for @a c within this string.
1387f8a1b7d9SAlexander Kabaev        *  If found, returns the index where it was found.  If not found,
1388f8a1b7d9SAlexander Kabaev        *  returns npos.
1389f8a1b7d9SAlexander Kabaev       */
1390f8a1b7d9SAlexander Kabaev       size_type
1391f8a1b7d9SAlexander Kabaev       rfind(_CharT __c, size_type __pos = npos) const;
1392f8a1b7d9SAlexander Kabaev 
1393f8a1b7d9SAlexander Kabaev       /**
1394f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a character of string.
1395f8a1b7d9SAlexander Kabaev        *  @param str  String containing characters to locate.
1396f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1397f8a1b7d9SAlexander Kabaev        *  @return  Index of first occurrence.
1398f8a1b7d9SAlexander Kabaev        *
1399f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for one of the characters of
1400f8a1b7d9SAlexander Kabaev        *  @a str within this string.  If found, returns the index where it was
1401f8a1b7d9SAlexander Kabaev        *  found.  If not found, returns npos.
1402f8a1b7d9SAlexander Kabaev       */
1403f8a1b7d9SAlexander Kabaev       size_type
1404f8a1b7d9SAlexander Kabaev       find_first_of(const __versa_string& __str, size_type __pos = 0) const
1405f8a1b7d9SAlexander Kabaev       { return this->find_first_of(__str.data(), __pos, __str.size()); }
1406f8a1b7d9SAlexander Kabaev 
1407f8a1b7d9SAlexander Kabaev       /**
1408f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a character of C substring.
1409f8a1b7d9SAlexander Kabaev        *  @param s  String containing characters to locate.
1410*05a636f0SPedro F. Giffuni        *  @param pos  Index of character to search from.
1411f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters from s to search for.
1412f8a1b7d9SAlexander Kabaev        *  @return  Index of first occurrence.
1413f8a1b7d9SAlexander Kabaev        *
1414f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for one of the first @a n
1415f8a1b7d9SAlexander Kabaev        *  characters of @a s within this string.  If found, returns the index
1416f8a1b7d9SAlexander Kabaev        *  where it was found.  If not found, returns npos.
1417f8a1b7d9SAlexander Kabaev       */
1418f8a1b7d9SAlexander Kabaev       size_type
1419f8a1b7d9SAlexander Kabaev       find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
1420f8a1b7d9SAlexander Kabaev 
1421f8a1b7d9SAlexander Kabaev       /**
1422f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a character of C string.
1423f8a1b7d9SAlexander Kabaev        *  @param s  String containing characters to locate.
1424f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1425f8a1b7d9SAlexander Kabaev        *  @return  Index of first occurrence.
1426f8a1b7d9SAlexander Kabaev        *
1427f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for one of the characters of
1428f8a1b7d9SAlexander Kabaev        *  @a s within this string.  If found, returns the index where it was
1429f8a1b7d9SAlexander Kabaev        *  found.  If not found, returns npos.
1430f8a1b7d9SAlexander Kabaev       */
1431f8a1b7d9SAlexander Kabaev       size_type
1432f8a1b7d9SAlexander Kabaev       find_first_of(const _CharT* __s, size_type __pos = 0) const
1433f8a1b7d9SAlexander Kabaev       {
1434f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
1435f8a1b7d9SAlexander Kabaev 	return this->find_first_of(__s, __pos, traits_type::length(__s));
1436f8a1b7d9SAlexander Kabaev       }
1437f8a1b7d9SAlexander Kabaev 
1438f8a1b7d9SAlexander Kabaev       /**
1439f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a character.
1440f8a1b7d9SAlexander Kabaev        *  @param c  Character to locate.
1441f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1442f8a1b7d9SAlexander Kabaev        *  @return  Index of first occurrence.
1443f8a1b7d9SAlexander Kabaev        *
1444f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for the character @a c within
1445f8a1b7d9SAlexander Kabaev        *  this string.  If found, returns the index where it was found.  If
1446f8a1b7d9SAlexander Kabaev        *  not found, returns npos.
1447f8a1b7d9SAlexander Kabaev        *
1448f8a1b7d9SAlexander Kabaev        *  Note: equivalent to find(c, pos).
1449f8a1b7d9SAlexander Kabaev       */
1450f8a1b7d9SAlexander Kabaev       size_type
1451f8a1b7d9SAlexander Kabaev       find_first_of(_CharT __c, size_type __pos = 0) const
1452f8a1b7d9SAlexander Kabaev       { return this->find(__c, __pos); }
1453f8a1b7d9SAlexander Kabaev 
1454f8a1b7d9SAlexander Kabaev       /**
1455f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a character of string.
1456f8a1b7d9SAlexander Kabaev        *  @param str  String containing characters to locate.
1457f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search back from (default end).
1458f8a1b7d9SAlexander Kabaev        *  @return  Index of last occurrence.
1459f8a1b7d9SAlexander Kabaev        *
1460f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for one of the characters of
1461f8a1b7d9SAlexander Kabaev        *  @a str within this string.  If found, returns the index where it was
1462f8a1b7d9SAlexander Kabaev        *  found.  If not found, returns npos.
1463f8a1b7d9SAlexander Kabaev       */
1464f8a1b7d9SAlexander Kabaev       size_type
1465f8a1b7d9SAlexander Kabaev       find_last_of(const __versa_string& __str, size_type __pos = npos) const
1466f8a1b7d9SAlexander Kabaev       { return this->find_last_of(__str.data(), __pos, __str.size()); }
1467f8a1b7d9SAlexander Kabaev 
1468f8a1b7d9SAlexander Kabaev       /**
1469f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a character of C substring.
1470f8a1b7d9SAlexander Kabaev        *  @param s  C string containing characters to locate.
1471*05a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from.
1472f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters from s to search for.
1473f8a1b7d9SAlexander Kabaev        *  @return  Index of last occurrence.
1474f8a1b7d9SAlexander Kabaev        *
1475f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for one of the first @a n
1476f8a1b7d9SAlexander Kabaev        *  characters of @a s within this string.  If found, returns the index
1477f8a1b7d9SAlexander Kabaev        *  where it was found.  If not found, returns npos.
1478f8a1b7d9SAlexander Kabaev       */
1479f8a1b7d9SAlexander Kabaev       size_type
1480f8a1b7d9SAlexander Kabaev       find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
1481f8a1b7d9SAlexander Kabaev 
1482f8a1b7d9SAlexander Kabaev       /**
1483f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a character of C string.
1484f8a1b7d9SAlexander Kabaev        *  @param s  C string containing characters to locate.
1485f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search back from (default end).
1486f8a1b7d9SAlexander Kabaev        *  @return  Index of last occurrence.
1487f8a1b7d9SAlexander Kabaev        *
1488f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for one of the characters of
1489f8a1b7d9SAlexander Kabaev        *  @a s within this string.  If found, returns the index where it was
1490f8a1b7d9SAlexander Kabaev        *  found.  If not found, returns npos.
1491f8a1b7d9SAlexander Kabaev       */
1492f8a1b7d9SAlexander Kabaev       size_type
1493f8a1b7d9SAlexander Kabaev       find_last_of(const _CharT* __s, size_type __pos = npos) const
1494f8a1b7d9SAlexander Kabaev       {
1495f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
1496f8a1b7d9SAlexander Kabaev 	return this->find_last_of(__s, __pos, traits_type::length(__s));
1497f8a1b7d9SAlexander Kabaev       }
1498f8a1b7d9SAlexander Kabaev 
1499f8a1b7d9SAlexander Kabaev       /**
1500f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a character.
1501f8a1b7d9SAlexander Kabaev        *  @param c  Character to locate.
1502*05a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from (default end).
1503f8a1b7d9SAlexander Kabaev        *  @return  Index of last occurrence.
1504f8a1b7d9SAlexander Kabaev        *
1505f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for @a c within this string.
1506f8a1b7d9SAlexander Kabaev        *  If found, returns the index where it was found.  If not found,
1507f8a1b7d9SAlexander Kabaev        *  returns npos.
1508f8a1b7d9SAlexander Kabaev        *
1509f8a1b7d9SAlexander Kabaev        *  Note: equivalent to rfind(c, pos).
1510f8a1b7d9SAlexander Kabaev       */
1511f8a1b7d9SAlexander Kabaev       size_type
1512f8a1b7d9SAlexander Kabaev       find_last_of(_CharT __c, size_type __pos = npos) const
1513f8a1b7d9SAlexander Kabaev       { return this->rfind(__c, __pos); }
1514f8a1b7d9SAlexander Kabaev 
1515f8a1b7d9SAlexander Kabaev       /**
1516f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a character not in string.
1517f8a1b7d9SAlexander Kabaev        *  @param str  String containing characters to avoid.
1518f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1519f8a1b7d9SAlexander Kabaev        *  @return  Index of first occurrence.
1520f8a1b7d9SAlexander Kabaev        *
1521f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for a character not contained
1522f8a1b7d9SAlexander Kabaev        *  in @a str within this string.  If found, returns the index where it
1523f8a1b7d9SAlexander Kabaev        *  was found.  If not found, returns npos.
1524f8a1b7d9SAlexander Kabaev       */
1525f8a1b7d9SAlexander Kabaev       size_type
1526f8a1b7d9SAlexander Kabaev       find_first_not_of(const __versa_string& __str, size_type __pos = 0) const
1527f8a1b7d9SAlexander Kabaev       { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
1528f8a1b7d9SAlexander Kabaev 
1529f8a1b7d9SAlexander Kabaev       /**
1530f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a character not in C substring.
1531f8a1b7d9SAlexander Kabaev        *  @param s  C string containing characters to avoid.
1532*05a636f0SPedro F. Giffuni        *  @param pos  Index of character to search from.
1533f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters from s to consider.
1534f8a1b7d9SAlexander Kabaev        *  @return  Index of first occurrence.
1535f8a1b7d9SAlexander Kabaev        *
1536f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for a character not contained
1537f8a1b7d9SAlexander Kabaev        *  in the first @a n characters of @a s within this string.  If found,
1538f8a1b7d9SAlexander Kabaev        *  returns the index where it was found.  If not found, returns npos.
1539f8a1b7d9SAlexander Kabaev       */
1540f8a1b7d9SAlexander Kabaev       size_type
1541f8a1b7d9SAlexander Kabaev       find_first_not_of(const _CharT* __s, size_type __pos,
1542f8a1b7d9SAlexander Kabaev 			size_type __n) const;
1543f8a1b7d9SAlexander Kabaev 
1544f8a1b7d9SAlexander Kabaev       /**
1545f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a character not in C string.
1546f8a1b7d9SAlexander Kabaev        *  @param s  C string containing characters to avoid.
1547f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1548f8a1b7d9SAlexander Kabaev        *  @return  Index of first occurrence.
1549f8a1b7d9SAlexander Kabaev        *
1550f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for a character not contained
1551f8a1b7d9SAlexander Kabaev        *  in @a s within this string.  If found, returns the index where it
1552f8a1b7d9SAlexander Kabaev        *  was found.  If not found, returns npos.
1553f8a1b7d9SAlexander Kabaev       */
1554f8a1b7d9SAlexander Kabaev       size_type
1555f8a1b7d9SAlexander Kabaev       find_first_not_of(const _CharT* __s, size_type __pos = 0) const
1556f8a1b7d9SAlexander Kabaev       {
1557f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
1558f8a1b7d9SAlexander Kabaev 	return this->find_first_not_of(__s, __pos, traits_type::length(__s));
1559f8a1b7d9SAlexander Kabaev       }
1560f8a1b7d9SAlexander Kabaev 
1561f8a1b7d9SAlexander Kabaev       /**
1562f8a1b7d9SAlexander Kabaev        *  @brief  Find position of a different character.
1563f8a1b7d9SAlexander Kabaev        *  @param c  Character to avoid.
1564f8a1b7d9SAlexander Kabaev        *  @param pos  Index of character to search from (default 0).
1565f8a1b7d9SAlexander Kabaev        *  @return  Index of first occurrence.
1566f8a1b7d9SAlexander Kabaev        *
1567f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches forward for a character other than @a c
1568f8a1b7d9SAlexander Kabaev        *  within this string.  If found, returns the index where it was found.
1569f8a1b7d9SAlexander Kabaev        *  If not found, returns npos.
1570f8a1b7d9SAlexander Kabaev       */
1571f8a1b7d9SAlexander Kabaev       size_type
1572f8a1b7d9SAlexander Kabaev       find_first_not_of(_CharT __c, size_type __pos = 0) const;
1573f8a1b7d9SAlexander Kabaev 
1574f8a1b7d9SAlexander Kabaev       /**
1575f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a character not in string.
1576f8a1b7d9SAlexander Kabaev        *  @param str  String containing characters to avoid.
1577*05a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from (default end).
1578*05a636f0SPedro F. Giffuni        *  @return  Index of last occurrence.
1579f8a1b7d9SAlexander Kabaev        *
1580f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for a character not
1581f8a1b7d9SAlexander Kabaev        *  contained in @a str within this string.  If found, returns the index
1582f8a1b7d9SAlexander Kabaev        *  where it was found.  If not found, returns npos.
1583f8a1b7d9SAlexander Kabaev       */
1584f8a1b7d9SAlexander Kabaev       size_type
1585f8a1b7d9SAlexander Kabaev       find_last_not_of(const __versa_string& __str,
1586f8a1b7d9SAlexander Kabaev 		       size_type __pos = npos) const
1587f8a1b7d9SAlexander Kabaev       { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
1588f8a1b7d9SAlexander Kabaev 
1589f8a1b7d9SAlexander Kabaev       /**
1590f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a character not in C substring.
1591f8a1b7d9SAlexander Kabaev        *  @param s  C string containing characters to avoid.
1592*05a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from.
1593f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters from s to consider.
1594*05a636f0SPedro F. Giffuni        *  @return  Index of last occurrence.
1595f8a1b7d9SAlexander Kabaev        *
1596f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for a character not
1597f8a1b7d9SAlexander Kabaev        *  contained in the first @a n characters of @a s within this string.
1598f8a1b7d9SAlexander Kabaev        *  If found, returns the index where it was found.  If not found,
1599f8a1b7d9SAlexander Kabaev        *  returns npos.
1600f8a1b7d9SAlexander Kabaev       */
1601f8a1b7d9SAlexander Kabaev       size_type
1602f8a1b7d9SAlexander Kabaev       find_last_not_of(const _CharT* __s, size_type __pos,
1603f8a1b7d9SAlexander Kabaev 		       size_type __n) const;
1604f8a1b7d9SAlexander Kabaev       /**
1605*05a636f0SPedro F. Giffuni        *  @brief  Find last position of a character not in C string.
1606f8a1b7d9SAlexander Kabaev        *  @param s  C string containing characters to avoid.
1607*05a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from (default end).
1608*05a636f0SPedro F. Giffuni        *  @return  Index of last occurrence.
1609f8a1b7d9SAlexander Kabaev        *
1610f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for a character not
1611f8a1b7d9SAlexander Kabaev        *  contained in @a s within this string.  If found, returns the index
1612f8a1b7d9SAlexander Kabaev        *  where it was found.  If not found, returns npos.
1613f8a1b7d9SAlexander Kabaev       */
1614f8a1b7d9SAlexander Kabaev       size_type
1615f8a1b7d9SAlexander Kabaev       find_last_not_of(const _CharT* __s, size_type __pos = npos) const
1616f8a1b7d9SAlexander Kabaev       {
1617f8a1b7d9SAlexander Kabaev 	__glibcxx_requires_string(__s);
1618f8a1b7d9SAlexander Kabaev 	return this->find_last_not_of(__s, __pos, traits_type::length(__s));
1619f8a1b7d9SAlexander Kabaev       }
1620f8a1b7d9SAlexander Kabaev 
1621f8a1b7d9SAlexander Kabaev       /**
1622f8a1b7d9SAlexander Kabaev        *  @brief  Find last position of a different character.
1623f8a1b7d9SAlexander Kabaev        *  @param c  Character to avoid.
1624*05a636f0SPedro F. Giffuni        *  @param pos  Index of character to search back from (default end).
1625*05a636f0SPedro F. Giffuni        *  @return  Index of last occurrence.
1626f8a1b7d9SAlexander Kabaev        *
1627f8a1b7d9SAlexander Kabaev        *  Starting from @a pos, searches backward for a character other than
1628f8a1b7d9SAlexander Kabaev        *  @a c within this string.  If found, returns the index where it was
1629f8a1b7d9SAlexander Kabaev        *  found.  If not found, returns npos.
1630f8a1b7d9SAlexander Kabaev       */
1631f8a1b7d9SAlexander Kabaev       size_type
1632f8a1b7d9SAlexander Kabaev       find_last_not_of(_CharT __c, size_type __pos = npos) const;
1633f8a1b7d9SAlexander Kabaev 
1634f8a1b7d9SAlexander Kabaev       /**
1635f8a1b7d9SAlexander Kabaev        *  @brief  Get a substring.
1636f8a1b7d9SAlexander Kabaev        *  @param pos  Index of first character (default 0).
1637f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters in substring (default remainder).
1638f8a1b7d9SAlexander Kabaev        *  @return  The new string.
1639f8a1b7d9SAlexander Kabaev        *  @throw  std::out_of_range  If pos > size().
1640f8a1b7d9SAlexander Kabaev        *
1641f8a1b7d9SAlexander Kabaev        *  Construct and return a new string using the @a n characters starting
1642f8a1b7d9SAlexander Kabaev        *  at @a pos.  If the string is too short, use the remainder of the
1643f8a1b7d9SAlexander Kabaev        *  characters.  If @a pos is beyond the end of the string, out_of_range
1644f8a1b7d9SAlexander Kabaev        *  is thrown.
1645f8a1b7d9SAlexander Kabaev       */
1646f8a1b7d9SAlexander Kabaev       __versa_string
1647f8a1b7d9SAlexander Kabaev       substr(size_type __pos = 0, size_type __n = npos) const
1648f8a1b7d9SAlexander Kabaev       {
1649f8a1b7d9SAlexander Kabaev 	return __versa_string(*this, _M_check(__pos, "__versa_string::substr"),
1650f8a1b7d9SAlexander Kabaev 			      __n);
1651f8a1b7d9SAlexander Kabaev       }
1652f8a1b7d9SAlexander Kabaev 
1653f8a1b7d9SAlexander Kabaev       /**
1654f8a1b7d9SAlexander Kabaev        *  @brief  Compare to a string.
1655f8a1b7d9SAlexander Kabaev        *  @param str  String to compare against.
1656f8a1b7d9SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
1657f8a1b7d9SAlexander Kabaev        *
1658f8a1b7d9SAlexander Kabaev        *  Returns an integer < 0 if this string is ordered before @a str, 0 if
1659f8a1b7d9SAlexander Kabaev        *  their values are equivalent, or > 0 if this string is ordered after
1660f8a1b7d9SAlexander Kabaev        *  @a str.  Determines the effective length rlen of the strings to
1661f8a1b7d9SAlexander Kabaev        *  compare as the smallest of size() and str.size().  The function
1662f8a1b7d9SAlexander Kabaev        *  then compares the two strings by calling traits::compare(data(),
1663f8a1b7d9SAlexander Kabaev        *  str.data(),rlen).  If the result of the comparison is nonzero returns
1664f8a1b7d9SAlexander Kabaev        *  it, otherwise the shorter one is ordered first.
1665f8a1b7d9SAlexander Kabaev       */
1666f8a1b7d9SAlexander Kabaev       int
1667f8a1b7d9SAlexander Kabaev       compare(const __versa_string& __str) const
1668f8a1b7d9SAlexander Kabaev       {
1669f8a1b7d9SAlexander Kabaev 	if (this->_M_compare(__str))
1670f8a1b7d9SAlexander Kabaev 	  return 0;
1671f8a1b7d9SAlexander Kabaev 
1672f8a1b7d9SAlexander Kabaev 	const size_type __size = this->size();
1673f8a1b7d9SAlexander Kabaev 	const size_type __osize = __str.size();
1674f8a1b7d9SAlexander Kabaev 	const size_type __len = std::min(__size, __osize);
1675f8a1b7d9SAlexander Kabaev 
1676f8a1b7d9SAlexander Kabaev 	int __r = traits_type::compare(this->_M_data(), __str.data(), __len);
1677f8a1b7d9SAlexander Kabaev 	if (!__r)
1678f8a1b7d9SAlexander Kabaev 	  __r =  __size - __osize;
1679f8a1b7d9SAlexander Kabaev 	return __r;
1680f8a1b7d9SAlexander Kabaev       }
1681f8a1b7d9SAlexander Kabaev 
1682f8a1b7d9SAlexander Kabaev       /**
1683f8a1b7d9SAlexander Kabaev        *  @brief  Compare substring to a string.
1684f8a1b7d9SAlexander Kabaev        *  @param pos  Index of first character of substring.
1685f8a1b7d9SAlexander Kabaev        *  @param n  Number of characters in substring.
1686f8a1b7d9SAlexander Kabaev        *  @param str  String to compare against.
1687f8a1b7d9SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
1688f8a1b7d9SAlexander Kabaev        *
1689f8a1b7d9SAlexander Kabaev        *  Form the substring of this string from the @a n characters starting
1690f8a1b7d9SAlexander Kabaev        *  at @a pos.  Returns an integer < 0 if the substring is ordered
1691f8a1b7d9SAlexander Kabaev        *  before @a str, 0 if their values are equivalent, or > 0 if the
1692f8a1b7d9SAlexander Kabaev        *  substring is ordered after @a str.  Determines the effective length
1693f8a1b7d9SAlexander Kabaev        *  rlen of the strings to compare as the smallest of the length of the
1694f8a1b7d9SAlexander Kabaev        *  substring and @a str.size().  The function then compares the two
1695f8a1b7d9SAlexander Kabaev        *  strings by calling traits::compare(substring.data(),str.data(),rlen).
1696f8a1b7d9SAlexander Kabaev        *  If the result of the comparison is nonzero returns it, otherwise the
1697f8a1b7d9SAlexander Kabaev        *  shorter one is ordered first.
1698f8a1b7d9SAlexander Kabaev       */
1699f8a1b7d9SAlexander Kabaev       int
1700f8a1b7d9SAlexander Kabaev       compare(size_type __pos, size_type __n,
1701f8a1b7d9SAlexander Kabaev 	      const __versa_string& __str) const;
1702f8a1b7d9SAlexander Kabaev 
1703f8a1b7d9SAlexander Kabaev       /**
1704f8a1b7d9SAlexander Kabaev        *  @brief  Compare substring to a substring.
1705f8a1b7d9SAlexander Kabaev        *  @param pos1  Index of first character of substring.
1706f8a1b7d9SAlexander Kabaev        *  @param n1  Number of characters in substring.
1707f8a1b7d9SAlexander Kabaev        *  @param str  String to compare against.
1708f8a1b7d9SAlexander Kabaev        *  @param pos2  Index of first character of substring of str.
1709f8a1b7d9SAlexander Kabaev        *  @param n2  Number of characters in substring of str.
1710f8a1b7d9SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
1711f8a1b7d9SAlexander Kabaev        *
1712f8a1b7d9SAlexander Kabaev        *  Form the substring of this string from the @a n1 characters starting
1713f8a1b7d9SAlexander Kabaev        *  at @a pos1.  Form the substring of @a str from the @a n2 characters
1714f8a1b7d9SAlexander Kabaev        *  starting at @a pos2.  Returns an integer < 0 if this substring is
1715f8a1b7d9SAlexander Kabaev        *  ordered before the substring of @a str, 0 if their values are
1716f8a1b7d9SAlexander Kabaev        *  equivalent, or > 0 if this substring is ordered after the substring
1717f8a1b7d9SAlexander Kabaev        *  of @a str.  Determines the effective length rlen of the strings
1718f8a1b7d9SAlexander Kabaev        *  to compare as the smallest of the lengths of the substrings.  The
1719f8a1b7d9SAlexander Kabaev        *  function then compares the two strings by calling
1720f8a1b7d9SAlexander Kabaev        *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
1721f8a1b7d9SAlexander Kabaev        *  If the result of the comparison is nonzero returns it, otherwise the
1722f8a1b7d9SAlexander Kabaev        *  shorter one is ordered first.
1723f8a1b7d9SAlexander Kabaev       */
1724f8a1b7d9SAlexander Kabaev       int
1725f8a1b7d9SAlexander Kabaev       compare(size_type __pos1, size_type __n1, const __versa_string& __str,
1726f8a1b7d9SAlexander Kabaev 	      size_type __pos2, size_type __n2) const;
1727f8a1b7d9SAlexander Kabaev 
1728f8a1b7d9SAlexander Kabaev       /**
1729f8a1b7d9SAlexander Kabaev        *  @brief  Compare to a C string.
1730f8a1b7d9SAlexander Kabaev        *  @param s  C string to compare against.
1731f8a1b7d9SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
1732f8a1b7d9SAlexander Kabaev        *
1733f8a1b7d9SAlexander Kabaev        *  Returns an integer < 0 if this string is ordered before @a s, 0 if
1734f8a1b7d9SAlexander Kabaev        *  their values are equivalent, or > 0 if this string is ordered after
1735f8a1b7d9SAlexander Kabaev        *  @a s.  Determines the effective length rlen of the strings to
1736f8a1b7d9SAlexander Kabaev        *  compare as the smallest of size() and the length of a string
1737f8a1b7d9SAlexander Kabaev        *  constructed from @a s.  The function then compares the two strings
1738f8a1b7d9SAlexander Kabaev        *  by calling traits::compare(data(),s,rlen).  If the result of the
1739f8a1b7d9SAlexander Kabaev        *  comparison is nonzero returns it, otherwise the shorter one is
1740f8a1b7d9SAlexander Kabaev        *  ordered first.
1741f8a1b7d9SAlexander Kabaev       */
1742f8a1b7d9SAlexander Kabaev       int
1743f8a1b7d9SAlexander Kabaev       compare(const _CharT* __s) const;
1744f8a1b7d9SAlexander Kabaev 
1745f8a1b7d9SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1746f8a1b7d9SAlexander Kabaev       // 5 String::compare specification questionable
1747f8a1b7d9SAlexander Kabaev       /**
1748f8a1b7d9SAlexander Kabaev        *  @brief  Compare substring to a C string.
1749f8a1b7d9SAlexander Kabaev        *  @param pos  Index of first character of substring.
1750f8a1b7d9SAlexander Kabaev        *  @param n1  Number of characters in substring.
1751f8a1b7d9SAlexander Kabaev        *  @param s  C string to compare against.
1752f8a1b7d9SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
1753f8a1b7d9SAlexander Kabaev        *
1754f8a1b7d9SAlexander Kabaev        *  Form the substring of this string from the @a n1 characters starting
1755f8a1b7d9SAlexander Kabaev        *  at @a pos.  Returns an integer < 0 if the substring is ordered
1756f8a1b7d9SAlexander Kabaev        *  before @a s, 0 if their values are equivalent, or > 0 if the
1757f8a1b7d9SAlexander Kabaev        *  substring is ordered after @a s.  Determines the effective length
1758f8a1b7d9SAlexander Kabaev        *  rlen of the strings to compare as the smallest of the length of the
1759f8a1b7d9SAlexander Kabaev        *  substring and the length of a string constructed from @a s.  The
1760f8a1b7d9SAlexander Kabaev        *  function then compares the two string by calling
1761f8a1b7d9SAlexander Kabaev        *  traits::compare(substring.data(),s,rlen).  If the result of the
1762f8a1b7d9SAlexander Kabaev        *  comparison is nonzero returns it, otherwise the shorter one is
1763f8a1b7d9SAlexander Kabaev        *  ordered first.
1764f8a1b7d9SAlexander Kabaev       */
1765f8a1b7d9SAlexander Kabaev       int
1766f8a1b7d9SAlexander Kabaev       compare(size_type __pos, size_type __n1, const _CharT* __s) const;
1767f8a1b7d9SAlexander Kabaev 
1768f8a1b7d9SAlexander Kabaev       /**
1769f8a1b7d9SAlexander Kabaev        *  @brief  Compare substring against a character array.
1770f8a1b7d9SAlexander Kabaev        *  @param pos1  Index of first character of substring.
1771f8a1b7d9SAlexander Kabaev        *  @param n1  Number of characters in substring.
1772f8a1b7d9SAlexander Kabaev        *  @param s  character array to compare against.
1773f8a1b7d9SAlexander Kabaev        *  @param n2  Number of characters of s.
1774f8a1b7d9SAlexander Kabaev        *  @return  Integer < 0, 0, or > 0.
1775f8a1b7d9SAlexander Kabaev        *
1776f8a1b7d9SAlexander Kabaev        *  Form the substring of this string from the @a n1 characters starting
1777f8a1b7d9SAlexander Kabaev        *  at @a pos1.  Form a string from the first @a n2 characters of @a s.
1778f8a1b7d9SAlexander Kabaev        *  Returns an integer < 0 if this substring is ordered before the string
1779f8a1b7d9SAlexander Kabaev        *  from @a s, 0 if their values are equivalent, or > 0 if this substring
1780f8a1b7d9SAlexander Kabaev        *  is ordered after the string from @a s.   Determines the effective
1781f8a1b7d9SAlexander Kabaev        *  length rlen of the strings to compare as the smallest of the length
1782f8a1b7d9SAlexander Kabaev        *  of the substring and @a n2.  The function then compares the two
1783f8a1b7d9SAlexander Kabaev        *  strings by calling traits::compare(substring.data(),s,rlen).  If the
1784f8a1b7d9SAlexander Kabaev        *  result of the comparison is nonzero returns it, otherwise the shorter
1785f8a1b7d9SAlexander Kabaev        *  one is ordered first.
1786f8a1b7d9SAlexander Kabaev        *
1787f8a1b7d9SAlexander Kabaev        *  NB: s must have at least n2 characters, '\0' has no special
1788f8a1b7d9SAlexander Kabaev        *  meaning.
1789f8a1b7d9SAlexander Kabaev       */
1790f8a1b7d9SAlexander Kabaev       int
1791f8a1b7d9SAlexander Kabaev       compare(size_type __pos, size_type __n1, const _CharT* __s,
1792f8a1b7d9SAlexander Kabaev 	      size_type __n2) const;
1793f8a1b7d9SAlexander Kabaev     };
1794f8a1b7d9SAlexander Kabaev 
1795f8a1b7d9SAlexander Kabaev   // operator+
1796f8a1b7d9SAlexander Kabaev   /**
1797f8a1b7d9SAlexander Kabaev    *  @brief  Concatenate two strings.
1798f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
1799f8a1b7d9SAlexander Kabaev    *  @param rhs  Last string.
1800f8a1b7d9SAlexander Kabaev    *  @return  New string with value of @a lhs followed by @a rhs.
1801f8a1b7d9SAlexander Kabaev    */
1802f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1803f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1804f8a1b7d9SAlexander Kabaev     __versa_string<_CharT, _Traits, _Alloc, _Base>
1805f8a1b7d9SAlexander Kabaev     operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
1806f8a1b7d9SAlexander Kabaev 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
1807f8a1b7d9SAlexander Kabaev 
1808f8a1b7d9SAlexander Kabaev   /**
1809f8a1b7d9SAlexander Kabaev    *  @brief  Concatenate C string and string.
1810f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
1811f8a1b7d9SAlexander Kabaev    *  @param rhs  Last string.
1812f8a1b7d9SAlexander Kabaev    *  @return  New string with value of @a lhs followed by @a rhs.
1813f8a1b7d9SAlexander Kabaev    */
1814f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1815f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1816f8a1b7d9SAlexander Kabaev     __versa_string<_CharT, _Traits, _Alloc, _Base>
1817f8a1b7d9SAlexander Kabaev     operator+(const _CharT* __lhs,
1818f8a1b7d9SAlexander Kabaev 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
1819f8a1b7d9SAlexander Kabaev 
1820f8a1b7d9SAlexander Kabaev   /**
1821f8a1b7d9SAlexander Kabaev    *  @brief  Concatenate character and string.
1822f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
1823f8a1b7d9SAlexander Kabaev    *  @param rhs  Last string.
1824f8a1b7d9SAlexander Kabaev    *  @return  New string with @a lhs followed by @a rhs.
1825f8a1b7d9SAlexander Kabaev    */
1826f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1827f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1828f8a1b7d9SAlexander Kabaev     __versa_string<_CharT, _Traits, _Alloc, _Base>
1829f8a1b7d9SAlexander Kabaev     operator+(_CharT __lhs,
1830f8a1b7d9SAlexander Kabaev 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
1831f8a1b7d9SAlexander Kabaev 
1832f8a1b7d9SAlexander Kabaev   /**
1833f8a1b7d9SAlexander Kabaev    *  @brief  Concatenate string and C string.
1834f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
1835f8a1b7d9SAlexander Kabaev    *  @param rhs  Last string.
1836f8a1b7d9SAlexander Kabaev    *  @return  New string with @a lhs followed by @a rhs.
1837f8a1b7d9SAlexander Kabaev    */
1838f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1839f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1840f8a1b7d9SAlexander Kabaev     __versa_string<_CharT, _Traits, _Alloc, _Base>
1841f8a1b7d9SAlexander Kabaev     operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
1842f8a1b7d9SAlexander Kabaev 	      const _CharT* __rhs);
1843f8a1b7d9SAlexander Kabaev 
1844f8a1b7d9SAlexander Kabaev   /**
1845f8a1b7d9SAlexander Kabaev    *  @brief  Concatenate string and character.
1846f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
1847f8a1b7d9SAlexander Kabaev    *  @param rhs  Last string.
1848f8a1b7d9SAlexander Kabaev    *  @return  New string with @a lhs followed by @a rhs.
1849f8a1b7d9SAlexander Kabaev    */
1850f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1851f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1852f8a1b7d9SAlexander Kabaev     __versa_string<_CharT, _Traits, _Alloc, _Base>
1853f8a1b7d9SAlexander Kabaev     operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
1854f8a1b7d9SAlexander Kabaev 	      _CharT __rhs);
1855f8a1b7d9SAlexander Kabaev 
1856f8a1b7d9SAlexander Kabaev   // operator ==
1857f8a1b7d9SAlexander Kabaev   /**
1858f8a1b7d9SAlexander Kabaev    *  @brief  Test equivalence of two strings.
1859f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
1860f8a1b7d9SAlexander Kabaev    *  @param rhs  Second string.
1861f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs.compare(@a rhs) == 0.  False otherwise.
1862f8a1b7d9SAlexander Kabaev    */
1863f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1864f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1865f8a1b7d9SAlexander Kabaev     inline bool
1866f8a1b7d9SAlexander Kabaev     operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
1867f8a1b7d9SAlexander Kabaev 	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
1868f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) == 0; }
1869f8a1b7d9SAlexander Kabaev 
1870f8a1b7d9SAlexander Kabaev   /**
1871f8a1b7d9SAlexander Kabaev    *  @brief  Test equivalence of C string and string.
1872f8a1b7d9SAlexander Kabaev    *  @param lhs  C string.
1873f8a1b7d9SAlexander Kabaev    *  @param rhs  String.
1874f8a1b7d9SAlexander Kabaev    *  @return  True if @a rhs.compare(@a lhs) == 0.  False otherwise.
1875f8a1b7d9SAlexander Kabaev    */
1876f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1877f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1878f8a1b7d9SAlexander Kabaev     inline bool
1879f8a1b7d9SAlexander Kabaev     operator==(const _CharT* __lhs,
1880f8a1b7d9SAlexander Kabaev 	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
1881f8a1b7d9SAlexander Kabaev     { return __rhs.compare(__lhs) == 0; }
1882f8a1b7d9SAlexander Kabaev 
1883f8a1b7d9SAlexander Kabaev   /**
1884f8a1b7d9SAlexander Kabaev    *  @brief  Test equivalence of string and C string.
1885f8a1b7d9SAlexander Kabaev    *  @param lhs  String.
1886f8a1b7d9SAlexander Kabaev    *  @param rhs  C string.
1887f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs.compare(@a rhs) == 0.  False otherwise.
1888f8a1b7d9SAlexander Kabaev    */
1889f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1890f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1891f8a1b7d9SAlexander Kabaev     inline bool
1892f8a1b7d9SAlexander Kabaev     operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
1893f8a1b7d9SAlexander Kabaev 	       const _CharT* __rhs)
1894f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) == 0; }
1895f8a1b7d9SAlexander Kabaev 
1896f8a1b7d9SAlexander Kabaev   // operator !=
1897f8a1b7d9SAlexander Kabaev   /**
1898f8a1b7d9SAlexander Kabaev    *  @brief  Test difference of two strings.
1899f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
1900f8a1b7d9SAlexander Kabaev    *  @param rhs  Second string.
1901f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs.compare(@a rhs) != 0.  False otherwise.
1902f8a1b7d9SAlexander Kabaev    */
1903f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1904f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1905f8a1b7d9SAlexander Kabaev     inline bool
1906f8a1b7d9SAlexander Kabaev     operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
1907f8a1b7d9SAlexander Kabaev 	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
1908f8a1b7d9SAlexander Kabaev     { return __rhs.compare(__lhs) != 0; }
1909f8a1b7d9SAlexander Kabaev 
1910f8a1b7d9SAlexander Kabaev   /**
1911f8a1b7d9SAlexander Kabaev    *  @brief  Test difference of C string and string.
1912f8a1b7d9SAlexander Kabaev    *  @param lhs  C string.
1913f8a1b7d9SAlexander Kabaev    *  @param rhs  String.
1914f8a1b7d9SAlexander Kabaev    *  @return  True if @a rhs.compare(@a lhs) != 0.  False otherwise.
1915f8a1b7d9SAlexander Kabaev    */
1916f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1917f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1918f8a1b7d9SAlexander Kabaev     inline bool
1919f8a1b7d9SAlexander Kabaev     operator!=(const _CharT* __lhs,
1920f8a1b7d9SAlexander Kabaev 	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
1921f8a1b7d9SAlexander Kabaev     { return __rhs.compare(__lhs) != 0; }
1922f8a1b7d9SAlexander Kabaev 
1923f8a1b7d9SAlexander Kabaev   /**
1924f8a1b7d9SAlexander Kabaev    *  @brief  Test difference of string and C string.
1925f8a1b7d9SAlexander Kabaev    *  @param lhs  String.
1926f8a1b7d9SAlexander Kabaev    *  @param rhs  C string.
1927f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs.compare(@a rhs) != 0.  False otherwise.
1928f8a1b7d9SAlexander Kabaev    */
1929f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1930f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1931f8a1b7d9SAlexander Kabaev     inline bool
1932f8a1b7d9SAlexander Kabaev     operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
1933f8a1b7d9SAlexander Kabaev 	       const _CharT* __rhs)
1934f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) != 0; }
1935f8a1b7d9SAlexander Kabaev 
1936f8a1b7d9SAlexander Kabaev   // operator <
1937f8a1b7d9SAlexander Kabaev   /**
1938f8a1b7d9SAlexander Kabaev    *  @brief  Test if string precedes string.
1939f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
1940f8a1b7d9SAlexander Kabaev    *  @param rhs  Second string.
1941f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs precedes @a rhs.  False otherwise.
1942f8a1b7d9SAlexander Kabaev    */
1943f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1944f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1945f8a1b7d9SAlexander Kabaev     inline bool
1946f8a1b7d9SAlexander Kabaev     operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
1947f8a1b7d9SAlexander Kabaev 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
1948f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) < 0; }
1949f8a1b7d9SAlexander Kabaev 
1950f8a1b7d9SAlexander Kabaev   /**
1951f8a1b7d9SAlexander Kabaev    *  @brief  Test if string precedes C string.
1952f8a1b7d9SAlexander Kabaev    *  @param lhs  String.
1953f8a1b7d9SAlexander Kabaev    *  @param rhs  C string.
1954f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs precedes @a rhs.  False otherwise.
1955f8a1b7d9SAlexander Kabaev    */
1956f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1957f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1958f8a1b7d9SAlexander Kabaev     inline bool
1959f8a1b7d9SAlexander Kabaev     operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
1960f8a1b7d9SAlexander Kabaev 	      const _CharT* __rhs)
1961f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) < 0; }
1962f8a1b7d9SAlexander Kabaev 
1963f8a1b7d9SAlexander Kabaev   /**
1964f8a1b7d9SAlexander Kabaev    *  @brief  Test if C string precedes string.
1965f8a1b7d9SAlexander Kabaev    *  @param lhs  C string.
1966f8a1b7d9SAlexander Kabaev    *  @param rhs  String.
1967f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs precedes @a rhs.  False otherwise.
1968f8a1b7d9SAlexander Kabaev    */
1969f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1970f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1971f8a1b7d9SAlexander Kabaev     inline bool
1972f8a1b7d9SAlexander Kabaev     operator<(const _CharT* __lhs,
1973f8a1b7d9SAlexander Kabaev 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
1974f8a1b7d9SAlexander Kabaev     { return __rhs.compare(__lhs) > 0; }
1975f8a1b7d9SAlexander Kabaev 
1976f8a1b7d9SAlexander Kabaev   // operator >
1977f8a1b7d9SAlexander Kabaev   /**
1978f8a1b7d9SAlexander Kabaev    *  @brief  Test if string follows string.
1979f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
1980f8a1b7d9SAlexander Kabaev    *  @param rhs  Second string.
1981f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs follows @a rhs.  False otherwise.
1982f8a1b7d9SAlexander Kabaev    */
1983f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1984f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1985f8a1b7d9SAlexander Kabaev     inline bool
1986f8a1b7d9SAlexander Kabaev     operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
1987f8a1b7d9SAlexander Kabaev 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
1988f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) > 0; }
1989f8a1b7d9SAlexander Kabaev 
1990f8a1b7d9SAlexander Kabaev   /**
1991f8a1b7d9SAlexander Kabaev    *  @brief  Test if string follows C string.
1992f8a1b7d9SAlexander Kabaev    *  @param lhs  String.
1993f8a1b7d9SAlexander Kabaev    *  @param rhs  C string.
1994f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs follows @a rhs.  False otherwise.
1995f8a1b7d9SAlexander Kabaev    */
1996f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
1997f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
1998f8a1b7d9SAlexander Kabaev     inline bool
1999f8a1b7d9SAlexander Kabaev     operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2000f8a1b7d9SAlexander Kabaev 	      const _CharT* __rhs)
2001f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) > 0; }
2002f8a1b7d9SAlexander Kabaev 
2003f8a1b7d9SAlexander Kabaev   /**
2004f8a1b7d9SAlexander Kabaev    *  @brief  Test if C string follows string.
2005f8a1b7d9SAlexander Kabaev    *  @param lhs  C string.
2006f8a1b7d9SAlexander Kabaev    *  @param rhs  String.
2007f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs follows @a rhs.  False otherwise.
2008f8a1b7d9SAlexander Kabaev    */
2009f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2010f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
2011f8a1b7d9SAlexander Kabaev     inline bool
2012f8a1b7d9SAlexander Kabaev     operator>(const _CharT* __lhs,
2013f8a1b7d9SAlexander Kabaev 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2014f8a1b7d9SAlexander Kabaev     { return __rhs.compare(__lhs) < 0; }
2015f8a1b7d9SAlexander Kabaev 
2016f8a1b7d9SAlexander Kabaev   // operator <=
2017f8a1b7d9SAlexander Kabaev   /**
2018f8a1b7d9SAlexander Kabaev    *  @brief  Test if string doesn't follow string.
2019f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
2020f8a1b7d9SAlexander Kabaev    *  @param rhs  Second string.
2021f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs doesn't follow @a rhs.  False otherwise.
2022f8a1b7d9SAlexander Kabaev    */
2023f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2024f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
2025f8a1b7d9SAlexander Kabaev     inline bool
2026f8a1b7d9SAlexander Kabaev     operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2027f8a1b7d9SAlexander Kabaev 	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2028f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) <= 0; }
2029f8a1b7d9SAlexander Kabaev 
2030f8a1b7d9SAlexander Kabaev   /**
2031f8a1b7d9SAlexander Kabaev    *  @brief  Test if string doesn't follow C string.
2032f8a1b7d9SAlexander Kabaev    *  @param lhs  String.
2033f8a1b7d9SAlexander Kabaev    *  @param rhs  C string.
2034f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs doesn't follow @a rhs.  False otherwise.
2035f8a1b7d9SAlexander Kabaev    */
2036f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2037f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
2038f8a1b7d9SAlexander Kabaev     inline bool
2039f8a1b7d9SAlexander Kabaev     operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2040f8a1b7d9SAlexander Kabaev 	       const _CharT* __rhs)
2041f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) <= 0; }
2042f8a1b7d9SAlexander Kabaev 
2043f8a1b7d9SAlexander Kabaev   /**
2044f8a1b7d9SAlexander Kabaev    *  @brief  Test if C string doesn't follow string.
2045f8a1b7d9SAlexander Kabaev    *  @param lhs  C string.
2046f8a1b7d9SAlexander Kabaev    *  @param rhs  String.
2047f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs doesn't follow @a rhs.  False otherwise.
2048f8a1b7d9SAlexander Kabaev    */
2049f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2050f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
2051f8a1b7d9SAlexander Kabaev     inline bool
2052f8a1b7d9SAlexander Kabaev     operator<=(const _CharT* __lhs,
2053f8a1b7d9SAlexander Kabaev 	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2054f8a1b7d9SAlexander Kabaev     { return __rhs.compare(__lhs) >= 0; }
2055f8a1b7d9SAlexander Kabaev 
2056f8a1b7d9SAlexander Kabaev   // operator >=
2057f8a1b7d9SAlexander Kabaev   /**
2058f8a1b7d9SAlexander Kabaev    *  @brief  Test if string doesn't precede string.
2059f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
2060f8a1b7d9SAlexander Kabaev    *  @param rhs  Second string.
2061f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs doesn't precede @a rhs.  False otherwise.
2062f8a1b7d9SAlexander Kabaev    */
2063f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2064f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
2065f8a1b7d9SAlexander Kabaev     inline bool
2066f8a1b7d9SAlexander Kabaev     operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2067f8a1b7d9SAlexander Kabaev 	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2068f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) >= 0; }
2069f8a1b7d9SAlexander Kabaev 
2070f8a1b7d9SAlexander Kabaev   /**
2071f8a1b7d9SAlexander Kabaev    *  @brief  Test if string doesn't precede C string.
2072f8a1b7d9SAlexander Kabaev    *  @param lhs  String.
2073f8a1b7d9SAlexander Kabaev    *  @param rhs  C string.
2074f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs doesn't precede @a rhs.  False otherwise.
2075f8a1b7d9SAlexander Kabaev    */
2076f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2077f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
2078f8a1b7d9SAlexander Kabaev     inline bool
2079f8a1b7d9SAlexander Kabaev     operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2080f8a1b7d9SAlexander Kabaev 	       const _CharT* __rhs)
2081f8a1b7d9SAlexander Kabaev     { return __lhs.compare(__rhs) >= 0; }
2082f8a1b7d9SAlexander Kabaev 
2083f8a1b7d9SAlexander Kabaev   /**
2084f8a1b7d9SAlexander Kabaev    *  @brief  Test if C string doesn't precede string.
2085f8a1b7d9SAlexander Kabaev    *  @param lhs  C string.
2086f8a1b7d9SAlexander Kabaev    *  @param rhs  String.
2087f8a1b7d9SAlexander Kabaev    *  @return  True if @a lhs doesn't precede @a rhs.  False otherwise.
2088f8a1b7d9SAlexander Kabaev    */
2089f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2090f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
2091f8a1b7d9SAlexander Kabaev     inline bool
2092f8a1b7d9SAlexander Kabaev     operator>=(const _CharT* __lhs,
2093f8a1b7d9SAlexander Kabaev 	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2094f8a1b7d9SAlexander Kabaev     { return __rhs.compare(__lhs) <= 0; }
2095f8a1b7d9SAlexander Kabaev 
2096f8a1b7d9SAlexander Kabaev   /**
2097f8a1b7d9SAlexander Kabaev    *  @brief  Swap contents of two strings.
2098f8a1b7d9SAlexander Kabaev    *  @param lhs  First string.
2099f8a1b7d9SAlexander Kabaev    *  @param rhs  Second string.
2100f8a1b7d9SAlexander Kabaev    *
2101f8a1b7d9SAlexander Kabaev    *  Exchanges the contents of @a lhs and @a rhs in constant time.
2102f8a1b7d9SAlexander Kabaev    */
2103f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2104f8a1b7d9SAlexander Kabaev 	   template <typename, typename, typename> class _Base>
2105f8a1b7d9SAlexander Kabaev     inline void
swap(__versa_string<_CharT,_Traits,_Alloc,_Base> & __lhs,__versa_string<_CharT,_Traits,_Alloc,_Base> & __rhs)2106f8a1b7d9SAlexander Kabaev     swap(__versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2107f8a1b7d9SAlexander Kabaev 	 __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2108f8a1b7d9SAlexander Kabaev     { __lhs.swap(__rhs); }
2109f8a1b7d9SAlexander Kabaev 
2110f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
2111f8a1b7d9SAlexander Kabaev 
2112f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
2113f8a1b7d9SAlexander Kabaev 
2114f8a1b7d9SAlexander Kabaev   /**
2115f8a1b7d9SAlexander Kabaev    *  @brief  Read stream into a string.
2116f8a1b7d9SAlexander Kabaev    *  @param is  Input stream.
2117f8a1b7d9SAlexander Kabaev    *  @param str  Buffer to store into.
2118f8a1b7d9SAlexander Kabaev    *  @return  Reference to the input stream.
2119f8a1b7d9SAlexander Kabaev    *
2120f8a1b7d9SAlexander Kabaev    *  Stores characters from @a is into @a str until whitespace is found, the
2121f8a1b7d9SAlexander Kabaev    *  end of the stream is encountered, or str.max_size() is reached.  If
2122f8a1b7d9SAlexander Kabaev    *  is.width() is non-zero, that is the limit on the number of characters
2123f8a1b7d9SAlexander Kabaev    *  stored into @a str.  Any previous contents of @a str are erased.
2124f8a1b7d9SAlexander Kabaev    */
2125f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2126f8a1b7d9SAlexander Kabaev            template <typename, typename, typename> class _Base>
2127f8a1b7d9SAlexander Kabaev     basic_istream<_CharT, _Traits>&
2128f8a1b7d9SAlexander Kabaev     operator>>(basic_istream<_CharT, _Traits>& __is,
2129f8a1b7d9SAlexander Kabaev 	       __gnu_cxx::__versa_string<_CharT, _Traits,
2130f8a1b7d9SAlexander Kabaev 	                                 _Alloc, _Base>& __str);
2131f8a1b7d9SAlexander Kabaev 
2132f8a1b7d9SAlexander Kabaev   /**
2133f8a1b7d9SAlexander Kabaev    *  @brief  Write string to a stream.
2134f8a1b7d9SAlexander Kabaev    *  @param os  Output stream.
2135f8a1b7d9SAlexander Kabaev    *  @param str  String to write out.
2136f8a1b7d9SAlexander Kabaev    *  @return  Reference to the output stream.
2137f8a1b7d9SAlexander Kabaev    *
2138f8a1b7d9SAlexander Kabaev    *  Output characters of @a str into os following the same rules as for
2139f8a1b7d9SAlexander Kabaev    *  writing a C string.
2140f8a1b7d9SAlexander Kabaev    */
2141f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2142f8a1b7d9SAlexander Kabaev            template <typename, typename, typename> class _Base>
2143f8a1b7d9SAlexander Kabaev     inline basic_ostream<_CharT, _Traits>&
2144f8a1b7d9SAlexander Kabaev     operator<<(basic_ostream<_CharT, _Traits>& __os,
2145f8a1b7d9SAlexander Kabaev 	       const __gnu_cxx::__versa_string<_CharT, _Traits,
2146f8a1b7d9SAlexander Kabaev 	                                       _Alloc, _Base>& __str)
2147f8a1b7d9SAlexander Kabaev     {
2148f8a1b7d9SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
2149f8a1b7d9SAlexander Kabaev       // 586. string inserter not a formatted function
2150f8a1b7d9SAlexander Kabaev       return __ostream_insert(__os, __str.data(), __str.size());
2151f8a1b7d9SAlexander Kabaev     }
2152f8a1b7d9SAlexander Kabaev 
2153f8a1b7d9SAlexander Kabaev   /**
2154f8a1b7d9SAlexander Kabaev    *  @brief  Read a line from stream into a string.
2155f8a1b7d9SAlexander Kabaev    *  @param is  Input stream.
2156f8a1b7d9SAlexander Kabaev    *  @param str  Buffer to store into.
2157f8a1b7d9SAlexander Kabaev    *  @param delim  Character marking end of line.
2158f8a1b7d9SAlexander Kabaev    *  @return  Reference to the input stream.
2159f8a1b7d9SAlexander Kabaev    *
2160f8a1b7d9SAlexander Kabaev    *  Stores characters from @a is into @a str until @a delim is found, the
2161f8a1b7d9SAlexander Kabaev    *  end of the stream is encountered, or str.max_size() is reached.  If
2162f8a1b7d9SAlexander Kabaev    *  is.width() is non-zero, that is the limit on the number of characters
2163f8a1b7d9SAlexander Kabaev    *  stored into @a str.  Any previous contents of @a str are erased.  If @a
2164f8a1b7d9SAlexander Kabaev    *  delim was encountered, it is extracted but not stored into @a str.
2165f8a1b7d9SAlexander Kabaev    */
2166f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2167f8a1b7d9SAlexander Kabaev            template <typename, typename, typename> class _Base>
2168f8a1b7d9SAlexander Kabaev     basic_istream<_CharT, _Traits>&
2169f8a1b7d9SAlexander Kabaev     getline(basic_istream<_CharT, _Traits>& __is,
2170f8a1b7d9SAlexander Kabaev 	    __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str,
2171f8a1b7d9SAlexander Kabaev 	    _CharT __delim);
2172f8a1b7d9SAlexander Kabaev 
2173f8a1b7d9SAlexander Kabaev   /**
2174f8a1b7d9SAlexander Kabaev    *  @brief  Read a line from stream into a string.
2175f8a1b7d9SAlexander Kabaev    *  @param is  Input stream.
2176f8a1b7d9SAlexander Kabaev    *  @param str  Buffer to store into.
2177f8a1b7d9SAlexander Kabaev    *  @return  Reference to the input stream.
2178f8a1b7d9SAlexander Kabaev    *
2179f8a1b7d9SAlexander Kabaev    *  Stores characters from is into @a str until '\n' is found, the end of
2180f8a1b7d9SAlexander Kabaev    *  the stream is encountered, or str.max_size() is reached.  If is.width()
2181f8a1b7d9SAlexander Kabaev    *  is non-zero, that is the limit on the number of characters stored into
2182f8a1b7d9SAlexander Kabaev    *  @a str.  Any previous contents of @a str are erased.  If end of line was
2183f8a1b7d9SAlexander Kabaev    *  encountered, it is extracted but not stored into @a str.
2184f8a1b7d9SAlexander Kabaev    */
2185f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits, typename _Alloc,
2186f8a1b7d9SAlexander Kabaev            template <typename, typename, typename> class _Base>
2187f8a1b7d9SAlexander Kabaev     inline basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT,_Traits> & __is,__gnu_cxx::__versa_string<_CharT,_Traits,_Alloc,_Base> & __str)2188f8a1b7d9SAlexander Kabaev     getline(basic_istream<_CharT, _Traits>& __is,
2189f8a1b7d9SAlexander Kabaev 	    __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str)
2190f8a1b7d9SAlexander Kabaev     { return getline(__is, __str, __is.widen('\n')); }
2191f8a1b7d9SAlexander Kabaev 
2192f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
2193f8a1b7d9SAlexander Kabaev 
2194f8a1b7d9SAlexander Kabaev #ifndef _GLIBCXX_EXPORT_TEMPLATE
2195f8a1b7d9SAlexander Kabaev # include "vstring.tcc"
2196f8a1b7d9SAlexander Kabaev #endif
2197f8a1b7d9SAlexander Kabaev 
2198f8a1b7d9SAlexander Kabaev #endif /* _VSTRING_H */
2199