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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libstdc++-v3/] [include/] [bits/] [basic_string.h] - Blame information for rev 749

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

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

powered by: WebSVN 2.1.0

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