]>
gcc.gnu.org Git - gcc.git/blob - libstdc++/std/bastring.cc
1 // Member templates for the -*- C++ -*- string classes.
2 // Copyright (C) 1994 Free Software Foundation
4 // This file is part of the GNU ANSI C++ Library. This library is free
5 // software; you can redistribute it and/or modify it under the
6 // terms of the GNU General Public License as published by the
7 // Free Software Foundation; either version 2, or (at your option)
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this library; see the file COPYING. If not, write to the Free
17 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 // As a special exception, if you link this library with files
20 // compiled with a GNU compiler to produce an executable, this does not cause
21 // the resulting executable to be covered by the GNU General Public License.
22 // This exception does not however invalidate any other reasons why
23 // the executable file might be covered by the GNU General Public License.
25 // Written by Jason Merrill based upon the specification by Takanori Adachi
26 // in ANSI X3J16/94-0013R2.
29 template <class charT
, class traits
, class Allocator
>
30 inline void * basic_string
<charT
, traits
, Allocator
>::Rep::
31 operator new (size_t s
, size_t extra
)
33 return Allocator::allocate(s
+ extra
* sizeof (charT
));
36 template <class charT
, class traits
, class Allocator
>
37 inline void basic_string
<charT
, traits
, Allocator
>::Rep::
38 operator delete (void * ptr
)
40 Allocator::deallocate(ptr
, sizeof(Rep
) +
41 reinterpret_cast<Rep
*>(ptr
)->res
*
45 template <class charT
, class traits
, class Allocator
>
46 inline size_t basic_string
<charT
, traits
, Allocator
>::Rep::
54 template <class charT
, class traits
, class Allocator
>
55 inline basic_string
<charT
, traits
, Allocator
>::Rep
*
56 basic_string
<charT
, traits
, Allocator
>::Rep::
59 extra
= frob_size (extra
+ 1);
60 Rep
*p
= new (extra
) Rep
;
67 template <class charT
, class traits
, class Allocator
>
68 charT
* basic_string
<charT
, traits
, Allocator
>::Rep::
71 Rep
*p
= Rep::create (len
);
72 p
->copy (0, data (), len
);
77 template <class charT
, class traits
, class Allocator
>
78 inline bool basic_string
<charT
, traits
, Allocator
>::Rep::
79 excess_slop (size_t s
, size_t r
)
81 return 2 * (s
<= 16 ? 16 : s
) < r
;
84 template <class charT
, class traits
, class Allocator
>
85 inline bool basic_string
<charT
, traits
, Allocator
>::
86 check_realloc (basic_string::size_type s
) const
89 rep ()->selfish
= false;
90 return (rep ()->ref
> 1
92 || Rep::excess_slop (s
, capacity ()));
95 template <class charT
, class traits
, class Allocator
>
96 void basic_string
<charT
, traits
, Allocator
>::
97 alloc (basic_string::size_type size
, bool save
)
99 if (! check_realloc (size
))
102 Rep
*p
= Rep::create (size
);
106 p
->copy (0, data (), length ());
115 template <class charT
, class traits
, class Allocator
>
116 basic_string
<charT
, traits
, Allocator
>&
117 basic_string
<charT
, traits
, Allocator
>::
118 replace (size_type pos1
, size_type n1
,
119 const basic_string
& str
, size_type pos2
, size_type n2
)
121 const size_t len2
= str
.length ();
123 if (pos1
== 0 && n1
>= length () && pos2
== 0 && n2
>= len2
)
124 return operator= (str
);
126 OUTOFRANGE (pos2
> len2
);
128 if (n2
> len2
- pos2
)
131 return replace (pos1
, n1
, str
.data () + pos2
, n2
);
134 template <class charT
, class traits
, class Allocator
>
135 inline void basic_string
<charT
, traits
, Allocator
>::Rep::
136 copy (size_t pos
, const charT
*s
, size_t n
)
139 traits::copy (data () + pos
, s
, n
);
142 template <class charT
, class traits
, class Allocator
>
143 inline void basic_string
<charT
, traits
, Allocator
>::Rep::
144 move (size_t pos
, const charT
*s
, size_t n
)
147 traits::move (data () + pos
, s
, n
);
150 template <class charT
, class traits
, class Allocator
>
151 basic_string
<charT
, traits
, Allocator
>&
152 basic_string
<charT
, traits
, Allocator
>::
153 replace (size_type pos
, size_type n1
, const charT
* s
, size_type n2
)
155 const size_type len
= length ();
156 OUTOFRANGE (pos
> len
);
159 LENGTHERROR (len
- n1
> max_size () - n2
);
160 size_t newlen
= len
- n1
+ n2
;
162 if (check_realloc (newlen
))
164 Rep
*p
= Rep::create (newlen
);
165 p
->copy (0, data (), pos
);
166 p
->copy (pos
+ n2
, data () + pos
+ n1
, len
- (pos
+ n1
));
167 p
->copy (pos
, s
, n2
);
172 rep ()->move (pos
+ n2
, data () + pos
+ n1
, len
- (pos
+ n1
));
173 rep ()->copy (pos
, s
, n2
);
175 rep ()->len
= newlen
;
180 template <class charT
, class traits
, class Allocator
>
181 inline void basic_string
<charT
, traits
, Allocator
>::Rep::
182 set (size_t pos
, const charT c
, size_t n
)
184 traits::set (data () + pos
, c
, n
);
187 template <class charT
, class traits
, class Allocator
>
188 basic_string
<charT
, traits
, Allocator
>& basic_string
<charT
, traits
, Allocator
>::
189 replace (size_type pos
, size_type n1
, size_type n2
, charT c
)
191 const size_t len
= length ();
192 OUTOFRANGE (pos
> len
);
195 LENGTHERROR (len
- n1
> max_size () - n2
);
196 size_t newlen
= len
- n1
+ n2
;
198 if (check_realloc (newlen
))
200 Rep
*p
= Rep::create (newlen
);
201 p
->copy (0, data (), pos
);
202 p
->copy (pos
+ n2
, data () + pos
+ n1
, len
- (pos
+ n1
));
208 rep ()->move (pos
+ n2
, data () + pos
+ n1
, len
- (pos
+ n1
));
209 rep ()->set (pos
, c
, n2
);
211 rep ()->len
= newlen
;
216 template <class charT
, class traits
, class Allocator
>
217 void basic_string
<charT
, traits
, Allocator
>::
218 resize (size_type n
, charT c
)
220 LENGTHERROR (n
> max_size ());
223 append (n
- length (), c
);
228 template <class charT
, class traits
, class Allocator
>
229 basic_string
<charT
, traits
, Allocator
>::size_type
230 basic_string
<charT
, traits
, Allocator
>::
231 copy (charT
* s
, size_type n
, size_type pos
)
233 OUTOFRANGE (pos
> length ());
235 if (n
> length () - pos
)
238 traits::copy (s
, data () + pos
, n
);
242 template <class charT
, class traits
, class Allocator
>
243 basic_string
<charT
, traits
, Allocator
>::size_type
244 basic_string
<charT
, traits
, Allocator
>::
245 find (const charT
* s
, size_type pos
, size_type n
) const
248 for (; xpos
+ n
<= length (); ++xpos
)
249 if (traits::eq (data () [xpos
], *s
)
250 && traits::compare (data () + xpos
, s
, n
) == 0)
255 template <class charT
, class traits
, class Allocator
>
256 inline basic_string
<charT
, traits
, Allocator
>::size_type
257 basic_string
<charT
, traits
, Allocator
>::
258 _find (const charT
* ptr
, charT c
, size_type xpos
, size_type len
)
260 for (; xpos
< len
; ++xpos
)
261 if (traits::eq (ptr
[xpos
], c
))
266 template <class charT
, class traits
, class Allocator
>
267 basic_string
<charT
, traits
, Allocator
>::size_type
268 basic_string
<charT
, traits
, Allocator
>::
269 find (charT c
, size_type pos
) const
271 return _find (data (), c
, pos
, length ());
274 template <class charT
, class traits
, class Allocator
>
275 basic_string
<charT
, traits
, Allocator
>::size_type
276 basic_string
<charT
, traits
, Allocator
>::
277 rfind (const charT
* s
, size_type pos
, size_type n
) const
282 size_t xpos
= length () - n
;
286 for (++xpos
; xpos
-- > 0; )
287 if (traits::eq (data () [xpos
], *s
)
288 && traits::compare (data () + xpos
, s
, n
) == 0)
293 template <class charT
, class traits
, class Allocator
>
294 basic_string
<charT
, traits
, Allocator
>::size_type
295 basic_string
<charT
, traits
, Allocator
>::
296 rfind (charT c
, size_type pos
) const
301 size_t xpos
= length () - 1;
305 for (++xpos
; xpos
-- > 0; )
306 if (traits::eq (data () [xpos
], c
))
311 template <class charT
, class traits
, class Allocator
>
312 basic_string
<charT
, traits
, Allocator
>::size_type
313 basic_string
<charT
, traits
, Allocator
>::
314 find_first_of (const charT
* s
, size_type pos
, size_type n
) const
317 for (; xpos
< length (); ++xpos
)
318 if (_find (s
, data () [xpos
], 0, n
) != npos
)
323 template <class charT
, class traits
, class Allocator
>
324 basic_string
<charT
, traits
, Allocator
>::size_type
325 basic_string
<charT
, traits
, Allocator
>::
326 find_last_of (const charT
* s
, size_type pos
, size_type n
) const
328 size_t xpos
= length () - 1;
332 if (_find (s
, data () [xpos
], 0, n
) != npos
)
337 template <class charT
, class traits
, class Allocator
>
338 basic_string
<charT
, traits
, Allocator
>::size_type
339 basic_string
<charT
, traits
, Allocator
>::
340 find_first_not_of (const charT
* s
, size_type pos
, size_type n
) const
343 for (; xpos
< length (); ++xpos
)
344 if (_find (s
, data () [xpos
], 0, n
) == npos
)
349 template <class charT
, class traits
, class Allocator
>
350 basic_string
<charT
, traits
, Allocator
>::size_type
351 basic_string
<charT
, traits
, Allocator
>::
352 find_first_not_of (charT c
, size_type pos
) const
355 for (; xpos
< length (); ++xpos
)
356 if (traits::ne (data () [xpos
], c
))
361 template <class charT
, class traits
, class Allocator
>
362 basic_string
<charT
, traits
, Allocator
>::size_type
363 basic_string
<charT
, traits
, Allocator
>::
364 find_last_not_of (const charT
* s
, size_type pos
, size_type n
) const
366 size_t xpos
= length () - 1;
370 if (_find (s
, data () [xpos
], 0, n
) == npos
)
375 template <class charT
, class traits
, class Allocator
>
376 basic_string
<charT
, traits
, Allocator
>::size_type
377 basic_string
<charT
, traits
, Allocator
>::
378 find_last_not_of (charT c
, size_type pos
) const
380 size_t xpos
= length () - 1;
384 if (traits::ne (data () [xpos
], c
))
389 template <class charT
, class traits
, class Allocator
>
390 int basic_string
<charT
, traits
, Allocator
>::
391 compare (const basic_string
& str
, size_type pos
, size_type n
) const
393 OUTOFRANGE (pos
> length ());
395 size_t rlen
= length () - pos
;
398 if (rlen
> str
.length ())
399 rlen
= str
.length ();
400 int r
= traits::compare (data () + pos
, str
.data (), rlen
);
405 return (length () - pos
) - str
.length ();
408 template <class charT
, class traits
, class Allocator
>
409 int basic_string
<charT
, traits
, Allocator
>::
410 compare (const charT
* s
, size_type pos
, size_type n
) const
412 OUTOFRANGE (pos
> length ());
414 size_t rlen
= length () - pos
;
417 int r
= traits::compare (data () + pos
, s
, rlen
);
420 return (length () - pos
) - n
;
423 #include <iostream.h>
425 template <class charT
, class traits
, class Allocator
>
427 operator>> (istream
&is
, basic_string
<charT
, traits
, Allocator
> &s
)
429 int w
= is
.width (0);
432 register streambuf
*sb
= is
.rdbuf ();
436 int ch
= sb
->sbumpc ();
439 is
.setstate (ios::eofbit
);
442 else if (traits::is_del (ch
))
454 if (s
.length () == 0)
455 is
.setstate (ios::failbit
);
460 template <class charT
, class traits
, class Allocator
>
462 operator<< (ostream
&o
, const basic_string
<charT
, traits
, Allocator
>& s
)
464 return o
.write (s
.data (), s
.length ());
467 template <class charT
, class traits
, class Allocator
>
469 getline (istream
&is
, basic_string
<charT
, traits
, Allocator
>& s
, charT delim
)
473 _IO_size_t count
= 0;
474 streambuf
*sb
= is
.rdbuf ();
479 int ch
= sb
->sbumpc ();
482 is
.setstate (count
== 0
483 ? (ios::failbit
|ios::eofbit
)
495 if (s
.length () == s
.npos
- 1)
497 is
.setstate (ios::failbit
);
503 // We need to be friends with istream to do this.
504 // is._gcount = count;
510 template <class charT
, class traits
, class Allocator
>
511 basic_string
<charT
, traits
, Allocator
>::Rep
512 basic_string
<charT
, traits
, Allocator
>::nilRep
= { 0, 0, 1, false };
514 template <class charT
, class traits
, class Allocator
>
515 const basic_string
<charT
, traits
, Allocator
>::size_type
516 basic_string
<charT
, traits
, Allocator
>::npos
;
This page took 0.064022 seconds and 5 git commands to generate.