OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libstdc++-v3/] [include/] [ext/] [vstring.h] - Blame information for rev 775

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 742 jeremybenn
// Versatile string -*- C++ -*-
2
 
3
// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
4
// Free Software Foundation, Inc.
5
//
6
// This file is part of the GNU ISO C++ Library.  This library is free
7
// software; you can redistribute it and/or modify it under the
8
// terms of the GNU General Public License as published by the
9
// Free Software Foundation; either version 3, or (at your option)
10
// any later version.
11
 
12
// This library is distributed in the hope that it will be useful,
13
// but WITHOUT ANY WARRANTY; without even the implied warranty of
14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
// GNU General Public License for more details.
16
 
17
// Under Section 7 of GPL version 3, you are granted additional
18
// permissions described in the GCC Runtime Library Exception, version
19
// 3.1, as published by the Free Software Foundation.
20
 
21
// You should have received a copy of the GNU General Public License and
22
// a copy of the GCC Runtime Library Exception along with this program;
23
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24
// <http://www.gnu.org/licenses/>.
25
 
26
/** @file ext/vstring.h
27
 *  This file is a GNU extension to the Standard C++ Library.
28
 */
29
 
30
#ifndef _VSTRING_H
31
#define _VSTRING_H 1
32
 
33
#pragma GCC system_header
34
 
35
#ifdef __GXX_EXPERIMENTAL_CXX0X__
36
#include <initializer_list>
37
#endif
38
 
39
#include <ext/vstring_util.h>
40
#include <ext/rc_string_base.h>
41
#include <ext/sso_string_base.h>
42
 
43
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
44
{
45
_GLIBCXX_BEGIN_NAMESPACE_VERSION
46
 
47
  /**
48
   *  @class __versa_string vstring.h
49
   *  @brief  Template class __versa_string.
50
   *  @ingroup extensions
51
   *
52
   *  Data structure managing sequences of characters and
53
   *  character-like objects.
54
   */
55
  template<typename _CharT, typename _Traits, typename _Alloc,
56
           template <typename, typename, typename> class _Base>
57
    class __versa_string
58
    : private _Base<_CharT, _Traits, _Alloc>
59
    {
60
      typedef _Base<_CharT, _Traits, _Alloc>                __vstring_base;
61
      typedef typename __vstring_base::_CharT_alloc_type    _CharT_alloc_type;
62
 
63
      // Types:
64
    public:
65
      typedef _Traits                                       traits_type;
66
      typedef typename _Traits::char_type                   value_type;
67
      typedef _Alloc                                        allocator_type;
68
      typedef typename _CharT_alloc_type::size_type         size_type;
69
      typedef typename _CharT_alloc_type::difference_type   difference_type;
70
      typedef value_type&                                   reference;
71
      typedef const value_type&                             const_reference;
72
      typedef typename _CharT_alloc_type::pointer           pointer;
73
      typedef typename _CharT_alloc_type::const_pointer     const_pointer;
74
      typedef __gnu_cxx::__normal_iterator<pointer, __versa_string>  iterator;
75
      typedef __gnu_cxx::__normal_iterator<const_pointer, __versa_string>
76
                                                            const_iterator;
77
      typedef std::reverse_iterator<const_iterator>     const_reverse_iterator;
78
      typedef std::reverse_iterator<iterator>               reverse_iterator;
79
 
80
      // Data Member (public):
81
      ///  Value returned by various member functions when they fail.
82
      static const size_type    npos = static_cast<size_type>(-1);
83
 
84
    private:
85
      size_type
86
      _M_check(size_type __pos, const char* __s) const
87
      {
88
        if (__pos > this->size())
89
          std::__throw_out_of_range(__N(__s));
90
        return __pos;
91
      }
92
 
93
      void
94
      _M_check_length(size_type __n1, size_type __n2, const char* __s) const
95
      {
96
        if (this->max_size() - (this->size() - __n1) < __n2)
97
          std::__throw_length_error(__N(__s));
98
      }
99
 
100
      // NB: _M_limit doesn't check for a bad __pos value.
101
      size_type
102
      _M_limit(size_type __pos, size_type __off) const
103
      {
104
        const bool __testoff =  __off < this->size() - __pos;
105
        return __testoff ? __off : this->size() - __pos;
106
      }
107
 
108
      // True if _Rep and source do not overlap.
109
      bool
110
      _M_disjunct(const _CharT* __s) const
111
      {
112
        return (std::less<const _CharT*>()(__s, this->_M_data())
113
                || std::less<const _CharT*>()(this->_M_data()
114
                                              + this->size(), __s));
115
      }
116
 
117
      // For the internal use we have functions similar to `begin'/`end'
118
      // but they do not call _M_leak.
119
      iterator
120
      _M_ibegin() const
121
      { return iterator(this->_M_data()); }
122
 
123
      iterator
124
      _M_iend() const
125
      { return iterator(this->_M_data() + this->_M_length()); }
126
 
127
    public:
128
      // Construct/copy/destroy:
129
      // NB: We overload ctors in some cases instead of using default
130
      // arguments, per 17.4.4.4 para. 2 item 2.
131
 
132
      /**
133
       *  @brief  Default constructor creates an empty string.
134
       */
135
      __versa_string()
136
      : __vstring_base() { }
137
 
138
      /**
139
       *  @brief  Construct an empty string using allocator @a a.
140
       */
141
      explicit
142
      __versa_string(const _Alloc& __a)
143
      : __vstring_base(__a) { }
144
 
145
      // NB: per LWG issue 42, semantics different from IS:
146
      /**
147
       *  @brief  Construct string with copy of value of @a __str.
148
       *  @param  __str  Source string.
149
       */
150
      __versa_string(const __versa_string& __str)
151
      : __vstring_base(__str) { }
152
 
153
#ifdef __GXX_EXPERIMENTAL_CXX0X__
154
      /**
155
       *  @brief  String move constructor.
156
       *  @param  __str  Source string.
157
       *
158
       *  The newly-constructed %string contains the exact contents of
159
       *  @a __str.  The contents of @a __str are a valid, but unspecified
160
       *  string.
161
       */
162
      __versa_string(__versa_string&& __str) noexcept
163
      : __vstring_base(std::move(__str)) { }
164
 
165
      /**
166
       *  @brief  Construct string from an initializer list.
167
       *  @param  __l  std::initializer_list of characters.
168
       *  @param  __a  Allocator to use (default is default allocator).
169
       */
170
      __versa_string(std::initializer_list<_CharT> __l,
171
                     const _Alloc& __a = _Alloc())
172
      : __vstring_base(__l.begin(), __l.end(), __a) { }
173
#endif
174
 
175
      /**
176
       *  @brief  Construct string as copy of a substring.
177
       *  @param  __str  Source string.
178
       *  @param  __pos  Index of first character to copy from.
179
       *  @param  __n  Number of characters to copy (default remainder).
180
       */
181
      __versa_string(const __versa_string& __str, size_type __pos,
182
                     size_type __n = npos)
183
      : __vstring_base(__str._M_data()
184
                       + __str._M_check(__pos,
185
                                        "__versa_string::__versa_string"),
186
                       __str._M_data() + __str._M_limit(__pos, __n)
187
                       + __pos, _Alloc()) { }
188
 
189
      /**
190
       *  @brief  Construct string as copy of a substring.
191
       *  @param  __str  Source string.
192
       *  @param  __pos  Index of first character to copy from.
193
       *  @param  __n  Number of characters to copy.
194
       *  @param  __a  Allocator to use.
195
       */
196
      __versa_string(const __versa_string& __str, size_type __pos,
197
                     size_type __n, const _Alloc& __a)
198
      : __vstring_base(__str._M_data()
199
                       + __str._M_check(__pos,
200
                                        "__versa_string::__versa_string"),
201
                       __str._M_data() + __str._M_limit(__pos, __n)
202
                       + __pos, __a) { }
203
 
204
      /**
205
       *  @brief  Construct string initialized by a character array.
206
       *  @param  __s  Source character array.
207
       *  @param  __n  Number of characters to copy.
208
       *  @param  __a  Allocator to use (default is default allocator).
209
       *
210
       *  NB: @a __s must have at least @a __n characters, '\\0' has no special
211
       *  meaning.
212
       */
213
      __versa_string(const _CharT* __s, size_type __n,
214
                     const _Alloc& __a = _Alloc())
215
      : __vstring_base(__s, __s + __n, __a) { }
216
 
217
      /**
218
       *  @brief  Construct string as copy of a C string.
219
       *  @param  __s  Source C string.
220
       *  @param  __a  Allocator to use (default is default allocator).
221
       */
222
      __versa_string(const _CharT* __s, const _Alloc& __a = _Alloc())
223
      : __vstring_base(__s, __s ? __s + traits_type::length(__s) :
224
                       __s + npos, __a) { }
225
 
226
      /**
227
       *  @brief  Construct string as multiple characters.
228
       *  @param  __n  Number of characters.
229
       *  @param  __c  Character to use.
230
       *  @param  __a  Allocator to use (default is default allocator).
231
       */
232
      __versa_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
233
      : __vstring_base(__n, __c, __a) { }
234
 
235
      /**
236
       *  @brief  Construct string as copy of a range.
237
       *  @param  __beg  Start of range.
238
       *  @param  __end  End of range.
239
       *  @param  __a  Allocator to use (default is default allocator).
240
       */
241
      template<class _InputIterator>
242
        __versa_string(_InputIterator __beg, _InputIterator __end,
243
                       const _Alloc& __a = _Alloc())
244
        : __vstring_base(__beg, __end, __a) { }
245
 
246
      /**
247
       *  @brief  Destroy the string instance.
248
       */
249
      ~__versa_string() _GLIBCXX_NOEXCEPT { }
250
 
251
      /**
252
       *  @brief  Assign the value of @a str to this string.
253
       *  @param  __str  Source string.
254
       */
255
      __versa_string&
256
      operator=(const __versa_string& __str)
257
      { return this->assign(__str); }
258
 
259
#ifdef __GXX_EXPERIMENTAL_CXX0X__
260
      /**
261
       *  @brief  String move assignment operator.
262
       *  @param  __str  Source string.
263
       *
264
       *  The contents of @a __str are moved into this string (without
265
       *  copying).  @a __str is a valid, but unspecified string.
266
       */
267
      __versa_string&
268
      operator=(__versa_string&& __str)
269
      {
270
        // NB: DR 1204.
271
        this->swap(__str);
272
        return *this;
273
      }
274
 
275
      /**
276
       *  @brief  Set value to string constructed from initializer list.
277
       *  @param  __l  std::initializer_list.
278
       */
279
      __versa_string&
280
      operator=(std::initializer_list<_CharT> __l)
281
      {
282
        this->assign(__l.begin(), __l.end());
283
        return *this;
284
      }
285
#endif
286
 
287
      /**
288
       *  @brief  Copy contents of @a __s into this string.
289
       *  @param  __s  Source null-terminated string.
290
       */
291
      __versa_string&
292
      operator=(const _CharT* __s)
293
      { return this->assign(__s); }
294
 
295
      /**
296
       *  @brief  Set value to string of length 1.
297
       *  @param  __c  Source character.
298
       *
299
       *  Assigning to a character makes this string length 1 and
300
       *  (*this)[0] == @a __c.
301
       */
302
      __versa_string&
303
      operator=(_CharT __c)
304
      {
305
        this->assign(1, __c);
306
        return *this;
307
      }
308
 
309
      // Iterators:
310
      /**
311
       *  Returns a read/write iterator that points to the first character in
312
       *  the %string.  Unshares the string.
313
       */
314
      iterator
315
      begin() _GLIBCXX_NOEXCEPT
316
      {
317
        this->_M_leak();
318
        return iterator(this->_M_data());
319
      }
320
 
321
      /**
322
       *  Returns a read-only (constant) iterator that points to the first
323
       *  character in the %string.
324
       */
325
      const_iterator
326
      begin() const _GLIBCXX_NOEXCEPT
327
      { return const_iterator(this->_M_data()); }
328
 
329
      /**
330
       *  Returns a read/write iterator that points one past the last
331
       *  character in the %string.  Unshares the string.
332
       */
333
      iterator
334
      end() _GLIBCXX_NOEXCEPT
335
      {
336
        this->_M_leak();
337
        return iterator(this->_M_data() + this->size());
338
      }
339
 
340
      /**
341
       *  Returns a read-only (constant) iterator that points one past the
342
       *  last character in the %string.
343
       */
344
      const_iterator
345
      end() const _GLIBCXX_NOEXCEPT
346
      { return const_iterator(this->_M_data() + this->size()); }
347
 
348
      /**
349
       *  Returns a read/write reverse iterator that points to the last
350
       *  character in the %string.  Iteration is done in reverse element
351
       *  order.  Unshares the string.
352
       */
353
      reverse_iterator
354
      rbegin() _GLIBCXX_NOEXCEPT
355
      { return reverse_iterator(this->end()); }
356
 
357
      /**
358
       *  Returns a read-only (constant) reverse iterator that points
359
       *  to the last character in the %string.  Iteration is done in
360
       *  reverse element order.
361
       */
362
      const_reverse_iterator
363
      rbegin() const _GLIBCXX_NOEXCEPT
364
      { return const_reverse_iterator(this->end()); }
365
 
366
      /**
367
       *  Returns a read/write reverse iterator that points to one before the
368
       *  first character in the %string.  Iteration is done in reverse
369
       *  element order.  Unshares the string.
370
       */
371
      reverse_iterator
372
      rend() _GLIBCXX_NOEXCEPT
373
      { return reverse_iterator(this->begin()); }
374
 
375
      /**
376
       *  Returns a read-only (constant) reverse iterator that points
377
       *  to one before the first character in the %string.  Iteration
378
       *  is done in reverse element order.
379
       */
380
      const_reverse_iterator
381
      rend() const _GLIBCXX_NOEXCEPT
382
      { return const_reverse_iterator(this->begin()); }
383
 
384
#ifdef __GXX_EXPERIMENTAL_CXX0X__
385
      /**
386
       *  Returns a read-only (constant) iterator that points to the first
387
       *  character in the %string.
388
       */
389
      const_iterator
390
      cbegin() const noexcept
391
      { return const_iterator(this->_M_data()); }
392
 
393
      /**
394
       *  Returns a read-only (constant) iterator that points one past the
395
       *  last character in the %string.
396
       */
397
      const_iterator
398
      cend() const noexcept
399
      { return const_iterator(this->_M_data() + this->size()); }
400
 
401
      /**
402
       *  Returns a read-only (constant) reverse iterator that points
403
       *  to the last character in the %string.  Iteration is done in
404
       *  reverse element order.
405
       */
406
      const_reverse_iterator
407
      crbegin() const noexcept
408
      { return const_reverse_iterator(this->end()); }
409
 
410
      /**
411
       *  Returns a read-only (constant) reverse iterator that points
412
       *  to one before the first character in the %string.  Iteration
413
       *  is done in reverse element order.
414
       */
415
      const_reverse_iterator
416
      crend() const noexcept
417
      { return const_reverse_iterator(this->begin()); }
418
#endif
419
 
420
    public:
421
      // Capacity:
422
      ///  Returns the number of characters in the string, not including any
423
      ///  null-termination.
424
      size_type
425
      size() const _GLIBCXX_NOEXCEPT
426
      { return this->_M_length(); }
427
 
428
      ///  Returns the number of characters in the string, not including any
429
      ///  null-termination.
430
      size_type
431
      length() const _GLIBCXX_NOEXCEPT
432
      { return this->_M_length(); }
433
 
434
      /// Returns the size() of the largest possible %string.
435
      size_type
436
      max_size() const _GLIBCXX_NOEXCEPT
437
      { return this->_M_max_size(); }
438
 
439
      /**
440
       *  @brief  Resizes the %string to the specified number of characters.
441
       *  @param  __n  Number of characters the %string should contain.
442
       *  @param  __c  Character to fill any new elements.
443
       *
444
       *  This function will %resize the %string to the specified
445
       *  number of characters.  If the number is smaller than the
446
       *  %string's current size the %string is truncated, otherwise
447
       *  the %string is extended and new elements are set to @a __c.
448
       */
449
      void
450
      resize(size_type __n, _CharT __c);
451
 
452
      /**
453
       *  @brief  Resizes the %string to the specified number of characters.
454
       *  @param  __n  Number of characters the %string should contain.
455
       *
456
       *  This function will resize the %string to the specified
457
       *  length.  If the new size is smaller than the %string's
458
       *  current size the %string is truncated, otherwise the %string
459
       *  is extended and new characters are default-constructed.  For
460
       *  basic types such as char, this means setting them to 0.
461
       */
462
      void
463
      resize(size_type __n)
464
      { this->resize(__n, _CharT()); }
465
 
466
#ifdef __GXX_EXPERIMENTAL_CXX0X__
467
      /// A non-binding request to reduce capacity() to size().
468
      void
469
      shrink_to_fit()
470
      {
471
        if (capacity() > size())
472
          {
473
            __try
474
              { this->reserve(0); }
475
            __catch(...)
476
              { }
477
          }
478
      }
479
#endif
480
 
481
      /**
482
       *  Returns the total number of characters that the %string can
483
       *  hold before needing to allocate more memory.
484
       */
485
      size_type
486
      capacity() const _GLIBCXX_NOEXCEPT
487
      { return this->_M_capacity(); }
488
 
489
      /**
490
       *  @brief  Attempt to preallocate enough memory for specified number of
491
       *          characters.
492
       *  @param  __res_arg  Number of characters required.
493
       *  @throw  std::length_error  If @a __res_arg exceeds @c max_size().
494
       *
495
       *  This function attempts to reserve enough memory for the
496
       *  %string to hold the specified number of characters.  If the
497
       *  number requested is more than max_size(), length_error is
498
       *  thrown.
499
       *
500
       *  The advantage of this function is that if optimal code is a
501
       *  necessity and the user can determine the string length that
502
       *  will be required, the user can reserve the memory in
503
       *  %advance, and thus prevent a possible reallocation of memory
504
       *  and copying of %string data.
505
       */
506
      void
507
      reserve(size_type __res_arg = 0)
508
      { this->_M_reserve(__res_arg); }
509
 
510
      /**
511
       *  Erases the string, making it empty.
512
       */
513
      void
514
      clear() _GLIBCXX_NOEXCEPT
515
      { this->_M_clear(); }
516
 
517
      /**
518
       *  Returns true if the %string is empty.  Equivalent to
519
       *  <code>*this == ""</code>.
520
       */
521
      bool
522
      empty() const _GLIBCXX_NOEXCEPT
523
      { return this->size() == 0; }
524
 
525
      // Element access:
526
      /**
527
       *  @brief  Subscript access to the data contained in the %string.
528
       *  @param  __pos  The index of the character to access.
529
       *  @return  Read-only (constant) reference to the character.
530
       *
531
       *  This operator allows for easy, array-style, data access.
532
       *  Note that data access with this operator is unchecked and
533
       *  out_of_range lookups are not defined. (For checked lookups
534
       *  see at().)
535
       */
536
      const_reference
537
      operator[] (size_type __pos) const
538
      {
539
        _GLIBCXX_DEBUG_ASSERT(__pos <= this->size());
540
        return this->_M_data()[__pos];
541
      }
542
 
543
      /**
544
       *  @brief  Subscript access to the data contained in the %string.
545
       *  @param  __pos  The index of the character to access.
546
       *  @return  Read/write reference to the character.
547
       *
548
       *  This operator allows for easy, array-style, data access.
549
       *  Note that data access with this operator is unchecked and
550
       *  out_of_range lookups are not defined. (For checked lookups
551
       *  see at().)  Unshares the string.
552
       */
553
      reference
554
      operator[](size_type __pos)
555
      {
556
        // allow pos == size() as v3 extension:
557
        _GLIBCXX_DEBUG_ASSERT(__pos <= this->size());
558
        // but be strict in pedantic mode:
559
        _GLIBCXX_DEBUG_PEDASSERT(__pos < this->size());
560
        this->_M_leak();
561
        return this->_M_data()[__pos];
562
      }
563
 
564
      /**
565
       *  @brief  Provides access to the data contained in the %string.
566
       *  @param __n The index of the character to access.
567
       *  @return  Read-only (const) reference to the character.
568
       *  @throw  std::out_of_range  If @a __n is an invalid index.
569
       *
570
       *  This function provides for safer data access.  The parameter
571
       *  is first checked that it is in the range of the string.  The
572
       *  function throws out_of_range if the check fails.
573
       */
574
      const_reference
575
      at(size_type __n) const
576
      {
577
        if (__n >= this->size())
578
          std::__throw_out_of_range(__N("__versa_string::at"));
579
        return this->_M_data()[__n];
580
      }
581
 
582
      /**
583
       *  @brief  Provides access to the data contained in the %string.
584
       *  @param __n The index of the character to access.
585
       *  @return  Read/write reference to the character.
586
       *  @throw  std::out_of_range  If @a __n is an invalid index.
587
       *
588
       *  This function provides for safer data access.  The parameter
589
       *  is first checked that it is in the range of the string.  The
590
       *  function throws out_of_range if the check fails.  Success
591
       *  results in unsharing the string.
592
       */
593
      reference
594
      at(size_type __n)
595
      {
596
        if (__n >= this->size())
597
          std::__throw_out_of_range(__N("__versa_string::at"));
598
        this->_M_leak();
599
        return this->_M_data()[__n];
600
      }
601
 
602
#ifdef __GXX_EXPERIMENTAL_CXX0X__
603
      /**
604
       *  Returns a read/write reference to the data at the first
605
       *  element of the %string.
606
       */
607
      reference
608
      front()
609
      { return operator[](0); }
610
 
611
      /**
612
       *  Returns a read-only (constant) reference to the data at the first
613
       *  element of the %string.
614
       */
615
      const_reference
616
      front() const
617
      { return operator[](0); }
618
 
619
      /**
620
       *  Returns a read/write reference to the data at the last
621
       *  element of the %string.
622
       */
623
      reference
624
      back()
625
      { return operator[](this->size() - 1); }
626
 
627
      /**
628
       *  Returns a read-only (constant) reference to the data at the
629
       *  last element of the %string.
630
       */
631
      const_reference
632
      back() const
633
      { return operator[](this->size() - 1); }
634
#endif
635
 
636
      // Modifiers:
637
      /**
638
       *  @brief  Append a string to this string.
639
       *  @param __str  The string to append.
640
       *  @return  Reference to this string.
641
       */
642
      __versa_string&
643
      operator+=(const __versa_string& __str)
644
      { return this->append(__str); }
645
 
646
      /**
647
       *  @brief  Append a C string.
648
       *  @param __s  The C string to append.
649
       *  @return  Reference to this string.
650
       */
651
      __versa_string&
652
      operator+=(const _CharT* __s)
653
      { return this->append(__s); }
654
 
655
      /**
656
       *  @brief  Append a character.
657
       *  @param __c  The character to append.
658
       *  @return  Reference to this string.
659
       */
660
      __versa_string&
661
      operator+=(_CharT __c)
662
      {
663
        this->push_back(__c);
664
        return *this;
665
      }
666
 
667
#ifdef __GXX_EXPERIMENTAL_CXX0X__
668
      /**
669
       *  @brief  Append an initializer_list of characters.
670
       *  @param __l  The initializer_list of characters to be appended.
671
       *  @return  Reference to this string.
672
       */
673
      __versa_string&
674
      operator+=(std::initializer_list<_CharT> __l)
675
      { return this->append(__l.begin(), __l.end()); }
676
#endif // __GXX_EXPERIMENTAL_CXX0X__
677
 
678
      /**
679
       *  @brief  Append a string to this string.
680
       *  @param __str  The string to append.
681
       *  @return  Reference to this string.
682
       */
683
      __versa_string&
684
      append(const __versa_string& __str)
685
      { return _M_append(__str._M_data(), __str.size()); }
686
 
687
      /**
688
       *  @brief  Append a substring.
689
       *  @param __str  The string to append.
690
       *  @param __pos  Index of the first character of str to append.
691
       *  @param __n  The number of characters to append.
692
       *  @return  Reference to this string.
693
       *  @throw  std::out_of_range if @a pos is not a valid index.
694
       *
695
       *  This function appends @a __n characters from @a __str
696
       *  starting at @a __pos to this string.  If @a __n is is larger
697
       *  than the number of available characters in @a __str, the
698
       *  remainder of @a __str is appended.
699
       */
700
      __versa_string&
701
      append(const __versa_string& __str, size_type __pos, size_type __n)
702
      { return _M_append(__str._M_data()
703
                         + __str._M_check(__pos, "__versa_string::append"),
704
                         __str._M_limit(__pos, __n)); }
705
 
706
      /**
707
       *  @brief  Append a C substring.
708
       *  @param __s  The C string to append.
709
       *  @param __n  The number of characters to append.
710
       *  @return  Reference to this string.
711
       */
712
      __versa_string&
713
      append(const _CharT* __s, size_type __n)
714
      {
715
        __glibcxx_requires_string_len(__s, __n);
716
        _M_check_length(size_type(0), __n, "__versa_string::append");
717
        return _M_append(__s, __n);
718
      }
719
 
720
      /**
721
       *  @brief  Append a C string.
722
       *  @param __s  The C string to append.
723
       *  @return  Reference to this string.
724
       */
725
      __versa_string&
726
      append(const _CharT* __s)
727
      {
728
        __glibcxx_requires_string(__s);
729
        const size_type __n = traits_type::length(__s);
730
        _M_check_length(size_type(0), __n, "__versa_string::append");
731
        return _M_append(__s, __n);
732
      }
733
 
734
      /**
735
       *  @brief  Append multiple characters.
736
       *  @param __n  The number of characters to append.
737
       *  @param __c  The character to use.
738
       *  @return  Reference to this string.
739
       *
740
       *  Appends n copies of c to this string.
741
       */
742
      __versa_string&
743
      append(size_type __n, _CharT __c)
744
      { return _M_replace_aux(this->size(), size_type(0), __n, __c); }
745
 
746
#ifdef __GXX_EXPERIMENTAL_CXX0X__
747
      /**
748
       *  @brief  Append an initializer_list of characters.
749
       *  @param __l  The initializer_list of characters to append.
750
       *  @return  Reference to this string.
751
       */
752
      __versa_string&
753
      append(std::initializer_list<_CharT> __l)
754
      { return this->append(__l.begin(), __l.end()); }
755
#endif // __GXX_EXPERIMENTAL_CXX0X__
756
 
757
      /**
758
       *  @brief  Append a range of characters.
759
       *  @param __first  Iterator referencing the first character to append.
760
       *  @param __last  Iterator marking the end of the range.
761
       *  @return  Reference to this string.
762
       *
763
       *  Appends characters in the range [first,last) to this string.
764
       */
765
      template<class _InputIterator>
766
        __versa_string&
767
        append(_InputIterator __first, _InputIterator __last)
768
        { return this->replace(_M_iend(), _M_iend(), __first, __last); }
769
 
770
      /**
771
       *  @brief  Append a single character.
772
       *  @param __c  Character to append.
773
       */
774
      void
775
      push_back(_CharT __c)
776
      {
777
        const size_type __size = this->size();
778
        if (__size + 1 > this->capacity() || this->_M_is_shared())
779
          this->_M_mutate(__size, size_type(0), 0, size_type(1));
780
        traits_type::assign(this->_M_data()[__size], __c);
781
        this->_M_set_length(__size + 1);
782
      }
783
 
784
      /**
785
       *  @brief  Set value to contents of another string.
786
       *  @param  __str  Source string to use.
787
       *  @return  Reference to this string.
788
       */
789
      __versa_string&
790
      assign(const __versa_string& __str)
791
      {
792
        this->_M_assign(__str);
793
        return *this;
794
      }
795
 
796
#ifdef __GXX_EXPERIMENTAL_CXX0X__
797
      /**
798
       *  @brief  Set value to contents of another string.
799
       *  @param  __str  Source string to use.
800
       *  @return  Reference to this string.
801
       *
802
       *  This function sets this string to the exact contents of @a __str.
803
       *  @a __str is a valid, but unspecified string.
804
       */
805
      __versa_string&
806
      assign(__versa_string&& __str)
807
      {
808
        this->swap(__str);
809
        return *this;
810
      }
811
#endif // __GXX_EXPERIMENTAL_CXX0X__
812
 
813
      /**
814
       *  @brief  Set value to a substring of a string.
815
       *  @param __str  The string to use.
816
       *  @param __pos  Index of the first character of str.
817
       *  @param __n  Number of characters to use.
818
       *  @return  Reference to this string.
819
       *  @throw  std::out_of_range if @a __pos is not a valid index.
820
       *
821
       *  This function sets this string to the substring of @a __str
822
       *  consisting of @a __n characters at @a __pos.  If @a __n is
823
       *  is larger than the number of available characters in @a
824
       *  __str, the remainder of @a __str is used.
825
       */
826
      __versa_string&
827
      assign(const __versa_string& __str, size_type __pos, size_type __n)
828
      { return _M_replace(size_type(0), this->size(), __str._M_data()
829
                          + __str._M_check(__pos, "__versa_string::assign"),
830
                          __str._M_limit(__pos, __n)); }
831
 
832
      /**
833
       *  @brief  Set value to a C substring.
834
       *  @param __s  The C string to use.
835
       *  @param __n  Number of characters to use.
836
       *  @return  Reference to this string.
837
       *
838
       *  This function sets the value of this string to the first @a
839
       *  __n characters of @a __s.  If @a __n is is larger than the
840
       *  number of available characters in @a __s, the remainder of
841
       *  @a __s is used.
842
       */
843
      __versa_string&
844
      assign(const _CharT* __s, size_type __n)
845
      {
846
        __glibcxx_requires_string_len(__s, __n);
847
        return _M_replace(size_type(0), this->size(), __s, __n);
848
      }
849
 
850
      /**
851
       *  @brief  Set value to contents of a C string.
852
       *  @param __s  The C string to use.
853
       *  @return  Reference to this string.
854
       *
855
       *  This function sets the value of this string to the value of
856
       *  @a __s.  The data is copied, so there is no dependence on @a
857
       *  __s once the function returns.
858
       */
859
      __versa_string&
860
      assign(const _CharT* __s)
861
      {
862
        __glibcxx_requires_string(__s);
863
        return _M_replace(size_type(0), this->size(), __s,
864
                          traits_type::length(__s));
865
      }
866
 
867
      /**
868
       *  @brief  Set value to multiple characters.
869
       *  @param __n  Length of the resulting string.
870
       *  @param __c  The character to use.
871
       *  @return  Reference to this string.
872
       *
873
       *  This function sets the value of this string to @a __n copies of
874
       *  character @a __c.
875
       */
876
      __versa_string&
877
      assign(size_type __n, _CharT __c)
878
      { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
879
 
880
      /**
881
       *  @brief  Set value to a range of characters.
882
       *  @param __first  Iterator referencing the first character to append.
883
       *  @param __last  Iterator marking the end of the range.
884
       *  @return  Reference to this string.
885
       *
886
       *  Sets value of string to characters in the range
887
       *  [first,last).
888
      */
889
      template<class _InputIterator>
890
        __versa_string&
891
        assign(_InputIterator __first, _InputIterator __last)
892
        { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
893
 
894
#ifdef __GXX_EXPERIMENTAL_CXX0X__
895
      /**
896
       *  @brief  Set value to an initializer_list of characters.
897
       *  @param __l  The initializer_list of characters to assign.
898
       *  @return  Reference to this string.
899
       */
900
      __versa_string&
901
      assign(std::initializer_list<_CharT> __l)
902
      { return this->assign(__l.begin(), __l.end()); }
903
#endif // __GXX_EXPERIMENTAL_CXX0X__
904
 
905
      /**
906
       *  @brief  Insert multiple characters.
907
       *  @param __p  Iterator referencing location in string to insert at.
908
       *  @param __n  Number of characters to insert
909
       *  @param __c  The character to insert.
910
       *  @throw  std::length_error  If new length exceeds @c max_size().
911
       *
912
       *  Inserts @a __n copies of character @a __c starting at the
913
       *  position referenced by iterator @a __p.  If adding
914
       *  characters causes the length to exceed max_size(),
915
       *  length_error is thrown.  The value of the string doesn't
916
       *  change if an error is thrown.
917
      */
918
      void
919
      insert(iterator __p, size_type __n, _CharT __c)
920
      { this->replace(__p, __p, __n, __c);  }
921
 
922
      /**
923
       *  @brief  Insert a range of characters.
924
       *  @param __p  Iterator referencing location in string to insert at.
925
       *  @param __beg  Start of range.
926
       *  @param __end  End of range.
927
       *  @throw  std::length_error  If new length exceeds @c max_size().
928
       *
929
       *  Inserts characters in range [beg,end).  If adding characters
930
       *  causes the length to exceed max_size(), length_error is
931
       *  thrown.  The value of the string doesn't change if an error
932
       *  is thrown.
933
      */
934
      template<class _InputIterator>
935
        void
936
        insert(iterator __p, _InputIterator __beg, _InputIterator __end)
937
        { this->replace(__p, __p, __beg, __end); }
938
 
939
#ifdef __GXX_EXPERIMENTAL_CXX0X__
940
      /**
941
       *  @brief  Insert an initializer_list of characters.
942
       *  @param __p  Iterator referencing location in string to insert at.
943
       *  @param __l  The initializer_list of characters to insert.
944
       *  @throw  std::length_error  If new length exceeds @c max_size().
945
       */
946
      void
947
      insert(iterator __p, std::initializer_list<_CharT> __l)
948
      { this->insert(__p, __l.begin(), __l.end()); }
949
#endif // __GXX_EXPERIMENTAL_CXX0X__
950
 
951
      /**
952
       *  @brief  Insert value of a string.
953
       *  @param __pos1  Iterator referencing location in string to insert at.
954
       *  @param __str  The string to insert.
955
       *  @return  Reference to this string.
956
       *  @throw  std::length_error  If new length exceeds @c max_size().
957
       *
958
       *  Inserts value of @a __str starting at @a __pos1.  If adding
959
       *  characters causes the length to exceed max_size(),
960
       *  length_error is thrown.  The value of the string doesn't
961
       *  change if an error is thrown.
962
      */
963
      __versa_string&
964
      insert(size_type __pos1, const __versa_string& __str)
965
      { return this->replace(__pos1, size_type(0),
966
                             __str._M_data(), __str.size()); }
967
 
968
      /**
969
       *  @brief  Insert a substring.
970
       *  @param __pos1  Iterator referencing location in string to insert at.
971
       *  @param __str  The string to insert.
972
       *  @param __pos2  Start of characters in str to insert.
973
       *  @param __n  Number of characters to insert.
974
       *  @return  Reference to this string.
975
       *  @throw  std::length_error  If new length exceeds @c max_size().
976
       *  @throw  std::out_of_range  If @a __pos1 > size() or
977
       *  @a __pos2 > @a __str.size().
978
       *
979
       *  Starting at @a __pos1, insert @a __n character of @a __str
980
       *  beginning with @a __pos2.  If adding characters causes the
981
       *  length to exceed max_size(), length_error is thrown.  If @a
982
       *  __pos1 is beyond the end of this string or @a __pos2 is
983
       *  beyond the end of @a __str, out_of_range is thrown.  The
984
       *  value of the string doesn't change if an error is thrown.
985
      */
986
      __versa_string&
987
      insert(size_type __pos1, const __versa_string& __str,
988
             size_type __pos2, size_type __n)
989
      { return this->replace(__pos1, size_type(0), __str._M_data()
990
                             + __str._M_check(__pos2, "__versa_string::insert"),
991
                             __str._M_limit(__pos2, __n)); }
992
 
993
      /**
994
       *  @brief  Insert a C substring.
995
       *  @param __pos  Iterator referencing location in string to insert at.
996
       *  @param __s  The C string to insert.
997
       *  @param __n  The number of characters to insert.
998
       *  @return  Reference to this string.
999
       *  @throw  std::length_error  If new length exceeds @c max_size().
1000
       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1001
       *  string.
1002
       *
1003
       *  Inserts the first @a __n characters of @a __s starting at @a
1004
       *  __pos.  If adding characters causes the length to exceed
1005
       *  max_size(), length_error is thrown.  If @a __pos is beyond
1006
       *  end(), out_of_range is thrown.  The value of the string
1007
       *  doesn't change if an error is thrown.
1008
      */
1009
      __versa_string&
1010
      insert(size_type __pos, const _CharT* __s, size_type __n)
1011
      { return this->replace(__pos, size_type(0), __s, __n); }
1012
 
1013
      /**
1014
       *  @brief  Insert a C string.
1015
       *  @param __pos  Iterator referencing location in string to insert at.
1016
       *  @param __s  The C string to insert.
1017
       *  @return  Reference to this string.
1018
       *  @throw  std::length_error  If new length exceeds @c max_size().
1019
       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1020
       *  string.
1021
       *
1022
       *  Inserts the first @a __n characters of @a __s starting at @a
1023
       *  __pos.  If adding characters causes the length to exceed
1024
       *  max_size(), length_error is thrown.  If @a __pos is beyond
1025
       *  end(), out_of_range is thrown.  The value of the string
1026
       *  doesn't change if an error is thrown.
1027
      */
1028
      __versa_string&
1029
      insert(size_type __pos, const _CharT* __s)
1030
      {
1031
        __glibcxx_requires_string(__s);
1032
        return this->replace(__pos, size_type(0), __s,
1033
                             traits_type::length(__s));
1034
      }
1035
 
1036
      /**
1037
       *  @brief  Insert multiple characters.
1038
       *  @param __pos  Index in string to insert at.
1039
       *  @param __n  Number of characters to insert
1040
       *  @param __c  The character to insert.
1041
       *  @return  Reference to this string.
1042
       *  @throw  std::length_error  If new length exceeds @c max_size().
1043
       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1044
       *  string.
1045
       *
1046
       *  Inserts @a __n copies of character @a __c starting at index
1047
       *  @a __pos.  If adding characters causes the length to exceed
1048
       *  max_size(), length_error is thrown.  If @a __pos > length(),
1049
       *  out_of_range is thrown.  The value of the string doesn't
1050
       *  change if an error is thrown.
1051
      */
1052
      __versa_string&
1053
      insert(size_type __pos, size_type __n, _CharT __c)
1054
      { return _M_replace_aux(_M_check(__pos, "__versa_string::insert"),
1055
                              size_type(0), __n, __c); }
1056
 
1057
      /**
1058
       *  @brief  Insert one character.
1059
       *  @param __p  Iterator referencing position in string to insert at.
1060
       *  @param __c  The character to insert.
1061
       *  @return  Iterator referencing newly inserted char.
1062
       *  @throw  std::length_error  If new length exceeds @c max_size().
1063
       *
1064
       *  Inserts character @a __c at position referenced by @a __p.
1065
       *  If adding character causes the length to exceed max_size(),
1066
       *  length_error is thrown.  If @a __p is beyond end of string,
1067
       *  out_of_range is thrown.  The value of the string doesn't
1068
       *  change if an error is thrown.
1069
      */
1070
      iterator
1071
      insert(iterator __p, _CharT __c)
1072
      {
1073
        _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
1074
        const size_type __pos = __p - _M_ibegin();
1075
        _M_replace_aux(__pos, size_type(0), size_type(1), __c);
1076
        this->_M_set_leaked();
1077
        return iterator(this->_M_data() + __pos);
1078
      }
1079
 
1080
      /**
1081
       *  @brief  Remove characters.
1082
       *  @param __pos  Index of first character to remove (default 0).
1083
       *  @param __n  Number of characters to remove (default remainder).
1084
       *  @return  Reference to this string.
1085
       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1086
       *  string.
1087
       *
1088
       *  Removes @a __n characters from this string starting at @a
1089
       *  __pos.  The length of the string is reduced by @a __n.  If
1090
       *  there are < @a __n characters to remove, the remainder of
1091
       *  the string is truncated.  If @a __p is beyond end of string,
1092
       *  out_of_range is thrown.  The value of the string doesn't
1093
       *  change if an error is thrown.
1094
      */
1095
      __versa_string&
1096
      erase(size_type __pos = 0, size_type __n = npos)
1097
      {
1098
        this->_M_erase(_M_check(__pos, "__versa_string::erase"),
1099
                       _M_limit(__pos, __n));
1100
        return *this;
1101
      }
1102
 
1103
      /**
1104
       *  @brief  Remove one character.
1105
       *  @param __position  Iterator referencing the character to remove.
1106
       *  @return  iterator referencing same location after removal.
1107
       *
1108
       *  Removes the character at @a __position from this string. The
1109
       *  value of the string doesn't change if an error is thrown.
1110
      */
1111
      iterator
1112
      erase(iterator __position)
1113
      {
1114
        _GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
1115
                                 && __position < _M_iend());
1116
        const size_type __pos = __position - _M_ibegin();
1117
        this->_M_erase(__pos, size_type(1));
1118
        this->_M_set_leaked();
1119
        return iterator(this->_M_data() + __pos);
1120
      }
1121
 
1122
      /**
1123
       *  @brief  Remove a range of characters.
1124
       *  @param __first  Iterator referencing the first character to remove.
1125
       *  @param __last  Iterator referencing the end of the range.
1126
       *  @return  Iterator referencing location of first after removal.
1127
       *
1128
       *  Removes the characters in the range [first,last) from this
1129
       *  string.  The value of the string doesn't change if an error
1130
       *  is thrown.
1131
      */
1132
      iterator
1133
      erase(iterator __first, iterator __last)
1134
      {
1135
        _GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last
1136
                                 && __last <= _M_iend());
1137
        const size_type __pos = __first - _M_ibegin();
1138
        this->_M_erase(__pos, __last - __first);
1139
        this->_M_set_leaked();
1140
        return iterator(this->_M_data() + __pos);
1141
      }
1142
 
1143
#ifdef __GXX_EXPERIMENTAL_CXX0X__
1144
      /**
1145
       *  @brief  Remove the last character.
1146
       *
1147
       *  The string must be non-empty.
1148
       */
1149
      void
1150
      pop_back()
1151
      { this->_M_erase(size()-1, 1); }
1152
#endif // __GXX_EXPERIMENTAL_CXX0X__
1153
 
1154
      /**
1155
       *  @brief  Replace characters with value from another string.
1156
       *  @param __pos  Index of first character to replace.
1157
       *  @param __n  Number of characters to be replaced.
1158
       *  @param __str  String to insert.
1159
       *  @return  Reference to this string.
1160
       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1161
       *  string.
1162
       *  @throw  std::length_error  If new length exceeds @c max_size().
1163
       *
1164
       *  Removes the characters in the range [pos,pos+n) from this
1165
       *  string.  In place, the value of @a __str is inserted.  If @a
1166
       *  __pos is beyond end of string, out_of_range is thrown.  If
1167
       *  the length of the result exceeds max_size(), length_error is
1168
       *  thrown.  The value of the string doesn't change if an error
1169
       *  is thrown.
1170
      */
1171
      __versa_string&
1172
      replace(size_type __pos, size_type __n, const __versa_string& __str)
1173
      { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
1174
 
1175
      /**
1176
       *  @brief  Replace characters with value from another string.
1177
       *  @param __pos1  Index of first character to replace.
1178
       *  @param __n1  Number of characters to be replaced.
1179
       *  @param __str  String to insert.
1180
       *  @param __pos2  Index of first character of str to use.
1181
       *  @param __n2  Number of characters from str to use.
1182
       *  @return  Reference to this string.
1183
       *  @throw  std::out_of_range  If @a __pos1 > size() or @a __pos2 >
1184
       *  str.size().
1185
       *  @throw  std::length_error  If new length exceeds @c max_size().
1186
       *
1187
       *  Removes the characters in the range [pos1,pos1 + n) from
1188
       *  this string.  In place, the value of @a __str is inserted.
1189
       *  If @a __pos is beyond end of string, out_of_range is thrown.
1190
       *  If the length of the result exceeds max_size(), length_error
1191
       *  is thrown.  The value of the string doesn't change if an
1192
       *  error is thrown.
1193
      */
1194
      __versa_string&
1195
      replace(size_type __pos1, size_type __n1, const __versa_string& __str,
1196
              size_type __pos2, size_type __n2)
1197
      {
1198
        return this->replace(__pos1, __n1, __str._M_data()
1199
                             + __str._M_check(__pos2,
1200
                                              "__versa_string::replace"),
1201
                             __str._M_limit(__pos2, __n2));
1202
      }
1203
 
1204
      /**
1205
       *  @brief  Replace characters with value of a C substring.
1206
       *  @param __pos  Index of first character to replace.
1207
       *  @param __n1  Number of characters to be replaced.
1208
       *  @param __s  C string to insert.
1209
       *  @param __n2  Number of characters from @a __s to use.
1210
       *  @return  Reference to this string.
1211
       *  @throw  std::out_of_range  If @a __pos1 > size().
1212
       *  @throw  std::length_error  If new length exceeds @c max_size().
1213
       *
1214
       *  Removes the characters in the range [pos,pos + n1) from this
1215
       *  string.  In place, the first @a __n2 characters of @a __s
1216
       *  are inserted, or all of @a __s if @a __n2 is too large.  If
1217
       *  @a __pos is beyond end of string, out_of_range is thrown.
1218
       *  If the length of result exceeds max_size(), length_error is
1219
       *  thrown.  The value of the string doesn't change if an error
1220
       *  is thrown.
1221
      */
1222
      __versa_string&
1223
      replace(size_type __pos, size_type __n1, const _CharT* __s,
1224
              size_type __n2)
1225
      {
1226
        __glibcxx_requires_string_len(__s, __n2);
1227
        return _M_replace(_M_check(__pos, "__versa_string::replace"),
1228
                          _M_limit(__pos, __n1), __s, __n2);
1229
      }
1230
 
1231
      /**
1232
       *  @brief  Replace characters with value of a C string.
1233
       *  @param __pos  Index of first character to replace.
1234
       *  @param __n1  Number of characters to be replaced.
1235
       *  @param __s  C string to insert.
1236
       *  @return  Reference to this string.
1237
       *  @throw  std::out_of_range  If @a __pos > size().
1238
       *  @throw  std::length_error  If new length exceeds @c max_size().
1239
       *
1240
       *  Removes the characters in the range [pos,pos + n1) from this
1241
       *  string.  In place, the characters of @a __s are inserted.  If
1242
       *  @a pos is beyond end of string, out_of_range is thrown.  If
1243
       *  the length of result exceeds max_size(), length_error is thrown.
1244
       *  The value of the string doesn't change if an error is thrown.
1245
      */
1246
      __versa_string&
1247
      replace(size_type __pos, size_type __n1, const _CharT* __s)
1248
      {
1249
        __glibcxx_requires_string(__s);
1250
        return this->replace(__pos, __n1, __s, traits_type::length(__s));
1251
      }
1252
 
1253
      /**
1254
       *  @brief  Replace characters with multiple characters.
1255
       *  @param __pos  Index of first character to replace.
1256
       *  @param __n1  Number of characters to be replaced.
1257
       *  @param __n2  Number of characters to insert.
1258
       *  @param __c  Character to insert.
1259
       *  @return  Reference to this string.
1260
       *  @throw  std::out_of_range  If @a __pos > size().
1261
       *  @throw  std::length_error  If new length exceeds @c max_size().
1262
       *
1263
       *  Removes the characters in the range [pos,pos + n1) from this
1264
       *  string.  In place, @a __n2 copies of @a __c are inserted.
1265
       *  If @a __pos is beyond end of string, out_of_range is thrown.
1266
       *  If the length of result exceeds max_size(), length_error is
1267
       *  thrown.  The value of the string doesn't change if an error
1268
       *  is thrown.
1269
      */
1270
      __versa_string&
1271
      replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
1272
      { return _M_replace_aux(_M_check(__pos, "__versa_string::replace"),
1273
                              _M_limit(__pos, __n1), __n2, __c); }
1274
 
1275
      /**
1276
       *  @brief  Replace range of characters with string.
1277
       *  @param __i1  Iterator referencing start of range to replace.
1278
       *  @param __i2  Iterator referencing end of range to replace.
1279
       *  @param __str  String value to insert.
1280
       *  @return  Reference to this string.
1281
       *  @throw  std::length_error  If new length exceeds @c max_size().
1282
       *
1283
       *  Removes the characters in the range [i1,i2).  In place, the
1284
       *  value of @a __str is inserted.  If the length of result
1285
       *  exceeds max_size(), length_error is thrown.  The value of
1286
       *  the string doesn't change if an error is thrown.
1287
      */
1288
      __versa_string&
1289
      replace(iterator __i1, iterator __i2, const __versa_string& __str)
1290
      { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
1291
 
1292
      /**
1293
       *  @brief  Replace range of characters with C substring.
1294
       *  @param __i1  Iterator referencing start of range to replace.
1295
       *  @param __i2  Iterator referencing end of range to replace.
1296
       *  @param __s  C string value to insert.
1297
       *  @param __n  Number of characters from s to insert.
1298
       *  @return  Reference to this string.
1299
       *  @throw  std::length_error  If new length exceeds @c max_size().
1300
       *
1301
       *  Removes the characters in the range [i1,i2).  In place, the
1302
       *  first @a n characters of @a __s are inserted.  If the length
1303
       *  of result exceeds max_size(), length_error is thrown.  The
1304
       *  value of the string doesn't change if an error is thrown.
1305
      */
1306
      __versa_string&
1307
      replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
1308
      {
1309
        _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1310
                                 && __i2 <= _M_iend());
1311
        return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
1312
      }
1313
 
1314
      /**
1315
       *  @brief  Replace range of characters with C string.
1316
       *  @param __i1  Iterator referencing start of range to replace.
1317
       *  @param __i2  Iterator referencing end of range to replace.
1318
       *  @param __s  C string value to insert.
1319
       *  @return  Reference to this string.
1320
       *  @throw  std::length_error  If new length exceeds @c max_size().
1321
       *
1322
       *  Removes the characters in the range [i1,i2).  In place, the
1323
       *  characters of @a __s are inserted.  If the length of result
1324
       *  exceeds max_size(), length_error is thrown.  The value of
1325
       *  the string doesn't change if an error is thrown.
1326
      */
1327
      __versa_string&
1328
      replace(iterator __i1, iterator __i2, const _CharT* __s)
1329
      {
1330
        __glibcxx_requires_string(__s);
1331
        return this->replace(__i1, __i2, __s, traits_type::length(__s));
1332
      }
1333
 
1334
      /**
1335
       *  @brief  Replace range of characters with multiple characters
1336
       *  @param __i1  Iterator referencing start of range to replace.
1337
       *  @param __i2  Iterator referencing end of range to replace.
1338
       *  @param __n  Number of characters to insert.
1339
       *  @param __c  Character to insert.
1340
       *  @return  Reference to this string.
1341
       *  @throw  std::length_error  If new length exceeds @c max_size().
1342
       *
1343
       *  Removes the characters in the range [i1,i2).  In place, @a
1344
       *  __n copies of @a __c are inserted.  If the length of result
1345
       *  exceeds max_size(), length_error is thrown.  The value of
1346
       *  the string doesn't change if an error is thrown.
1347
      */
1348
      __versa_string&
1349
      replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
1350
      {
1351
        _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1352
                                 && __i2 <= _M_iend());
1353
        return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
1354
      }
1355
 
1356
      /**
1357
       *  @brief  Replace range of characters with range.
1358
       *  @param __i1  Iterator referencing start of range to replace.
1359
       *  @param __i2  Iterator referencing end of range to replace.
1360
       *  @param __k1  Iterator referencing start of range to insert.
1361
       *  @param __k2  Iterator referencing end of range to insert.
1362
       *  @return  Reference to this string.
1363
       *  @throw  std::length_error  If new length exceeds @c max_size().
1364
       *
1365
       *  Removes the characters in the range [i1,i2).  In place,
1366
       *  characters in the range [k1,k2) are inserted.  If the length
1367
       *  of result exceeds max_size(), length_error is thrown.  The
1368
       *  value of the string doesn't change if an error is thrown.
1369
      */
1370
      template<class _InputIterator>
1371
        __versa_string&
1372
        replace(iterator __i1, iterator __i2,
1373
                _InputIterator __k1, _InputIterator __k2)
1374
        {
1375
          _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1376
                                   && __i2 <= _M_iend());
1377
          __glibcxx_requires_valid_range(__k1, __k2);
1378
          typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1379
          return this->_M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
1380
        }
1381
 
1382
      // Specializations for the common case of pointer and iterator:
1383
      // useful to avoid the overhead of temporary buffering in _M_replace.
1384
      __versa_string&
1385
      replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
1386
      {
1387
        _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1388
                                 && __i2 <= _M_iend());
1389
        __glibcxx_requires_valid_range(__k1, __k2);
1390
        return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1391
                             __k1, __k2 - __k1);
1392
      }
1393
 
1394
      __versa_string&
1395
      replace(iterator __i1, iterator __i2,
1396
              const _CharT* __k1, const _CharT* __k2)
1397
      {
1398
        _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1399
                                 && __i2 <= _M_iend());
1400
        __glibcxx_requires_valid_range(__k1, __k2);
1401
        return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1402
                             __k1, __k2 - __k1);
1403
      }
1404
 
1405
      __versa_string&
1406
      replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
1407
      {
1408
        _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1409
                                 && __i2 <= _M_iend());
1410
        __glibcxx_requires_valid_range(__k1, __k2);
1411
        return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1412
                             __k1.base(), __k2 - __k1);
1413
      }
1414
 
1415
      __versa_string&
1416
      replace(iterator __i1, iterator __i2,
1417
              const_iterator __k1, const_iterator __k2)
1418
      {
1419
        _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1420
                                 && __i2 <= _M_iend());
1421
        __glibcxx_requires_valid_range(__k1, __k2);
1422
        return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1423
                             __k1.base(), __k2 - __k1);
1424
      }
1425
 
1426
#ifdef __GXX_EXPERIMENTAL_CXX0X__
1427
      /**
1428
       *  @brief  Replace range of characters with initializer_list.
1429
       *  @param __i1  Iterator referencing start of range to replace.
1430
       *  @param __i2  Iterator referencing end of range to replace.
1431
       *  @param __l  The initializer_list of characters to insert.
1432
       *  @return  Reference to this string.
1433
       *  @throw  std::length_error  If new length exceeds @c max_size().
1434
       *
1435
       *  Removes the characters in the range [i1,i2).  In place,
1436
       *  characters in the range [k1,k2) are inserted.  If the length
1437
       *  of result exceeds max_size(), length_error is thrown.  The
1438
       *  value of the string doesn't change if an error is thrown.
1439
      */
1440
      __versa_string& replace(iterator __i1, iterator __i2,
1441
                              std::initializer_list<_CharT> __l)
1442
      { return this->replace(__i1, __i2, __l.begin(), __l.end()); }
1443
#endif // __GXX_EXPERIMENTAL_CXX0X__
1444
 
1445
    private:
1446
      template<class _Integer>
1447
        __versa_string&
1448
        _M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
1449
                            _Integer __val, std::__true_type)
1450
        { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
1451
 
1452
      template<class _InputIterator>
1453
        __versa_string&
1454
        _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
1455
                            _InputIterator __k2, std::__false_type);
1456
 
1457
      __versa_string&
1458
      _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
1459
                     _CharT __c);
1460
 
1461
      __versa_string&
1462
      _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
1463
                 const size_type __len2);
1464
 
1465
      __versa_string&
1466
      _M_append(const _CharT* __s, size_type __n);
1467
 
1468
    public:
1469
 
1470
      /**
1471
       *  @brief  Copy substring into C string.
1472
       *  @param __s  C string to copy value into.
1473
       *  @param __n  Number of characters to copy.
1474
       *  @param __pos  Index of first character to copy.
1475
       *  @return  Number of characters actually copied
1476
       *  @throw  std::out_of_range  If pos > size().
1477
       *
1478
       *  Copies up to @a __n characters starting at @a __pos into the
1479
       *  C string @a s.  If @a __pos is greater than size(),
1480
       *  out_of_range is thrown.
1481
      */
1482
      size_type
1483
      copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
1484
 
1485
      /**
1486
       *  @brief  Swap contents with another string.
1487
       *  @param __s  String to swap with.
1488
       *
1489
       *  Exchanges the contents of this string with that of @a __s in
1490
       *  constant time.
1491
      */
1492
      void
1493
      swap(__versa_string& __s)
1494
      { this->_M_swap(__s); }
1495
 
1496
      // String operations:
1497
      /**
1498
       *  @brief  Return const pointer to null-terminated contents.
1499
       *
1500
       *  This is a handle to internal data.  Do not modify or dire things may
1501
       *  happen.
1502
      */
1503
      const _CharT*
1504
      c_str() const _GLIBCXX_NOEXCEPT
1505
      { return this->_M_data(); }
1506
 
1507
      /**
1508
       *  @brief  Return const pointer to contents.
1509
       *
1510
       *  This is a handle to internal data.  Do not modify or dire things may
1511
       *  happen.
1512
      */
1513
      const _CharT*
1514
      data() const _GLIBCXX_NOEXCEPT
1515
      { return this->_M_data(); }
1516
 
1517
      /**
1518
       *  @brief  Return copy of allocator used to construct this string.
1519
      */
1520
      allocator_type
1521
      get_allocator() const _GLIBCXX_NOEXCEPT
1522
      { return allocator_type(this->_M_get_allocator()); }
1523
 
1524
      /**
1525
       *  @brief  Find position of a C substring.
1526
       *  @param __s  C string to locate.
1527
       *  @param __pos  Index of character to search from.
1528
       *  @param __n  Number of characters from @a __s to search for.
1529
       *  @return  Index of start of first occurrence.
1530
       *
1531
       *  Starting from @a __pos, searches forward for the first @a
1532
       *  __n characters in @a __s within this string.  If found,
1533
       *  returns the index where it begins.  If not found, returns
1534
       *  npos.
1535
      */
1536
      size_type
1537
      find(const _CharT* __s, size_type __pos, size_type __n) const;
1538
 
1539
      /**
1540
       *  @brief  Find position of a string.
1541
       *  @param __str  String to locate.
1542
       *  @param __pos  Index of character to search from (default 0).
1543
       *  @return  Index of start of first occurrence.
1544
       *
1545
       *  Starting from @a __pos, searches forward for value of @a
1546
       *  __str within this string.  If found, returns the index where
1547
       *  it begins.  If not found, returns npos.
1548
      */
1549
      size_type
1550
      find(const __versa_string& __str, size_type __pos = 0) const
1551
        _GLIBCXX_NOEXCEPT
1552
      { return this->find(__str.data(), __pos, __str.size()); }
1553
 
1554
      /**
1555
       *  @brief  Find position of a C string.
1556
       *  @param __s  C string to locate.
1557
       *  @param __pos  Index of character to search from (default 0).
1558
       *  @return  Index of start of first occurrence.
1559
       *
1560
       *  Starting from @a __pos, searches forward for the value of @a
1561
       *  __s within this string.  If found, returns the index where
1562
       *  it begins.  If not found, returns npos.
1563
      */
1564
      size_type
1565
      find(const _CharT* __s, size_type __pos = 0) const
1566
      {
1567
        __glibcxx_requires_string(__s);
1568
        return this->find(__s, __pos, traits_type::length(__s));
1569
      }
1570
 
1571
      /**
1572
       *  @brief  Find position of a character.
1573
       *  @param __c  Character to locate.
1574
       *  @param __pos  Index of character to search from (default 0).
1575
       *  @return  Index of first occurrence.
1576
       *
1577
       *  Starting from @a __pos, searches forward for @a __c within
1578
       *  this string.  If found, returns the index where it was
1579
       *  found.  If not found, returns npos.
1580
      */
1581
      size_type
1582
      find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
1583
 
1584
      /**
1585
       *  @brief  Find last position of a string.
1586
       *  @param __str  String to locate.
1587
       *  @param __pos  Index of character to search back from (default end).
1588
       *  @return  Index of start of last occurrence.
1589
       *
1590
       *  Starting from @a __pos, searches backward for value of @a
1591
       *  __str within this string.  If found, returns the index where
1592
       *  it begins.  If not found, returns npos.
1593
      */
1594
      size_type
1595
      rfind(const __versa_string& __str, size_type __pos = npos) const
1596
        _GLIBCXX_NOEXCEPT
1597
      { return this->rfind(__str.data(), __pos, __str.size()); }
1598
 
1599
      /**
1600
       *  @brief  Find last position of a C substring.
1601
       *  @param __s  C string to locate.
1602
       *  @param __pos  Index of character to search back from.
1603
       *  @param __n  Number of characters from s to search for.
1604
       *  @return  Index of start of last occurrence.
1605
       *
1606
       *  Starting from @a __pos, searches backward for the first @a
1607
       *  __n characters in @a __s within this string.  If found,
1608
       *  returns the index where it begins.  If not found, returns
1609
       *  npos.
1610
      */
1611
      size_type
1612
      rfind(const _CharT* __s, size_type __pos, size_type __n) const;
1613
 
1614
      /**
1615
       *  @brief  Find last position of a C string.
1616
       *  @param __s  C string to locate.
1617
       *  @param __pos  Index of character to start search at (default end).
1618
       *  @return  Index of start of  last occurrence.
1619
       *
1620
       *  Starting from @a __pos, searches backward for the value of
1621
       *  @a __s within this string.  If found, returns the index
1622
       *  where it begins.  If not found, returns npos.
1623
      */
1624
      size_type
1625
      rfind(const _CharT* __s, size_type __pos = npos) const
1626
      {
1627
        __glibcxx_requires_string(__s);
1628
        return this->rfind(__s, __pos, traits_type::length(__s));
1629
      }
1630
 
1631
      /**
1632
       *  @brief  Find last position of a character.
1633
       *  @param __c  Character to locate.
1634
       *  @param __pos  Index of character to search back from (default end).
1635
       *  @return  Index of last occurrence.
1636
       *
1637
       *  Starting from @a __pos, searches backward for @a __c within
1638
       *  this string.  If found, returns the index where it was
1639
       *  found.  If not found, returns npos.
1640
      */
1641
      size_type
1642
      rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
1643
 
1644
      /**
1645
       *  @brief  Find position of a character of string.
1646
       *  @param __str  String containing characters to locate.
1647
       *  @param __pos  Index of character to search from (default 0).
1648
       *  @return  Index of first occurrence.
1649
       *
1650
       *  Starting from @a __pos, searches forward for one of the characters of
1651
       *  @a __str within this string.  If found, returns the index where it was
1652
       *  found.  If not found, returns npos.
1653
      */
1654
      size_type
1655
      find_first_of(const __versa_string& __str, size_type __pos = 0) const
1656
        _GLIBCXX_NOEXCEPT
1657
      { return this->find_first_of(__str.data(), __pos, __str.size()); }
1658
 
1659
      /**
1660
       *  @brief  Find position of a character of C substring.
1661
       *  @param __s  String containing characters to locate.
1662
       *  @param __pos  Index of character to search from.
1663
       *  @param __n  Number of characters from s to search for.
1664
       *  @return  Index of first occurrence.
1665
       *
1666
       *  Starting from @a __pos, searches forward for one of the
1667
       *  first @a __n characters of @a __s within this string.  If
1668
       *  found, returns the index where it was found.  If not found,
1669
       *  returns npos.
1670
      */
1671
      size_type
1672
      find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
1673
 
1674
      /**
1675
       *  @brief  Find position of a character of C string.
1676
       *  @param __s  String containing characters to locate.
1677
       *  @param __pos  Index of character to search from (default 0).
1678
       *  @return  Index of first occurrence.
1679
       *
1680
       *  Starting from @a __pos, searches forward for one of the
1681
       *  characters of @a __s within this string.  If found, returns
1682
       *  the index where it was found.  If not found, returns npos.
1683
      */
1684
      size_type
1685
      find_first_of(const _CharT* __s, size_type __pos = 0) const
1686
      {
1687
        __glibcxx_requires_string(__s);
1688
        return this->find_first_of(__s, __pos, traits_type::length(__s));
1689
      }
1690
 
1691
      /**
1692
       *  @brief  Find position of a character.
1693
       *  @param __c  Character to locate.
1694
       *  @param __pos  Index of character to search from (default 0).
1695
       *  @return  Index of first occurrence.
1696
       *
1697
       *  Starting from @a __pos, searches forward for the character
1698
       *  @a __c within this string.  If found, returns the index
1699
       *  where it was found.  If not found, returns npos.
1700
       *
1701
       *  Note: equivalent to find(c, pos).
1702
      */
1703
      size_type
1704
      find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
1705
      { return this->find(__c, __pos); }
1706
 
1707
      /**
1708
       *  @brief  Find last position of a character of string.
1709
       *  @param __str  String containing characters to locate.
1710
       *  @param __pos  Index of character to search back from (default end).
1711
       *  @return  Index of last occurrence.
1712
       *
1713
       *  Starting from @a __pos, searches backward for one of the
1714
       *  characters of @a __str within this string.  If found,
1715
       *  returns the index where it was found.  If not found, returns
1716
       *  npos.
1717
      */
1718
      size_type
1719
      find_last_of(const __versa_string& __str, size_type __pos = npos) const
1720
        _GLIBCXX_NOEXCEPT
1721
      { return this->find_last_of(__str.data(), __pos, __str.size()); }
1722
 
1723
      /**
1724
       *  @brief  Find last position of a character of C substring.
1725
       *  @param __s  C string containing characters to locate.
1726
       *  @param __pos  Index of character to search back from.
1727
       *  @param __n  Number of characters from s to search for.
1728
       *  @return  Index of last occurrence.
1729
       *
1730
       *  Starting from @a __pos, searches backward for one of the
1731
       *  first @a __n characters of @a __s within this string.  If
1732
       *  found, returns the index where it was found.  If not found,
1733
       *  returns npos.
1734
      */
1735
      size_type
1736
      find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
1737
 
1738
      /**
1739
       *  @brief  Find last position of a character of C string.
1740
       *  @param __s  C string containing characters to locate.
1741
       *  @param __pos  Index of character to search back from (default end).
1742
       *  @return  Index of last occurrence.
1743
       *
1744
       *  Starting from @a __pos, searches backward for one of the
1745
       *  characters of @a __s within this string.  If found, returns
1746
       *  the index where it was found.  If not found, returns npos.
1747
      */
1748
      size_type
1749
      find_last_of(const _CharT* __s, size_type __pos = npos) const
1750
      {
1751
        __glibcxx_requires_string(__s);
1752
        return this->find_last_of(__s, __pos, traits_type::length(__s));
1753
      }
1754
 
1755
      /**
1756
       *  @brief  Find last position of a character.
1757
       *  @param __c  Character to locate.
1758
       *  @param __pos  Index of character to search back from (default end).
1759
       *  @return  Index of last occurrence.
1760
       *
1761
       *  Starting from @a __pos, searches backward for @a __c within
1762
       *  this string.  If found, returns the index where it was
1763
       *  found.  If not found, returns npos.
1764
       *
1765
       *  Note: equivalent to rfind(c, pos).
1766
      */
1767
      size_type
1768
      find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
1769
      { return this->rfind(__c, __pos); }
1770
 
1771
      /**
1772
       *  @brief  Find position of a character not in string.
1773
       *  @param __str  String containing characters to avoid.
1774
       *  @param __pos  Index of character to search from (default 0).
1775
       *  @return  Index of first occurrence.
1776
       *
1777
       *  Starting from @a __pos, searches forward for a character not
1778
       *  contained in @a __str within this string.  If found, returns
1779
       *  the index where it was found.  If not found, returns npos.
1780
      */
1781
      size_type
1782
      find_first_not_of(const __versa_string& __str, size_type __pos = 0) const
1783
        _GLIBCXX_NOEXCEPT
1784
      { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
1785
 
1786
      /**
1787
       *  @brief  Find position of a character not in C substring.
1788
       *  @param __s  C string containing characters to avoid.
1789
       *  @param __pos  Index of character to search from.
1790
       *  @param __n  Number of characters from s to consider.
1791
       *  @return  Index of first occurrence.
1792
       *
1793
       *  Starting from @a __pos, searches forward for a character not
1794
       *  contained in the first @a __n characters of @a __s within
1795
       *  this string.  If found, returns the index where it was
1796
       *  found.  If not found, returns npos.
1797
      */
1798
      size_type
1799
      find_first_not_of(const _CharT* __s, size_type __pos,
1800
                        size_type __n) const;
1801
 
1802
      /**
1803
       *  @brief  Find position of a character not in C string.
1804
       *  @param __s  C string containing characters to avoid.
1805
       *  @param __pos  Index of character to search from (default 0).
1806
       *  @return  Index of first occurrence.
1807
       *
1808
       *  Starting from @a __pos, searches forward for a character not
1809
       *  contained in @a __s within this string.  If found, returns
1810
       *  the index where it was found.  If not found, returns npos.
1811
      */
1812
      size_type
1813
      find_first_not_of(const _CharT* __s, size_type __pos = 0) const
1814
      {
1815
        __glibcxx_requires_string(__s);
1816
        return this->find_first_not_of(__s, __pos, traits_type::length(__s));
1817
      }
1818
 
1819
      /**
1820
       *  @brief  Find position of a different character.
1821
       *  @param __c  Character to avoid.
1822
       *  @param __pos  Index of character to search from (default 0).
1823
       *  @return  Index of first occurrence.
1824
       *
1825
       *  Starting from @a __pos, searches forward for a character
1826
       *  other than @a __c within this string.  If found, returns the
1827
       *  index where it was found.  If not found, returns npos.
1828
      */
1829
      size_type
1830
      find_first_not_of(_CharT __c, size_type __pos = 0) const
1831
        _GLIBCXX_NOEXCEPT;
1832
 
1833
      /**
1834
       *  @brief  Find last position of a character not in string.
1835
       *  @param __str  String containing characters to avoid.
1836
       *  @param __pos  Index of character to search back from (default end).
1837
       *  @return  Index of last occurrence.
1838
       *
1839
       *  Starting from @a __pos, searches backward for a character
1840
       *  not contained in @a __str within this string.  If found,
1841
       *  returns the index where it was found.  If not found, returns
1842
       *  npos.
1843
      */
1844
      size_type
1845
      find_last_not_of(const __versa_string& __str,
1846
                       size_type __pos = npos) const _GLIBCXX_NOEXCEPT
1847
      { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
1848
 
1849
      /**
1850
       *  @brief  Find last position of a character not in C substring.
1851
       *  @param __s  C string containing characters to avoid.
1852
       *  @param __pos  Index of character to search back from.
1853
       *  @param __n  Number of characters from s to consider.
1854
       *  @return  Index of last occurrence.
1855
       *
1856
       *  Starting from @a __pos, searches backward for a character
1857
       *  not contained in the first @a __n characters of @a __s
1858
       *  within this string.  If found, returns the index where it
1859
       *  was found.  If not found, returns npos.
1860
      */
1861
      size_type
1862
      find_last_not_of(const _CharT* __s, size_type __pos,
1863
                       size_type __n) const;
1864
      /**
1865
       *  @brief  Find last position of a character not in C string.
1866
       *  @param __s  C string containing characters to avoid.
1867
       *  @param __pos  Index of character to search back from (default end).
1868
       *  @return  Index of last occurrence.
1869
       *
1870
       *  Starting from @a __pos, searches backward for a character
1871
       *  not contained in @a __s within this string.  If found,
1872
       *  returns the index where it was found.  If not found, returns
1873
       *  npos.
1874
      */
1875
      size_type
1876
      find_last_not_of(const _CharT* __s, size_type __pos = npos) const
1877
      {
1878
        __glibcxx_requires_string(__s);
1879
        return this->find_last_not_of(__s, __pos, traits_type::length(__s));
1880
      }
1881
 
1882
      /**
1883
       *  @brief  Find last position of a different character.
1884
       *  @param __c  Character to avoid.
1885
       *  @param __pos  Index of character to search back from (default end).
1886
       *  @return  Index of last occurrence.
1887
       *
1888
       *  Starting from @a __pos, searches backward for a character
1889
       *  other than @a __c within this string.  If found, returns the
1890
       *  index where it was found.  If not found, returns npos.
1891
      */
1892
      size_type
1893
      find_last_not_of(_CharT __c, size_type __pos = npos) const
1894
        _GLIBCXX_NOEXCEPT;
1895
 
1896
      /**
1897
       *  @brief  Get a substring.
1898
       *  @param __pos  Index of first character (default 0).
1899
       *  @param __n  Number of characters in substring (default remainder).
1900
       *  @return  The new string.
1901
       *  @throw  std::out_of_range  If pos > size().
1902
       *
1903
       *  Construct and return a new string using the @a __n
1904
       *  characters starting at @a __pos.  If the string is too
1905
       *  short, use the remainder of the characters.  If @a __pos is
1906
       *  beyond the end of the string, out_of_range is thrown.
1907
      */
1908
      __versa_string
1909
      substr(size_type __pos = 0, size_type __n = npos) const
1910
      {
1911
        return __versa_string(*this, _M_check(__pos, "__versa_string::substr"),
1912
                              __n);
1913
      }
1914
 
1915
      /**
1916
       *  @brief  Compare to a string.
1917
       *  @param __str  String to compare against.
1918
       *  @return  Integer < 0, 0, or > 0.
1919
       *
1920
       *  Returns an integer < 0 if this string is ordered before @a
1921
       *  __str, 0 if their values are equivalent, or > 0 if this
1922
       *  string is ordered after @a __str.  Determines the effective
1923
       *  length rlen of the strings to compare as the smallest of
1924
       *  size() and str.size().  The function then compares the two
1925
       *  strings by calling traits::compare(data(), str.data(),rlen).
1926
       *  If the result of the comparison is nonzero returns it,
1927
       *  otherwise the shorter one is ordered first.
1928
      */
1929
      int
1930
      compare(const __versa_string& __str) const
1931
      {
1932
        if (this->_M_compare(__str))
1933
          return 0;
1934
 
1935
        const size_type __size = this->size();
1936
        const size_type __osize = __str.size();
1937
        const size_type __len = std::min(__size, __osize);
1938
 
1939
        int __r = traits_type::compare(this->_M_data(), __str.data(), __len);
1940
        if (!__r)
1941
          __r = this->_S_compare(__size, __osize);
1942
        return __r;
1943
      }
1944
 
1945
      /**
1946
       *  @brief  Compare substring to a string.
1947
       *  @param __pos  Index of first character of substring.
1948
       *  @param __n  Number of characters in substring.
1949
       *  @param __str  String to compare against.
1950
       *  @return  Integer < 0, 0, or > 0.
1951
       *
1952
       *  Form the substring of this string from the @a __n characters
1953
       *  starting at @a __pos.  Returns an integer < 0 if the
1954
       *  substring is ordered before @a __str, 0 if their values are
1955
       *  equivalent, or > 0 if the substring is ordered after @a
1956
       *  __str.  Determines the effective length rlen of the strings
1957
       *  to compare as the smallest of the length of the substring
1958
       *  and @a __str.size().  The function then compares the two
1959
       *  strings by calling
1960
       *  traits::compare(substring.data(),str.data(),rlen).  If the
1961
       *  result of the comparison is nonzero returns it, otherwise
1962
       *  the shorter one is ordered first.
1963
      */
1964
      int
1965
      compare(size_type __pos, size_type __n,
1966
              const __versa_string& __str) const;
1967
 
1968
      /**
1969
       *  @brief  Compare substring to a substring.
1970
       *  @param __pos1  Index of first character of substring.
1971
       *  @param __n1  Number of characters in substring.
1972
       *  @param __str  String to compare against.
1973
       *  @param __pos2  Index of first character of substring of str.
1974
       *  @param __n2  Number of characters in substring of str.
1975
       *  @return  Integer < 0, 0, or > 0.
1976
       *
1977
       *  Form the substring of this string from the @a __n1
1978
       *  characters starting at @a __pos1.  Form the substring of @a
1979
       *  __str from the @a __n2 characters starting at @a __pos2.
1980
       *  Returns an integer < 0 if this substring is ordered before
1981
       *  the substring of @a __str, 0 if their values are equivalent,
1982
       *  or > 0 if this substring is ordered after the substring of
1983
       *  @a __str.  Determines the effective length rlen of the
1984
       *  strings to compare as the smallest of the lengths of the
1985
       *  substrings.  The function then compares the two strings by
1986
       *  calling
1987
       *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
1988
       *  If the result of the comparison is nonzero returns it,
1989
       *  otherwise the shorter one is ordered first.
1990
      */
1991
      int
1992
      compare(size_type __pos1, size_type __n1, const __versa_string& __str,
1993
              size_type __pos2, size_type __n2) const;
1994
 
1995
      /**
1996
       *  @brief  Compare to a C string.
1997
       *  @param __s  C string to compare against.
1998
       *  @return  Integer < 0, 0, or > 0.
1999
       *
2000
       *  Returns an integer < 0 if this string is ordered before @a
2001
       *  __s, 0 if their values are equivalent, or > 0 if this string
2002
       *  is ordered after @a __s.  Determines the effective length
2003
       *  rlen of the strings to compare as the smallest of size() and
2004
       *  the length of a string constructed from @a __s.  The
2005
       *  function then compares the two strings by calling
2006
       *  traits::compare(data(),s,rlen).  If the result of the
2007
       *  comparison is nonzero returns it, otherwise the shorter one
2008
       *  is ordered first.
2009
      */
2010
      int
2011
      compare(const _CharT* __s) const;
2012
 
2013
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
2014
      // 5 String::compare specification questionable
2015
      /**
2016
       *  @brief  Compare substring to a C string.
2017
       *  @param __pos  Index of first character of substring.
2018
       *  @param __n1  Number of characters in substring.
2019
       *  @param __s  C string to compare against.
2020
       *  @return  Integer < 0, 0, or > 0.
2021
       *
2022
       *  Form the substring of this string from the @a __n1
2023
       *  characters starting at @a __pos.  Returns an integer < 0 if
2024
       *  the substring is ordered before @a __s, 0 if their values
2025
       *  are equivalent, or > 0 if the substring is ordered after @a
2026
       *  __s.  Determines the effective length rlen of the strings to
2027
       *  compare as the smallest of the length of the substring and
2028
       *  the length of a string constructed from @a __s.  The
2029
       *  function then compares the two string by calling
2030
       *  traits::compare(substring.data(),s,rlen).  If the result of
2031
       *  the comparison is nonzero returns it, otherwise the shorter
2032
       *  one is ordered first.
2033
      */
2034
      int
2035
      compare(size_type __pos, size_type __n1, const _CharT* __s) const;
2036
 
2037
      /**
2038
       *  @brief  Compare substring against a character array.
2039
       *  @param __pos  Index of first character of substring.
2040
       *  @param __n1  Number of characters in substring.
2041
       *  @param __s  character array to compare against.
2042
       *  @param __n2  Number of characters of s.
2043
       *  @return  Integer < 0, 0, or > 0.
2044
       *
2045
       *  Form the substring of this string from the @a __n1
2046
       *  characters starting at @a __pos.  Form a string from the
2047
       *  first @a __n2 characters of @a __s.  Returns an integer < 0
2048
       *  if this substring is ordered before the string from @a __s,
2049
       *  0 if their values are equivalent, or > 0 if this substring
2050
       *  is ordered after the string from @a __s.  Determines the
2051
       *  effective length rlen of the strings to compare as the
2052
       *  smallest of the length of the substring and @a __n2.  The
2053
       *  function then compares the two strings by calling
2054
       *  traits::compare(substring.data(),__s,rlen).  If the result of
2055
       *  the comparison is nonzero returns it, otherwise the shorter
2056
       *  one is ordered first.
2057
       *
2058
       *  NB: __s must have at least n2 characters, <em>\\0</em> has no special
2059
       *  meaning.
2060
      */
2061
      int
2062
      compare(size_type __pos, size_type __n1, const _CharT* __s,
2063
              size_type __n2) const;
2064
    };
2065
 
2066
  // operator+
2067
  /**
2068
   *  @brief  Concatenate two strings.
2069
   *  @param __lhs  First string.
2070
   *  @param __rhs  Last string.
2071
   *  @return  New string with value of @a __lhs followed by @a __rhs.
2072
   */
2073
  template<typename _CharT, typename _Traits, typename _Alloc,
2074
           template <typename, typename, typename> class _Base>
2075
    __versa_string<_CharT, _Traits, _Alloc, _Base>
2076
    operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2077
              const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
2078
 
2079
  /**
2080
   *  @brief  Concatenate C string and string.
2081
   *  @param __lhs  First string.
2082
   *  @param __rhs  Last string.
2083
   *  @return  New string with value of @a __lhs followed by @a __rhs.
2084
   */
2085
  template<typename _CharT, typename _Traits, typename _Alloc,
2086
           template <typename, typename, typename> class _Base>
2087
    __versa_string<_CharT, _Traits, _Alloc, _Base>
2088
    operator+(const _CharT* __lhs,
2089
              const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
2090
 
2091
  /**
2092
   *  @brief  Concatenate character and string.
2093
   *  @param __lhs  First string.
2094
   *  @param __rhs  Last string.
2095
   *  @return  New string with @a __lhs followed by @a __rhs.
2096
   */
2097
  template<typename _CharT, typename _Traits, typename _Alloc,
2098
           template <typename, typename, typename> class _Base>
2099
    __versa_string<_CharT, _Traits, _Alloc, _Base>
2100
    operator+(_CharT __lhs,
2101
              const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
2102
 
2103
  /**
2104
   *  @brief  Concatenate string and C string.
2105
   *  @param __lhs  First string.
2106
   *  @param __rhs  Last string.
2107
   *  @return  New string with @a __lhs followed by @a __rhs.
2108
   */
2109
  template<typename _CharT, typename _Traits, typename _Alloc,
2110
           template <typename, typename, typename> class _Base>
2111
    __versa_string<_CharT, _Traits, _Alloc, _Base>
2112
    operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2113
              const _CharT* __rhs);
2114
 
2115
  /**
2116
   *  @brief  Concatenate string and character.
2117
   *  @param __lhs  First string.
2118
   *  @param __rhs  Last string.
2119
   *  @return  New string with @a __lhs followed by @a __rhs.
2120
   */
2121
  template<typename _CharT, typename _Traits, typename _Alloc,
2122
           template <typename, typename, typename> class _Base>
2123
    __versa_string<_CharT, _Traits, _Alloc, _Base>
2124
    operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2125
              _CharT __rhs);
2126
 
2127
#ifdef __GXX_EXPERIMENTAL_CXX0X__
2128
  template<typename _CharT, typename _Traits, typename _Alloc,
2129
           template <typename, typename, typename> class _Base>
2130
    inline __versa_string<_CharT, _Traits, _Alloc, _Base>
2131
    operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs,
2132
              const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2133
    { return std::move(__lhs.append(__rhs)); }
2134
 
2135
  template<typename _CharT, typename _Traits, typename _Alloc,
2136
           template <typename, typename, typename> class _Base>
2137
    inline __versa_string<_CharT, _Traits, _Alloc, _Base>
2138
    operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2139
              __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs)
2140
    { return std::move(__rhs.insert(0, __lhs)); }
2141
 
2142
  template<typename _CharT, typename _Traits, typename _Alloc,
2143
           template <typename, typename, typename> class _Base>
2144
    inline __versa_string<_CharT, _Traits, _Alloc, _Base>
2145
    operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs,
2146
              __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs)
2147
    {
2148
      const auto __size = __lhs.size() + __rhs.size();
2149
      const bool __cond = (__size > __lhs.capacity()
2150
                           && __size <= __rhs.capacity());
2151
      return __cond ? std::move(__rhs.insert(0, __lhs))
2152
                    : std::move(__lhs.append(__rhs));
2153
    }
2154
 
2155
  template<typename _CharT, typename _Traits, typename _Alloc,
2156
           template <typename, typename, typename> class _Base>
2157
    inline __versa_string<_CharT, _Traits, _Alloc, _Base>
2158
    operator+(const _CharT* __lhs,
2159
              __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs)
2160
    { return std::move(__rhs.insert(0, __lhs)); }
2161
 
2162
  template<typename _CharT, typename _Traits, typename _Alloc,
2163
           template <typename, typename, typename> class _Base>
2164
    inline __versa_string<_CharT, _Traits, _Alloc, _Base>
2165
    operator+(_CharT __lhs,
2166
              __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs)
2167
    { return std::move(__rhs.insert(0, 1, __lhs)); }
2168
 
2169
  template<typename _CharT, typename _Traits, typename _Alloc,
2170
           template <typename, typename, typename> class _Base>
2171
    inline __versa_string<_CharT, _Traits, _Alloc, _Base>
2172
    operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs,
2173
              const _CharT* __rhs)
2174
    { return std::move(__lhs.append(__rhs)); }
2175
 
2176
  template<typename _CharT, typename _Traits, typename _Alloc,
2177
           template <typename, typename, typename> class _Base>
2178
    inline __versa_string<_CharT, _Traits, _Alloc, _Base>
2179
    operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs,
2180
              _CharT __rhs)
2181
    { return std::move(__lhs.append(1, __rhs)); }
2182
#endif
2183
 
2184
  // operator ==
2185
  /**
2186
   *  @brief  Test equivalence of two strings.
2187
   *  @param __lhs  First string.
2188
   *  @param __rhs  Second string.
2189
   *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
2190
   */
2191
  template<typename _CharT, typename _Traits, typename _Alloc,
2192
           template <typename, typename, typename> class _Base>
2193
    inline bool
2194
    operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2195
               const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2196
    { return __lhs.compare(__rhs) == 0; }
2197
 
2198
  template<typename _CharT,
2199
           template <typename, typename, typename> class _Base>
2200
    inline typename __enable_if<std::__is_char<_CharT>::__value, bool>::__type
2201
    operator==(const __versa_string<_CharT, std::char_traits<_CharT>,
2202
               std::allocator<_CharT>, _Base>& __lhs,
2203
               const __versa_string<_CharT, std::char_traits<_CharT>,
2204
               std::allocator<_CharT>, _Base>& __rhs)
2205
    { return (__lhs.size() == __rhs.size()
2206
              && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
2207
                                                    __lhs.size())); }
2208
 
2209
  /**
2210
   *  @brief  Test equivalence of C string and string.
2211
   *  @param __lhs  C string.
2212
   *  @param __rhs  String.
2213
   *  @return  True if @a __rhs.compare(@a __lhs) == 0.  False otherwise.
2214
   */
2215
  template<typename _CharT, typename _Traits, typename _Alloc,
2216
           template <typename, typename, typename> class _Base>
2217
    inline bool
2218
    operator==(const _CharT* __lhs,
2219
               const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2220
    { return __rhs.compare(__lhs) == 0; }
2221
 
2222
  /**
2223
   *  @brief  Test equivalence of string and C string.
2224
   *  @param __lhs  String.
2225
   *  @param __rhs  C string.
2226
   *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
2227
   */
2228
  template<typename _CharT, typename _Traits, typename _Alloc,
2229
           template <typename, typename, typename> class _Base>
2230
    inline bool
2231
    operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2232
               const _CharT* __rhs)
2233
    { return __lhs.compare(__rhs) == 0; }
2234
 
2235
  // operator !=
2236
  /**
2237
   *  @brief  Test difference of two strings.
2238
   *  @param __lhs  First string.
2239
   *  @param __rhs  Second string.
2240
   *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
2241
   */
2242
  template<typename _CharT, typename _Traits, typename _Alloc,
2243
           template <typename, typename, typename> class _Base>
2244
    inline bool
2245
    operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2246
               const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2247
    { return !(__lhs == __rhs); }
2248
 
2249
  /**
2250
   *  @brief  Test difference of C string and string.
2251
   *  @param __lhs  C string.
2252
   *  @param __rhs  String.
2253
   *  @return  True if @a __rhs.compare(@a __lhs) != 0.  False otherwise.
2254
   */
2255
  template<typename _CharT, typename _Traits, typename _Alloc,
2256
           template <typename, typename, typename> class _Base>
2257
    inline bool
2258
    operator!=(const _CharT* __lhs,
2259
               const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2260
    { return !(__lhs == __rhs); }
2261
 
2262
  /**
2263
   *  @brief  Test difference of string and C string.
2264
   *  @param __lhs  String.
2265
   *  @param __rhs  C string.
2266
   *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
2267
   */
2268
  template<typename _CharT, typename _Traits, typename _Alloc,
2269
           template <typename, typename, typename> class _Base>
2270
    inline bool
2271
    operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2272
               const _CharT* __rhs)
2273
    { return !(__lhs == __rhs); }
2274
 
2275
  // operator <
2276
  /**
2277
   *  @brief  Test if string precedes string.
2278
   *  @param __lhs  First string.
2279
   *  @param __rhs  Second string.
2280
   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
2281
   */
2282
  template<typename _CharT, typename _Traits, typename _Alloc,
2283
           template <typename, typename, typename> class _Base>
2284
    inline bool
2285
    operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2286
              const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2287
    { return __lhs.compare(__rhs) < 0; }
2288
 
2289
  /**
2290
   *  @brief  Test if string precedes C string.
2291
   *  @param __lhs  String.
2292
   *  @param __rhs  C string.
2293
   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
2294
   */
2295
  template<typename _CharT, typename _Traits, typename _Alloc,
2296
           template <typename, typename, typename> class _Base>
2297
    inline bool
2298
    operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2299
              const _CharT* __rhs)
2300
    { return __lhs.compare(__rhs) < 0; }
2301
 
2302
  /**
2303
   *  @brief  Test if C string precedes string.
2304
   *  @param __lhs  C string.
2305
   *  @param __rhs  String.
2306
   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
2307
   */
2308
  template<typename _CharT, typename _Traits, typename _Alloc,
2309
           template <typename, typename, typename> class _Base>
2310
    inline bool
2311
    operator<(const _CharT* __lhs,
2312
              const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2313
    { return __rhs.compare(__lhs) > 0; }
2314
 
2315
  // operator >
2316
  /**
2317
   *  @brief  Test if string follows string.
2318
   *  @param __lhs  First string.
2319
   *  @param __rhs  Second string.
2320
   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
2321
   */
2322
  template<typename _CharT, typename _Traits, typename _Alloc,
2323
           template <typename, typename, typename> class _Base>
2324
    inline bool
2325
    operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2326
              const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2327
    { return __lhs.compare(__rhs) > 0; }
2328
 
2329
  /**
2330
   *  @brief  Test if string follows C string.
2331
   *  @param __lhs  String.
2332
   *  @param __rhs  C string.
2333
   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
2334
   */
2335
  template<typename _CharT, typename _Traits, typename _Alloc,
2336
           template <typename, typename, typename> class _Base>
2337
    inline bool
2338
    operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2339
              const _CharT* __rhs)
2340
    { return __lhs.compare(__rhs) > 0; }
2341
 
2342
  /**
2343
   *  @brief  Test if C string follows string.
2344
   *  @param __lhs  C string.
2345
   *  @param __rhs  String.
2346
   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
2347
   */
2348
  template<typename _CharT, typename _Traits, typename _Alloc,
2349
           template <typename, typename, typename> class _Base>
2350
    inline bool
2351
    operator>(const _CharT* __lhs,
2352
              const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2353
    { return __rhs.compare(__lhs) < 0; }
2354
 
2355
  // operator <=
2356
  /**
2357
   *  @brief  Test if string doesn't follow string.
2358
   *  @param __lhs  First string.
2359
   *  @param __rhs  Second string.
2360
   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
2361
   */
2362
  template<typename _CharT, typename _Traits, typename _Alloc,
2363
           template <typename, typename, typename> class _Base>
2364
    inline bool
2365
    operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2366
               const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2367
    { return __lhs.compare(__rhs) <= 0; }
2368
 
2369
  /**
2370
   *  @brief  Test if string doesn't follow C string.
2371
   *  @param __lhs  String.
2372
   *  @param __rhs  C string.
2373
   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
2374
   */
2375
  template<typename _CharT, typename _Traits, typename _Alloc,
2376
           template <typename, typename, typename> class _Base>
2377
    inline bool
2378
    operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2379
               const _CharT* __rhs)
2380
    { return __lhs.compare(__rhs) <= 0; }
2381
 
2382
  /**
2383
   *  @brief  Test if C string doesn't follow string.
2384
   *  @param __lhs  C string.
2385
   *  @param __rhs  String.
2386
   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
2387
   */
2388
  template<typename _CharT, typename _Traits, typename _Alloc,
2389
           template <typename, typename, typename> class _Base>
2390
    inline bool
2391
    operator<=(const _CharT* __lhs,
2392
               const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2393
    { return __rhs.compare(__lhs) >= 0; }
2394
 
2395
  // operator >=
2396
  /**
2397
   *  @brief  Test if string doesn't precede string.
2398
   *  @param __lhs  First string.
2399
   *  @param __rhs  Second string.
2400
   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
2401
   */
2402
  template<typename _CharT, typename _Traits, typename _Alloc,
2403
           template <typename, typename, typename> class _Base>
2404
    inline bool
2405
    operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2406
               const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2407
    { return __lhs.compare(__rhs) >= 0; }
2408
 
2409
  /**
2410
   *  @brief  Test if string doesn't precede C string.
2411
   *  @param __lhs  String.
2412
   *  @param __rhs  C string.
2413
   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
2414
   */
2415
  template<typename _CharT, typename _Traits, typename _Alloc,
2416
           template <typename, typename, typename> class _Base>
2417
    inline bool
2418
    operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2419
               const _CharT* __rhs)
2420
    { return __lhs.compare(__rhs) >= 0; }
2421
 
2422
  /**
2423
   *  @brief  Test if C string doesn't precede string.
2424
   *  @param __lhs  C string.
2425
   *  @param __rhs  String.
2426
   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
2427
   */
2428
  template<typename _CharT, typename _Traits, typename _Alloc,
2429
           template <typename, typename, typename> class _Base>
2430
    inline bool
2431
    operator>=(const _CharT* __lhs,
2432
               const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2433
    { return __rhs.compare(__lhs) <= 0; }
2434
 
2435
  /**
2436
   *  @brief  Swap contents of two strings.
2437
   *  @param __lhs  First string.
2438
   *  @param __rhs  Second string.
2439
   *
2440
   *  Exchanges the contents of @a __lhs and @a __rhs in constant time.
2441
   */
2442
  template<typename _CharT, typename _Traits, typename _Alloc,
2443
           template <typename, typename, typename> class _Base>
2444
    inline void
2445
    swap(__versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2446
         __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2447
    { __lhs.swap(__rhs); }
2448
 
2449
_GLIBCXX_END_NAMESPACE_VERSION
2450
} // namespace
2451
 
2452
namespace std _GLIBCXX_VISIBILITY(default)
2453
{
2454
_GLIBCXX_BEGIN_NAMESPACE_VERSION
2455
 
2456
  /**
2457
   *  @brief  Read stream into a string.
2458
   *  @param __is  Input stream.
2459
   *  @param __str  Buffer to store into.
2460
   *  @return  Reference to the input stream.
2461
   *
2462
   *  Stores characters from @a __is into @a __str until whitespace is
2463
   *  found, the end of the stream is encountered, or str.max_size()
2464
   *  is reached.  If is.width() is non-zero, that is the limit on the
2465
   *  number of characters stored into @a __str.  Any previous
2466
   *  contents of @a __str are erased.
2467
   */
2468
  template<typename _CharT, typename _Traits, typename _Alloc,
2469
           template <typename, typename, typename> class _Base>
2470
    basic_istream<_CharT, _Traits>&
2471
    operator>>(basic_istream<_CharT, _Traits>& __is,
2472
               __gnu_cxx::__versa_string<_CharT, _Traits,
2473
                                         _Alloc, _Base>& __str);
2474
 
2475
  /**
2476
   *  @brief  Write string to a stream.
2477
   *  @param __os  Output stream.
2478
   *  @param __str  String to write out.
2479
   *  @return  Reference to the output stream.
2480
   *
2481
   *  Output characters of @a __str into os following the same rules as for
2482
   *  writing a C string.
2483
   */
2484
  template<typename _CharT, typename _Traits, typename _Alloc,
2485
           template <typename, typename, typename> class _Base>
2486
    inline basic_ostream<_CharT, _Traits>&
2487
    operator<<(basic_ostream<_CharT, _Traits>& __os,
2488
               const __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc,
2489
               _Base>& __str)
2490
    {
2491
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
2492
      // 586. string inserter not a formatted function
2493
      return __ostream_insert(__os, __str.data(), __str.size());
2494
    }
2495
 
2496
  /**
2497
   *  @brief  Read a line from stream into a string.
2498
   *  @param __is  Input stream.
2499
   *  @param __str  Buffer to store into.
2500
   *  @param __delim  Character marking end of line.
2501
   *  @return  Reference to the input stream.
2502
   *
2503
   *  Stores characters from @a __is into @a __str until @a __delim is
2504
   *  found, the end of the stream is encountered, or str.max_size()
2505
   *  is reached.  If is.width() is non-zero, that is the limit on the
2506
   *  number of characters stored into @a __str.  Any previous
2507
   *  contents of @a __str are erased.  If @a delim was encountered,
2508
   *  it is extracted but not stored into @a __str.
2509
   */
2510
  template<typename _CharT, typename _Traits, typename _Alloc,
2511
           template <typename, typename, typename> class _Base>
2512
    basic_istream<_CharT, _Traits>&
2513
    getline(basic_istream<_CharT, _Traits>& __is,
2514
            __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str,
2515
            _CharT __delim);
2516
 
2517
  /**
2518
   *  @brief  Read a line from stream into a string.
2519
   *  @param __is  Input stream.
2520
   *  @param __str  Buffer to store into.
2521
   *  @return  Reference to the input stream.
2522
   *
2523
   *  Stores characters from is into @a __str until &apos;\n&apos; is
2524
   *  found, the end of the stream is encountered, or str.max_size()
2525
   *  is reached.  If is.width() is non-zero, that is the limit on the
2526
   *  number of characters stored into @a __str.  Any previous
2527
   *  contents of @a __str are erased.  If end of line was
2528
   *  encountered, it is extracted but not stored into @a __str.
2529
   */
2530
  template<typename _CharT, typename _Traits, typename _Alloc,
2531
           template <typename, typename, typename> class _Base>
2532
    inline basic_istream<_CharT, _Traits>&
2533
    getline(basic_istream<_CharT, _Traits>& __is,
2534
            __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str)
2535
    { return getline(__is, __str, __is.widen('\n')); }
2536
 
2537
_GLIBCXX_END_NAMESPACE_VERSION
2538
} // namespace
2539
 
2540
#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99))
2541
 
2542
#include <ext/string_conversions.h>
2543
 
2544
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
2545
{
2546
_GLIBCXX_BEGIN_NAMESPACE_VERSION
2547
 
2548
  // 21.4 Numeric Conversions [string.conversions].
2549
  inline int
2550
  stoi(const __vstring& __str, std::size_t* __idx = 0, int __base = 10)
2551
  { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
2552
                                        __idx, __base); }
2553
 
2554
  inline long
2555
  stol(const __vstring& __str, std::size_t* __idx = 0, int __base = 10)
2556
  { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
2557
                             __idx, __base); }
2558
 
2559
  inline unsigned long
2560
  stoul(const __vstring& __str, std::size_t* __idx = 0, int __base = 10)
2561
  { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
2562
                             __idx, __base); }
2563
 
2564
  inline long long
2565
  stoll(const __vstring& __str, std::size_t* __idx = 0,  int __base = 10)
2566
  { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
2567
                             __idx, __base); }
2568
 
2569
  inline unsigned long long
2570
  stoull(const __vstring& __str, std::size_t* __idx, int __base = 10)
2571
  { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
2572
                             __idx, __base); }
2573
 
2574
  // NB: strtof vs strtod.
2575
  inline float
2576
  stof(const __vstring& __str, std::size_t* __idx = 0)
2577
  { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }
2578
 
2579
  inline double
2580
  stod(const __vstring& __str, std::size_t* __idx = 0)
2581
  { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }
2582
 
2583
  inline long double
2584
  stold(const __vstring& __str, std::size_t* __idx = 0)
2585
  { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }
2586
 
2587
  // NB: (v)snprintf vs sprintf.
2588
 
2589
  // DR 1261.
2590
  inline __vstring
2591
  to_string(int __val)
2592
  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 4 * sizeof(int),
2593
                                              "%d", __val); }
2594
 
2595
  inline __vstring
2596
  to_string(unsigned __val)
2597
  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
2598
                                              4 * sizeof(unsigned),
2599
                                              "%u", __val); }
2600
 
2601
  inline __vstring
2602
  to_string(long __val)
2603
  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
2604
                                              4 * sizeof(long),
2605
                                              "%ld", __val); }
2606
 
2607
  inline __vstring
2608
  to_string(unsigned long __val)
2609
  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
2610
                                              4 * sizeof(unsigned long),
2611
                                              "%lu", __val); }
2612
 
2613
 
2614
  inline __vstring
2615
  to_string(long long __val)
2616
  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
2617
                                              4 * sizeof(long long),
2618
                                              "%lld", __val); }
2619
 
2620
  inline __vstring
2621
  to_string(unsigned long long __val)
2622
  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
2623
                                              4 * sizeof(unsigned long long),
2624
                                              "%llu", __val); }
2625
 
2626
  inline __vstring
2627
  to_string(float __val)
2628
  {
2629
    const int __n = __numeric_traits<float>::__max_exponent10 + 20;
2630
    return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n,
2631
                                              "%f", __val);
2632
  }
2633
 
2634
  inline __vstring
2635
  to_string(double __val)
2636
  {
2637
    const int __n = __numeric_traits<double>::__max_exponent10 + 20;
2638
    return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n,
2639
                                              "%f", __val);
2640
  }
2641
 
2642
  inline __vstring
2643
  to_string(long double __val)
2644
  {
2645
    const int __n = __numeric_traits<long double>::__max_exponent10 + 20;
2646
    return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n,
2647
                                              "%Lf", __val);
2648
  }
2649
 
2650
#ifdef _GLIBCXX_USE_WCHAR_T
2651
  inline int
2652
  stoi(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
2653
  { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
2654
                                        __idx, __base); }
2655
 
2656
  inline long
2657
  stol(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
2658
  { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
2659
                             __idx, __base); }
2660
 
2661
  inline unsigned long
2662
  stoul(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
2663
  { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
2664
                             __idx, __base); }
2665
 
2666
  inline long long
2667
  stoll(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
2668
  { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
2669
                             __idx, __base); }
2670
 
2671
  inline unsigned long long
2672
  stoull(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
2673
  { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
2674
                             __idx, __base); }
2675
 
2676
  // NB: wcstof vs wcstod.
2677
  inline float
2678
  stof(const __wvstring& __str, std::size_t* __idx = 0)
2679
  { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }
2680
 
2681
  inline double
2682
  stod(const __wvstring& __str, std::size_t* __idx = 0)
2683
  { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }
2684
 
2685
  inline long double
2686
  stold(const __wvstring& __str, std::size_t* __idx = 0)
2687
  { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
2688
 
2689
#ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
2690
  // DR 1261.
2691
  inline __wvstring
2692
  to_wstring(int __val)
2693
  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2694
                                               4 * sizeof(int),
2695
                                               L"%d", __val); }
2696
 
2697
  inline __wvstring
2698
  to_wstring(unsigned __val)
2699
  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2700
                                               4 * sizeof(unsigned),
2701
                                               L"%u", __val); }
2702
 
2703
  inline __wvstring
2704
  to_wstring(long __val)
2705
  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2706
                                               4 * sizeof(long),
2707
                                               L"%ld", __val); }
2708
 
2709
  inline __wvstring
2710
  to_wstring(unsigned long __val)
2711
  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2712
                                               4 * sizeof(unsigned long),
2713
                                               L"%lu", __val); }
2714
 
2715
  inline __wvstring
2716
  to_wstring(long long __val)
2717
  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2718
                                               4 * sizeof(long long),
2719
                                               L"%lld", __val); }
2720
 
2721
  inline __wvstring
2722
  to_wstring(unsigned long long __val)
2723
  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2724
                                               4 * sizeof(unsigned long long),
2725
                                               L"%llu", __val); }
2726
 
2727
  inline __wvstring
2728
  to_wstring(float __val)
2729
  {
2730
    const int __n = __numeric_traits<float>::__max_exponent10 + 20;
2731
    return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n,
2732
                                               L"%f", __val);
2733
  }
2734
 
2735
  inline __wvstring
2736
  to_wstring(double __val)
2737
  {
2738
    const int __n = __numeric_traits<double>::__max_exponent10 + 20;
2739
    return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n,
2740
                                               L"%f", __val);
2741
  }
2742
 
2743
  inline __wvstring
2744
  to_wstring(long double __val)
2745
  {
2746
    const int __n = __numeric_traits<long double>::__max_exponent10 + 20;
2747
    return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n,
2748
                                               L"%Lf", __val);
2749
  }
2750
#endif
2751
#endif
2752
 
2753
_GLIBCXX_END_NAMESPACE_VERSION
2754
} // namespace
2755
 
2756
#endif
2757
 
2758
#ifdef __GXX_EXPERIMENTAL_CXX0X__
2759
 
2760
#include <bits/functional_hash.h>
2761
 
2762
namespace std _GLIBCXX_VISIBILITY(default)
2763
{
2764
_GLIBCXX_BEGIN_NAMESPACE_VERSION
2765
 
2766
  /// std::hash specialization for __vstring.
2767
  template<>
2768
    struct hash<__gnu_cxx::__vstring>
2769
    : public __hash_base<size_t, __gnu_cxx::__vstring>
2770
    {
2771
      size_t
2772
      operator()(const __gnu_cxx::__vstring& __s) const noexcept
2773
      { return std::_Hash_impl::hash(__s.data(), __s.length()); }
2774
    };
2775
 
2776
#ifdef _GLIBCXX_USE_WCHAR_T
2777
  /// std::hash specialization for __wvstring.
2778
  template<>
2779
    struct hash<__gnu_cxx::__wvstring>
2780
    : public __hash_base<size_t, __gnu_cxx::__wvstring>
2781
    {
2782
      size_t
2783
      operator()(const __gnu_cxx::__wvstring& __s) const noexcept
2784
      { return std::_Hash_impl::hash(__s.data(),
2785
                                     __s.length() * sizeof(wchar_t)); }
2786
    };
2787
#endif
2788
 
2789
#ifdef _GLIBCXX_USE_C99_STDINT_TR1
2790
  /// std::hash specialization for __u16vstring.
2791
  template<>
2792
    struct hash<__gnu_cxx::__u16vstring>
2793
    : public __hash_base<size_t, __gnu_cxx::__u16vstring>
2794
    {
2795
      size_t
2796
      operator()(const __gnu_cxx::__u16vstring& __s) const noexcept
2797
      { return std::_Hash_impl::hash(__s.data(),
2798
                                     __s.length() * sizeof(char16_t)); }
2799
    };
2800
 
2801
  /// std::hash specialization for __u32vstring.
2802
  template<>
2803
    struct hash<__gnu_cxx::__u32vstring>
2804
    : public __hash_base<size_t, __gnu_cxx::__u32vstring>
2805
    {
2806
      size_t
2807
      operator()(const __gnu_cxx::__u32vstring& __s) const noexcept
2808
      { return std::_Hash_impl::hash(__s.data(),
2809
                                     __s.length() * sizeof(char32_t)); }
2810
    };
2811
#endif
2812
 
2813
_GLIBCXX_END_NAMESPACE_VERSION
2814
} // namespace
2815
 
2816
#endif /* __GXX_EXPERIMENTAL_CXX0X__ */
2817
 
2818
#include "vstring.tcc" 
2819
 
2820
#endif /* _VSTRING_H */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.