annotate libstdc++-v3/include/ext/vstring.tcc @ 158:494b0b89df80 default tip

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