xref: /dflybsd-src/contrib/gcc-8.0/libstdc++-v3/include/ext/vstring.tcc (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj // Versatile string -*- C++ -*-
2*38fd1498Szrj 
3*38fd1498Szrj // Copyright (C) 2005-2018 Free Software Foundation, Inc.
4*38fd1498Szrj //
5*38fd1498Szrj // This file is part of the GNU ISO C++ Library.  This library is free
6*38fd1498Szrj // software; you can redistribute it and/or modify it under the
7*38fd1498Szrj // terms of the GNU General Public License as published by the
8*38fd1498Szrj // Free Software Foundation; either version 3, or (at your option)
9*38fd1498Szrj // any later version.
10*38fd1498Szrj 
11*38fd1498Szrj // This library is distributed in the hope that it will be useful,
12*38fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of
13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*38fd1498Szrj // GNU General Public License for more details.
15*38fd1498Szrj 
16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional
17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version
18*38fd1498Szrj // 3.1, as published by the Free Software Foundation.
19*38fd1498Szrj 
20*38fd1498Szrj // You should have received a copy of the GNU General Public License and
21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program;
22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23*38fd1498Szrj // <http://www.gnu.org/licenses/>.
24*38fd1498Szrj 
25*38fd1498Szrj /** @file ext/vstring.tcc
26*38fd1498Szrj  *  This is an internal header file, included by other library headers.
27*38fd1498Szrj  *  Do not attempt to use it directly. @headername{ext/vstring.h}
28*38fd1498Szrj  */
29*38fd1498Szrj 
30*38fd1498Szrj #ifndef _VSTRING_TCC
31*38fd1498Szrj #define _VSTRING_TCC 1
32*38fd1498Szrj 
33*38fd1498Szrj #pragma GCC system_header
34*38fd1498Szrj 
35*38fd1498Szrj #include <bits/cxxabi_forced.h>
36*38fd1498Szrj 
37*38fd1498Szrj namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
38*38fd1498Szrj {
39*38fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
40*38fd1498Szrj 
41*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
42*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
43*38fd1498Szrj     const typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
44*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::npos;
45*38fd1498Szrj 
46*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
47*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
48*38fd1498Szrj     void
49*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
resize(size_type __n,_CharT __c)50*38fd1498Szrj     resize(size_type __n, _CharT __c)
51*38fd1498Szrj     {
52*38fd1498Szrj       const size_type __size = this->size();
53*38fd1498Szrj       if (__size < __n)
54*38fd1498Szrj 	this->append(__n - __size, __c);
55*38fd1498Szrj       else if (__n < __size)
56*38fd1498Szrj 	this->_M_erase(__n, __size - __n);
57*38fd1498Szrj     }
58*38fd1498Szrj 
59*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
60*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
61*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>&
62*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
_M_append(const _CharT * __s,size_type __n)63*38fd1498Szrj     _M_append(const _CharT* __s, size_type __n)
64*38fd1498Szrj     {
65*38fd1498Szrj       const size_type __len = __n + this->size();
66*38fd1498Szrj 
67*38fd1498Szrj       if (__len <= this->capacity() && !this->_M_is_shared())
68*38fd1498Szrj 	{
69*38fd1498Szrj 	  if (__n)
70*38fd1498Szrj 	    this->_S_copy(this->_M_data() + this->size(), __s, __n);
71*38fd1498Szrj 	}
72*38fd1498Szrj       else
73*38fd1498Szrj 	this->_M_mutate(this->size(), size_type(0), __s, __n);
74*38fd1498Szrj 
75*38fd1498Szrj       this->_M_set_length(__len);
76*38fd1498Szrj       return *this;
77*38fd1498Szrj     }
78*38fd1498Szrj 
79*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
80*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
81*38fd1498Szrj     template<typename _InputIterator>
82*38fd1498Szrj       __versa_string<_CharT, _Traits, _Alloc, _Base>&
83*38fd1498Szrj       __versa_string<_CharT, _Traits, _Alloc, _Base>::
_M_replace_dispatch(const_iterator __i1,const_iterator __i2,_InputIterator __k1,_InputIterator __k2,std::__false_type)84*38fd1498Szrj       _M_replace_dispatch(const_iterator __i1, const_iterator __i2,
85*38fd1498Szrj 			  _InputIterator __k1, _InputIterator __k2,
86*38fd1498Szrj 			  std::__false_type)
87*38fd1498Szrj       {
88*38fd1498Szrj 	const __versa_string __s(__k1, __k2);
89*38fd1498Szrj 	const size_type __n1 = __i2 - __i1;
90*38fd1498Szrj 	return _M_replace(__i1 - _M_ibegin(), __n1, __s._M_data(),
91*38fd1498Szrj 			  __s.size());
92*38fd1498Szrj       }
93*38fd1498Szrj 
94*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
95*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
96*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>&
97*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
_M_replace_aux(size_type __pos1,size_type __n1,size_type __n2,_CharT __c)98*38fd1498Szrj     _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
99*38fd1498Szrj 		   _CharT __c)
100*38fd1498Szrj     {
101*38fd1498Szrj       _M_check_length(__n1, __n2, "__versa_string::_M_replace_aux");
102*38fd1498Szrj 
103*38fd1498Szrj       const size_type __old_size = this->size();
104*38fd1498Szrj       const size_type __new_size = __old_size + __n2 - __n1;
105*38fd1498Szrj 
106*38fd1498Szrj       if (__new_size <= this->capacity() && !this->_M_is_shared())
107*38fd1498Szrj 	{
108*38fd1498Szrj 	  _CharT* __p = this->_M_data() + __pos1;
109*38fd1498Szrj 
110*38fd1498Szrj 	  const size_type __how_much = __old_size - __pos1 - __n1;
111*38fd1498Szrj 	  if (__how_much && __n1 != __n2)
112*38fd1498Szrj 	    this->_S_move(__p + __n2, __p + __n1, __how_much);
113*38fd1498Szrj 	}
114*38fd1498Szrj       else
115*38fd1498Szrj 	this->_M_mutate(__pos1, __n1, 0, __n2);
116*38fd1498Szrj 
117*38fd1498Szrj       if (__n2)
118*38fd1498Szrj 	this->_S_assign(this->_M_data() + __pos1, __n2, __c);
119*38fd1498Szrj 
120*38fd1498Szrj       this->_M_set_length(__new_size);
121*38fd1498Szrj       return *this;
122*38fd1498Szrj     }
123*38fd1498Szrj 
124*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
125*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
126*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>&
127*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
_M_replace(size_type __pos,size_type __len1,const _CharT * __s,const size_type __len2)128*38fd1498Szrj     _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
129*38fd1498Szrj 	       const size_type __len2)
130*38fd1498Szrj     {
131*38fd1498Szrj       _M_check_length(__len1, __len2, "__versa_string::_M_replace");
132*38fd1498Szrj 
133*38fd1498Szrj       const size_type __old_size = this->size();
134*38fd1498Szrj       const size_type __new_size = __old_size + __len2 - __len1;
135*38fd1498Szrj 
136*38fd1498Szrj       if (__new_size <= this->capacity() && !this->_M_is_shared())
137*38fd1498Szrj 	{
138*38fd1498Szrj 	  _CharT* __p = this->_M_data() + __pos;
139*38fd1498Szrj 
140*38fd1498Szrj 	  const size_type __how_much = __old_size - __pos - __len1;
141*38fd1498Szrj 	  if (_M_disjunct(__s))
142*38fd1498Szrj 	    {
143*38fd1498Szrj 	      if (__how_much && __len1 != __len2)
144*38fd1498Szrj 		this->_S_move(__p + __len2, __p + __len1, __how_much);
145*38fd1498Szrj 	      if (__len2)
146*38fd1498Szrj 		this->_S_copy(__p, __s, __len2);
147*38fd1498Szrj 	    }
148*38fd1498Szrj 	  else
149*38fd1498Szrj 	    {
150*38fd1498Szrj 	      // Work in-place.
151*38fd1498Szrj 	      if (__len2 && __len2 <= __len1)
152*38fd1498Szrj 		this->_S_move(__p, __s, __len2);
153*38fd1498Szrj 	      if (__how_much && __len1 != __len2)
154*38fd1498Szrj 		this->_S_move(__p + __len2, __p + __len1, __how_much);
155*38fd1498Szrj 	      if (__len2 > __len1)
156*38fd1498Szrj 		{
157*38fd1498Szrj 		  if (__s + __len2 <= __p + __len1)
158*38fd1498Szrj 		    this->_S_move(__p, __s, __len2);
159*38fd1498Szrj 		  else if (__s >= __p + __len1)
160*38fd1498Szrj 		    this->_S_copy(__p, __s + __len2 - __len1, __len2);
161*38fd1498Szrj 		  else
162*38fd1498Szrj 		    {
163*38fd1498Szrj 		      const size_type __nleft = (__p + __len1) - __s;
164*38fd1498Szrj 		      this->_S_move(__p, __s, __nleft);
165*38fd1498Szrj 		      this->_S_copy(__p + __nleft, __p + __len2,
166*38fd1498Szrj 				    __len2 - __nleft);
167*38fd1498Szrj 		    }
168*38fd1498Szrj 		}
169*38fd1498Szrj 	    }
170*38fd1498Szrj 	}
171*38fd1498Szrj       else
172*38fd1498Szrj 	this->_M_mutate(__pos, __len1, __s, __len2);
173*38fd1498Szrj 
174*38fd1498Szrj       this->_M_set_length(__new_size);
175*38fd1498Szrj       return *this;
176*38fd1498Szrj     }
177*38fd1498Szrj 
178*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
179*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
180*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>
operator +(const __versa_string<_CharT,_Traits,_Alloc,_Base> & __lhs,const __versa_string<_CharT,_Traits,_Alloc,_Base> & __rhs)181*38fd1498Szrj     operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
182*38fd1498Szrj 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
183*38fd1498Szrj     {
184*38fd1498Szrj       __versa_string<_CharT, _Traits, _Alloc, _Base> __str;
185*38fd1498Szrj       __str.reserve(__lhs.size() + __rhs.size());
186*38fd1498Szrj       __str.append(__lhs);
187*38fd1498Szrj       __str.append(__rhs);
188*38fd1498Szrj       return __str;
189*38fd1498Szrj     }
190*38fd1498Szrj 
191*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
192*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
193*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>
operator +(const _CharT * __lhs,const __versa_string<_CharT,_Traits,_Alloc,_Base> & __rhs)194*38fd1498Szrj     operator+(const _CharT* __lhs,
195*38fd1498Szrj 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
196*38fd1498Szrj     {
197*38fd1498Szrj       __glibcxx_requires_string(__lhs);
198*38fd1498Szrj       typedef __versa_string<_CharT, _Traits, _Alloc, _Base> __string_type;
199*38fd1498Szrj       typedef typename __string_type::size_type	  __size_type;
200*38fd1498Szrj       const __size_type __len = _Traits::length(__lhs);
201*38fd1498Szrj       __string_type __str;
202*38fd1498Szrj       __str.reserve(__len + __rhs.size());
203*38fd1498Szrj       __str.append(__lhs, __len);
204*38fd1498Szrj       __str.append(__rhs);
205*38fd1498Szrj       return __str;
206*38fd1498Szrj     }
207*38fd1498Szrj 
208*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
209*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
210*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>
operator +(_CharT __lhs,const __versa_string<_CharT,_Traits,_Alloc,_Base> & __rhs)211*38fd1498Szrj     operator+(_CharT __lhs,
212*38fd1498Szrj 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
213*38fd1498Szrj     {
214*38fd1498Szrj       __versa_string<_CharT, _Traits, _Alloc, _Base> __str;
215*38fd1498Szrj       __str.reserve(__rhs.size() + 1);
216*38fd1498Szrj       __str.push_back(__lhs);
217*38fd1498Szrj       __str.append(__rhs);
218*38fd1498Szrj       return __str;
219*38fd1498Szrj     }
220*38fd1498Szrj 
221*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
222*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
223*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>
operator +(const __versa_string<_CharT,_Traits,_Alloc,_Base> & __lhs,const _CharT * __rhs)224*38fd1498Szrj     operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
225*38fd1498Szrj 	      const _CharT* __rhs)
226*38fd1498Szrj     {
227*38fd1498Szrj       __glibcxx_requires_string(__rhs);
228*38fd1498Szrj       typedef __versa_string<_CharT, _Traits, _Alloc, _Base> __string_type;
229*38fd1498Szrj       typedef typename __string_type::size_type	  __size_type;
230*38fd1498Szrj       const __size_type __len = _Traits::length(__rhs);
231*38fd1498Szrj       __string_type __str;
232*38fd1498Szrj       __str.reserve(__lhs.size() + __len);
233*38fd1498Szrj       __str.append(__lhs);
234*38fd1498Szrj       __str.append(__rhs, __len);
235*38fd1498Szrj       return __str;
236*38fd1498Szrj     }
237*38fd1498Szrj 
238*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
239*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
240*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>
operator +(const __versa_string<_CharT,_Traits,_Alloc,_Base> & __lhs,_CharT __rhs)241*38fd1498Szrj     operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
242*38fd1498Szrj 	      _CharT __rhs)
243*38fd1498Szrj     {
244*38fd1498Szrj       __versa_string<_CharT, _Traits, _Alloc, _Base> __str;
245*38fd1498Szrj       __str.reserve(__lhs.size() + 1);
246*38fd1498Szrj       __str.append(__lhs);
247*38fd1498Szrj       __str.push_back(__rhs);
248*38fd1498Szrj       return __str;
249*38fd1498Szrj     }
250*38fd1498Szrj 
251*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
252*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
253*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
254*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
copy(_CharT * __s,size_type __n,size_type __pos) const255*38fd1498Szrj     copy(_CharT* __s, size_type __n, size_type __pos) const
256*38fd1498Szrj     {
257*38fd1498Szrj       _M_check(__pos, "__versa_string::copy");
258*38fd1498Szrj       __n = _M_limit(__pos, __n);
259*38fd1498Szrj       __glibcxx_requires_string_len(__s, __n);
260*38fd1498Szrj       if (__n)
261*38fd1498Szrj 	this->_S_copy(__s, this->_M_data() + __pos, __n);
262*38fd1498Szrj       // 21.3.5.7 par 3: do not append null.  (good.)
263*38fd1498Szrj       return __n;
264*38fd1498Szrj     }
265*38fd1498Szrj 
266*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
267*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
268*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
269*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find(const _CharT * __s,size_type __pos,size_type __n) const270*38fd1498Szrj     find(const _CharT* __s, size_type __pos, size_type __n) const
271*38fd1498Szrj     {
272*38fd1498Szrj       __glibcxx_requires_string_len(__s, __n);
273*38fd1498Szrj       const size_type __size = this->size();
274*38fd1498Szrj       const _CharT* __data = this->_M_data();
275*38fd1498Szrj 
276*38fd1498Szrj       if (__n == 0)
277*38fd1498Szrj 	return __pos <= __size ? __pos : npos;
278*38fd1498Szrj 
279*38fd1498Szrj       if (__n <= __size)
280*38fd1498Szrj 	{
281*38fd1498Szrj 	  for (; __pos <= __size - __n; ++__pos)
282*38fd1498Szrj 	    if (traits_type::eq(__data[__pos], __s[0])
283*38fd1498Szrj 		&& traits_type::compare(__data + __pos + 1,
284*38fd1498Szrj 					__s + 1, __n - 1) == 0)
285*38fd1498Szrj 	      return __pos;
286*38fd1498Szrj 	}
287*38fd1498Szrj       return npos;
288*38fd1498Szrj     }
289*38fd1498Szrj 
290*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
291*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
292*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
293*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find(_CharT __c,size_type __pos) const294*38fd1498Szrj     find(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
295*38fd1498Szrj     {
296*38fd1498Szrj       size_type __ret = npos;
297*38fd1498Szrj       const size_type __size = this->size();
298*38fd1498Szrj       if (__pos < __size)
299*38fd1498Szrj 	{
300*38fd1498Szrj 	  const _CharT* __data = this->_M_data();
301*38fd1498Szrj 	  const size_type __n = __size - __pos;
302*38fd1498Szrj 	  const _CharT* __p = traits_type::find(__data + __pos, __n, __c);
303*38fd1498Szrj 	  if (__p)
304*38fd1498Szrj 	    __ret = __p - __data;
305*38fd1498Szrj 	}
306*38fd1498Szrj       return __ret;
307*38fd1498Szrj     }
308*38fd1498Szrj 
309*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
310*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
311*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
312*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
rfind(const _CharT * __s,size_type __pos,size_type __n) const313*38fd1498Szrj     rfind(const _CharT* __s, size_type __pos, size_type __n) const
314*38fd1498Szrj     {
315*38fd1498Szrj       __glibcxx_requires_string_len(__s, __n);
316*38fd1498Szrj       const size_type __size = this->size();
317*38fd1498Szrj       if (__n <= __size)
318*38fd1498Szrj 	{
319*38fd1498Szrj 	  __pos = std::min(size_type(__size - __n), __pos);
320*38fd1498Szrj 	  const _CharT* __data = this->_M_data();
321*38fd1498Szrj 	  do
322*38fd1498Szrj 	    {
323*38fd1498Szrj 	      if (traits_type::compare(__data + __pos, __s, __n) == 0)
324*38fd1498Szrj 		return __pos;
325*38fd1498Szrj 	    }
326*38fd1498Szrj 	  while (__pos-- > 0);
327*38fd1498Szrj 	}
328*38fd1498Szrj       return npos;
329*38fd1498Szrj     }
330*38fd1498Szrj 
331*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
332*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
333*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
334*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
rfind(_CharT __c,size_type __pos) const335*38fd1498Szrj     rfind(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
336*38fd1498Szrj     {
337*38fd1498Szrj       size_type __size = this->size();
338*38fd1498Szrj       if (__size)
339*38fd1498Szrj 	{
340*38fd1498Szrj 	  if (--__size > __pos)
341*38fd1498Szrj 	    __size = __pos;
342*38fd1498Szrj 	  for (++__size; __size-- > 0; )
343*38fd1498Szrj 	    if (traits_type::eq(this->_M_data()[__size], __c))
344*38fd1498Szrj 	      return __size;
345*38fd1498Szrj 	}
346*38fd1498Szrj       return npos;
347*38fd1498Szrj     }
348*38fd1498Szrj 
349*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
350*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
351*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
352*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_first_of(const _CharT * __s,size_type __pos,size_type __n) const353*38fd1498Szrj     find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
354*38fd1498Szrj     {
355*38fd1498Szrj       __glibcxx_requires_string_len(__s, __n);
356*38fd1498Szrj       for (; __n && __pos < this->size(); ++__pos)
357*38fd1498Szrj 	{
358*38fd1498Szrj 	  const _CharT* __p = traits_type::find(__s, __n,
359*38fd1498Szrj 						this->_M_data()[__pos]);
360*38fd1498Szrj 	  if (__p)
361*38fd1498Szrj 	    return __pos;
362*38fd1498Szrj 	}
363*38fd1498Szrj       return npos;
364*38fd1498Szrj     }
365*38fd1498Szrj 
366*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
367*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
368*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
369*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_last_of(const _CharT * __s,size_type __pos,size_type __n) const370*38fd1498Szrj     find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
371*38fd1498Szrj     {
372*38fd1498Szrj       __glibcxx_requires_string_len(__s, __n);
373*38fd1498Szrj       size_type __size = this->size();
374*38fd1498Szrj       if (__size && __n)
375*38fd1498Szrj 	{
376*38fd1498Szrj 	  if (--__size > __pos)
377*38fd1498Szrj 	    __size = __pos;
378*38fd1498Szrj 	  do
379*38fd1498Szrj 	    {
380*38fd1498Szrj 	      if (traits_type::find(__s, __n, this->_M_data()[__size]))
381*38fd1498Szrj 		return __size;
382*38fd1498Szrj 	    }
383*38fd1498Szrj 	  while (__size-- != 0);
384*38fd1498Szrj 	}
385*38fd1498Szrj       return npos;
386*38fd1498Szrj     }
387*38fd1498Szrj 
388*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
389*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
390*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
391*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_first_not_of(const _CharT * __s,size_type __pos,size_type __n) const392*38fd1498Szrj     find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
393*38fd1498Szrj     {
394*38fd1498Szrj       __glibcxx_requires_string_len(__s, __n);
395*38fd1498Szrj       for (; __pos < this->size(); ++__pos)
396*38fd1498Szrj 	if (!traits_type::find(__s, __n, this->_M_data()[__pos]))
397*38fd1498Szrj 	  return __pos;
398*38fd1498Szrj       return npos;
399*38fd1498Szrj     }
400*38fd1498Szrj 
401*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
402*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
403*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
404*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_first_not_of(_CharT __c,size_type __pos) const405*38fd1498Szrj     find_first_not_of(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
406*38fd1498Szrj     {
407*38fd1498Szrj       for (; __pos < this->size(); ++__pos)
408*38fd1498Szrj 	if (!traits_type::eq(this->_M_data()[__pos], __c))
409*38fd1498Szrj 	  return __pos;
410*38fd1498Szrj       return npos;
411*38fd1498Szrj     }
412*38fd1498Szrj 
413*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
414*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
415*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
416*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_last_not_of(const _CharT * __s,size_type __pos,size_type __n) const417*38fd1498Szrj     find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
418*38fd1498Szrj     {
419*38fd1498Szrj       __glibcxx_requires_string_len(__s, __n);
420*38fd1498Szrj       size_type __size = this->size();
421*38fd1498Szrj       if (__size)
422*38fd1498Szrj 	{
423*38fd1498Szrj 	  if (--__size > __pos)
424*38fd1498Szrj 	    __size = __pos;
425*38fd1498Szrj 	  do
426*38fd1498Szrj 	    {
427*38fd1498Szrj 	      if (!traits_type::find(__s, __n, this->_M_data()[__size]))
428*38fd1498Szrj 		return __size;
429*38fd1498Szrj 	    }
430*38fd1498Szrj 	  while (__size--);
431*38fd1498Szrj 	}
432*38fd1498Szrj       return npos;
433*38fd1498Szrj     }
434*38fd1498Szrj 
435*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
436*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
437*38fd1498Szrj     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
438*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_last_not_of(_CharT __c,size_type __pos) const439*38fd1498Szrj     find_last_not_of(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
440*38fd1498Szrj     {
441*38fd1498Szrj       size_type __size = this->size();
442*38fd1498Szrj       if (__size)
443*38fd1498Szrj 	{
444*38fd1498Szrj 	  if (--__size > __pos)
445*38fd1498Szrj 	    __size = __pos;
446*38fd1498Szrj 	  do
447*38fd1498Szrj 	    {
448*38fd1498Szrj 	      if (!traits_type::eq(this->_M_data()[__size], __c))
449*38fd1498Szrj 		return __size;
450*38fd1498Szrj 	    }
451*38fd1498Szrj 	  while (__size--);
452*38fd1498Szrj 	}
453*38fd1498Szrj       return npos;
454*38fd1498Szrj     }
455*38fd1498Szrj 
456*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
457*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
458*38fd1498Szrj     int
459*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
compare(size_type __pos,size_type __n,const __versa_string & __str) const460*38fd1498Szrj     compare(size_type __pos, size_type __n, const __versa_string& __str) const
461*38fd1498Szrj     {
462*38fd1498Szrj       _M_check(__pos, "__versa_string::compare");
463*38fd1498Szrj       __n = _M_limit(__pos, __n);
464*38fd1498Szrj       const size_type __osize = __str.size();
465*38fd1498Szrj       const size_type __len = std::min(__n, __osize);
466*38fd1498Szrj       int __r = traits_type::compare(this->_M_data() + __pos,
467*38fd1498Szrj 				     __str.data(), __len);
468*38fd1498Szrj       if (!__r)
469*38fd1498Szrj 	__r = this->_S_compare(__n, __osize);
470*38fd1498Szrj       return __r;
471*38fd1498Szrj     }
472*38fd1498Szrj 
473*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
474*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
475*38fd1498Szrj     int
476*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
compare(size_type __pos1,size_type __n1,const __versa_string & __str,size_type __pos2,size_type __n2) const477*38fd1498Szrj     compare(size_type __pos1, size_type __n1, const __versa_string& __str,
478*38fd1498Szrj 	    size_type __pos2, size_type __n2) const
479*38fd1498Szrj     {
480*38fd1498Szrj       _M_check(__pos1, "__versa_string::compare");
481*38fd1498Szrj       __str._M_check(__pos2, "__versa_string::compare");
482*38fd1498Szrj       __n1 = _M_limit(__pos1, __n1);
483*38fd1498Szrj       __n2 = __str._M_limit(__pos2, __n2);
484*38fd1498Szrj       const size_type __len = std::min(__n1, __n2);
485*38fd1498Szrj       int __r = traits_type::compare(this->_M_data() + __pos1,
486*38fd1498Szrj 				     __str.data() + __pos2, __len);
487*38fd1498Szrj       if (!__r)
488*38fd1498Szrj 	__r = this->_S_compare(__n1, __n2);
489*38fd1498Szrj       return __r;
490*38fd1498Szrj     }
491*38fd1498Szrj 
492*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
493*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
494*38fd1498Szrj     int
495*38fd1498Szrj     __versa_string<_CharT, _Traits, _Alloc, _Base>::
compare(const _CharT * __s) const496*38fd1498Szrj     compare(const _CharT* __s) const
497*38fd1498Szrj     {
498*38fd1498Szrj       __glibcxx_requires_string(__s);
499*38fd1498Szrj       const size_type __size = this->size();
500*38fd1498Szrj       const size_type __osize = traits_type::length(__s);
501*38fd1498Szrj       const size_type __len = std::min(__size, __osize);
502*38fd1498Szrj       int __r = traits_type::compare(this->_M_data(), __s, __len);
503*38fd1498Szrj       if (!__r)
504*38fd1498Szrj 	__r = this->_S_compare(__size, __osize);
505*38fd1498Szrj       return __r;
506*38fd1498Szrj     }
507*38fd1498Szrj 
508*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
509*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
510*38fd1498Szrj     int
511*38fd1498Szrj     __versa_string <_CharT, _Traits, _Alloc, _Base>::
compare(size_type __pos,size_type __n1,const _CharT * __s) const512*38fd1498Szrj     compare(size_type __pos, size_type __n1, const _CharT* __s) const
513*38fd1498Szrj     {
514*38fd1498Szrj       __glibcxx_requires_string(__s);
515*38fd1498Szrj       _M_check(__pos, "__versa_string::compare");
516*38fd1498Szrj       __n1 = _M_limit(__pos, __n1);
517*38fd1498Szrj       const size_type __osize = traits_type::length(__s);
518*38fd1498Szrj       const size_type __len = std::min(__n1, __osize);
519*38fd1498Szrj       int __r = traits_type::compare(this->_M_data() + __pos, __s, __len);
520*38fd1498Szrj       if (!__r)
521*38fd1498Szrj 	__r = this->_S_compare(__n1, __osize);
522*38fd1498Szrj       return __r;
523*38fd1498Szrj     }
524*38fd1498Szrj 
525*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
526*38fd1498Szrj 	   template <typename, typename, typename> class _Base>
527*38fd1498Szrj     int
528*38fd1498Szrj     __versa_string <_CharT, _Traits, _Alloc, _Base>::
compare(size_type __pos,size_type __n1,const _CharT * __s,size_type __n2) const529*38fd1498Szrj     compare(size_type __pos, size_type __n1, const _CharT* __s,
530*38fd1498Szrj 	    size_type __n2) const
531*38fd1498Szrj     {
532*38fd1498Szrj       __glibcxx_requires_string_len(__s, __n2);
533*38fd1498Szrj       _M_check(__pos, "__versa_string::compare");
534*38fd1498Szrj       __n1 = _M_limit(__pos, __n1);
535*38fd1498Szrj       const size_type __len = std::min(__n1, __n2);
536*38fd1498Szrj       int __r = traits_type::compare(this->_M_data() + __pos, __s, __len);
537*38fd1498Szrj       if (!__r)
538*38fd1498Szrj 	__r = this->_S_compare(__n1, __n2);
539*38fd1498Szrj       return __r;
540*38fd1498Szrj     }
541*38fd1498Szrj 
542*38fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
543*38fd1498Szrj } // namespace
544*38fd1498Szrj 
545*38fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default)
546*38fd1498Szrj {
547*38fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
548*38fd1498Szrj 
549*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
550*38fd1498Szrj            template <typename, typename, typename> class _Base>
551*38fd1498Szrj     basic_istream<_CharT, _Traits>&
operator >>(basic_istream<_CharT,_Traits> & __in,__gnu_cxx::__versa_string<_CharT,_Traits,_Alloc,_Base> & __str)552*38fd1498Szrj     operator>>(basic_istream<_CharT, _Traits>& __in,
553*38fd1498Szrj 	       __gnu_cxx::__versa_string<_CharT, _Traits,
554*38fd1498Szrj 	                                 _Alloc, _Base>& __str)
555*38fd1498Szrj     {
556*38fd1498Szrj       typedef basic_istream<_CharT, _Traits>            __istream_type;
557*38fd1498Szrj       typedef typename __istream_type::ios_base         __ios_base;
558*38fd1498Szrj       typedef __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>
559*38fd1498Szrj 	                                                __string_type;
560*38fd1498Szrj       typedef typename __istream_type::int_type		__int_type;
561*38fd1498Szrj       typedef typename __string_type::size_type		__size_type;
562*38fd1498Szrj       typedef ctype<_CharT>				__ctype_type;
563*38fd1498Szrj       typedef typename __ctype_type::ctype_base         __ctype_base;
564*38fd1498Szrj 
565*38fd1498Szrj       __size_type __extracted = 0;
566*38fd1498Szrj       typename __ios_base::iostate __err = __ios_base::goodbit;
567*38fd1498Szrj       typename __istream_type::sentry __cerb(__in, false);
568*38fd1498Szrj       if (__cerb)
569*38fd1498Szrj 	{
570*38fd1498Szrj 	  __try
571*38fd1498Szrj 	    {
572*38fd1498Szrj 	      // Avoid reallocation for common case.
573*38fd1498Szrj 	      __str.erase();
574*38fd1498Szrj 	      _CharT __buf[128];
575*38fd1498Szrj 	      __size_type __len = 0;
576*38fd1498Szrj 	      const streamsize __w = __in.width();
577*38fd1498Szrj 	      const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
578*38fd1498Szrj 		                              : __str.max_size();
579*38fd1498Szrj 	      const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
580*38fd1498Szrj 	      const __int_type __eof = _Traits::eof();
581*38fd1498Szrj 	      __int_type __c = __in.rdbuf()->sgetc();
582*38fd1498Szrj 
583*38fd1498Szrj 	      while (__extracted < __n
584*38fd1498Szrj 		     && !_Traits::eq_int_type(__c, __eof)
585*38fd1498Szrj 		     && !__ct.is(__ctype_base::space,
586*38fd1498Szrj 				 _Traits::to_char_type(__c)))
587*38fd1498Szrj 		{
588*38fd1498Szrj 		  if (__len == sizeof(__buf) / sizeof(_CharT))
589*38fd1498Szrj 		    {
590*38fd1498Szrj 		      __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
591*38fd1498Szrj 		      __len = 0;
592*38fd1498Szrj 		    }
593*38fd1498Szrj 		  __buf[__len++] = _Traits::to_char_type(__c);
594*38fd1498Szrj 		  ++__extracted;
595*38fd1498Szrj 		  __c = __in.rdbuf()->snextc();
596*38fd1498Szrj 		}
597*38fd1498Szrj 	      __str.append(__buf, __len);
598*38fd1498Szrj 
599*38fd1498Szrj 	      if (_Traits::eq_int_type(__c, __eof))
600*38fd1498Szrj 		__err |= __ios_base::eofbit;
601*38fd1498Szrj 	      __in.width(0);
602*38fd1498Szrj 	    }
603*38fd1498Szrj 	  __catch(__cxxabiv1::__forced_unwind&)
604*38fd1498Szrj 	    {
605*38fd1498Szrj 	      __in._M_setstate(__ios_base::badbit);
606*38fd1498Szrj 	      __throw_exception_again;
607*38fd1498Szrj 	    }
608*38fd1498Szrj 	  __catch(...)
609*38fd1498Szrj 	    {
610*38fd1498Szrj 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
611*38fd1498Szrj 	      // 91. Description of operator>> and getline() for string<>
612*38fd1498Szrj 	      // might cause endless loop
613*38fd1498Szrj 	      __in._M_setstate(__ios_base::badbit);
614*38fd1498Szrj 	    }
615*38fd1498Szrj 	}
616*38fd1498Szrj       // 211.  operator>>(istream&, string&) doesn't set failbit
617*38fd1498Szrj       if (!__extracted)
618*38fd1498Szrj 	__err |= __ios_base::failbit;
619*38fd1498Szrj       if (__err)
620*38fd1498Szrj 	__in.setstate(__err);
621*38fd1498Szrj       return __in;
622*38fd1498Szrj     }
623*38fd1498Szrj 
624*38fd1498Szrj   template<typename _CharT, typename _Traits, typename _Alloc,
625*38fd1498Szrj            template <typename, typename, typename> class _Base>
626*38fd1498Szrj     basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT,_Traits> & __in,__gnu_cxx::__versa_string<_CharT,_Traits,_Alloc,_Base> & __str,_CharT __delim)627*38fd1498Szrj     getline(basic_istream<_CharT, _Traits>& __in,
628*38fd1498Szrj 	    __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str,
629*38fd1498Szrj 	    _CharT __delim)
630*38fd1498Szrj     {
631*38fd1498Szrj       typedef basic_istream<_CharT, _Traits>	        __istream_type;
632*38fd1498Szrj       typedef typename __istream_type::ios_base         __ios_base;
633*38fd1498Szrj       typedef __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>
634*38fd1498Szrj 	                                                __string_type;
635*38fd1498Szrj       typedef typename __istream_type::int_type		__int_type;
636*38fd1498Szrj       typedef typename __string_type::size_type		__size_type;
637*38fd1498Szrj 
638*38fd1498Szrj       __size_type __extracted = 0;
639*38fd1498Szrj       const __size_type __n = __str.max_size();
640*38fd1498Szrj       typename __ios_base::iostate __err = __ios_base::goodbit;
641*38fd1498Szrj       typename __istream_type::sentry __cerb(__in, true);
642*38fd1498Szrj       if (__cerb)
643*38fd1498Szrj 	{
644*38fd1498Szrj 	  __try
645*38fd1498Szrj 	    {
646*38fd1498Szrj 	      // Avoid reallocation for common case.
647*38fd1498Szrj 	      __str.erase();
648*38fd1498Szrj 	      _CharT __buf[128];
649*38fd1498Szrj 	      __size_type __len = 0;
650*38fd1498Szrj 	      const __int_type __idelim = _Traits::to_int_type(__delim);
651*38fd1498Szrj 	      const __int_type __eof = _Traits::eof();
652*38fd1498Szrj 	      __int_type __c = __in.rdbuf()->sgetc();
653*38fd1498Szrj 
654*38fd1498Szrj 	      while (__extracted < __n
655*38fd1498Szrj 		     && !_Traits::eq_int_type(__c, __eof)
656*38fd1498Szrj 		     && !_Traits::eq_int_type(__c, __idelim))
657*38fd1498Szrj 		{
658*38fd1498Szrj 		  if (__len == sizeof(__buf) / sizeof(_CharT))
659*38fd1498Szrj 		    {
660*38fd1498Szrj 		      __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
661*38fd1498Szrj 		      __len = 0;
662*38fd1498Szrj 		    }
663*38fd1498Szrj 		  __buf[__len++] = _Traits::to_char_type(__c);
664*38fd1498Szrj 		  ++__extracted;
665*38fd1498Szrj 		  __c = __in.rdbuf()->snextc();
666*38fd1498Szrj 		}
667*38fd1498Szrj 	      __str.append(__buf, __len);
668*38fd1498Szrj 
669*38fd1498Szrj 	      if (_Traits::eq_int_type(__c, __eof))
670*38fd1498Szrj 		__err |= __ios_base::eofbit;
671*38fd1498Szrj 	      else if (_Traits::eq_int_type(__c, __idelim))
672*38fd1498Szrj 		{
673*38fd1498Szrj 		  ++__extracted;
674*38fd1498Szrj 		  __in.rdbuf()->sbumpc();
675*38fd1498Szrj 		}
676*38fd1498Szrj 	      else
677*38fd1498Szrj 		__err |= __ios_base::failbit;
678*38fd1498Szrj 	    }
679*38fd1498Szrj 	  __catch(__cxxabiv1::__forced_unwind&)
680*38fd1498Szrj 	    {
681*38fd1498Szrj 	      __in._M_setstate(__ios_base::badbit);
682*38fd1498Szrj 	      __throw_exception_again;
683*38fd1498Szrj 	    }
684*38fd1498Szrj 	  __catch(...)
685*38fd1498Szrj 	    {
686*38fd1498Szrj 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
687*38fd1498Szrj 	      // 91. Description of operator>> and getline() for string<>
688*38fd1498Szrj 	      // might cause endless loop
689*38fd1498Szrj 	      __in._M_setstate(__ios_base::badbit);
690*38fd1498Szrj 	    }
691*38fd1498Szrj 	}
692*38fd1498Szrj       if (!__extracted)
693*38fd1498Szrj 	__err |= __ios_base::failbit;
694*38fd1498Szrj       if (__err)
695*38fd1498Szrj 	__in.setstate(__err);
696*38fd1498Szrj       return __in;
697*38fd1498Szrj     }
698*38fd1498Szrj 
699*38fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
700*38fd1498Szrj } // namespace
701*38fd1498Szrj 
702*38fd1498Szrj #endif // _VSTRING_TCC
703