19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 2004
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Francois Dumont
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//Included from _string.h, no need for macro guarding.
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG)
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define basic_string _STLP_NON_DBG_NAME(str)
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_NO_MEM_T_STRING_BASE _STLP_PRIV _STLP_NO_MEM_T_NAME(str)<_CharT, _Traits, _Alloc>
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc>
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass basic_string : public _STLP_NO_MEM_T_STRING_BASE
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (basic_string)
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   , public __stlport_class<basic_string<_CharT, _Traits, _Alloc> >
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprivate:                        // Protected members inherited from base.
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef basic_string<_CharT, _Traits, _Alloc> _Self;
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_NO_MEM_T_STRING_BASE _Base;
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef typename _Base::_CalledFromWorkaround_t _CalledFromWorkaround_t;
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __IMPORT_WITH_REVERSE_ITERATORS(_Base)
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::_Iterator_category _Iterator_category;
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::traits_type traits_type;
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::_Reserve_t _Reserve_t;
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <stl/_string_npos.h>
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Constructor, destructor, assignment.
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit basic_string(const allocator_type& __a = allocator_type())
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_NO_MEM_T_STRING_BASE(__a) {}
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_string(_Reserve_t __r, size_t __n,
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block               const allocator_type& __a = allocator_type())
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_NO_MEM_T_STRING_BASE(__r, __n, __a) {}
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_string(const _Self& __s)
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_NO_MEM_T_STRING_BASE(__s) {}
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_string(const _Self& __s, size_type __pos, size_type __n = npos,
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block               const allocator_type& __a = allocator_type())
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_NO_MEM_T_STRING_BASE(__s, __pos, __n, __a) {}
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_string(const _CharT* __s, size_type __n,
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block               const allocator_type& __a = allocator_type())
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_NO_MEM_T_STRING_BASE(__s, __n, __a) {}
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_string(const _CharT* __s,
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block               const allocator_type& __a = allocator_type())
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_NO_MEM_T_STRING_BASE(__s, __a) {}
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_string(size_type __n, _CharT __c,
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block               const allocator_type& __a = allocator_type())
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_NO_MEM_T_STRING_BASE(__n, __c, __a) {}
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_string(__move_source<_Self> src)
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_NO_MEM_T_STRING_BASE(__move_source<_Base>(src.get())) {}
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check to see if _InputIterator is an integer type.  If so, then
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // it can't be an iterator.
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_string(_InputIterator __f, _InputIterator __l,
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block               const allocator_type & __a _STLP_ALLOCATOR_TYPE_DFL)
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _STLP_NO_MEM_T_STRING_BASE(_CalledFromWorkaround_t(), __a) {
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_initialize_dispatch(__f, __l, _Integral());
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_string(_InputIterator __f, _InputIterator __l)
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _STLP_NO_MEM_T_STRING_BASE(_CalledFromWorkaround_t(), allocator_type()) {
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_initialize_dispatch(__f, __l, _Integral());
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator=(const _Self& __s) {
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::operator=(__s);
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator=(const _CharT* __s) {
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::operator=(__s);
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator=(_CharT __c) {
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::operator=(__c);
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_initialize(_InputIter __f, _InputIter __l,
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const input_iterator_tag &__tag) {
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_allocate_block();
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_construct_null(this->_M_Finish());
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_appendT(__f, __l, __tag);
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIter>
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_initialize(_ForwardIter __f, _ForwardIter __l,
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const forward_iterator_tag &) {
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    difference_type __n = _STLP_STD::distance(__f, __l);
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_allocate_block(__n + 1);
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = uninitialized_copy(__f, __l, this->_M_Start());
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_terminate_string();
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_initializeT(_InputIter __f, _InputIter __l) {
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_range_initialize(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter));
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize_dispatch(_Integer __n, _Integer __x, const __true_type& /*_Integral*/) {
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_allocate_block(__n + 1);
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = uninitialized_fill_n(this->_M_Start(), __n, __x);
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_terminate_string();
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize_dispatch(_InputIter __f, _InputIter __l, const __false_type& /*_Integral*/) {
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_range_initializeT(__f, __l);
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Append, operator+=, push_back.
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+=(const _Self& __s) {
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::operator+=(__s);
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+=(const _CharT* __s) {
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::operator+=(__s);
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+=(_CharT __c) {
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::operator+=(__c);
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& append(const _Self& __s) {
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::append(__s);
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& append(const _Self& __s,
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                size_type __pos, size_type __n) {
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::append(__s, __pos, __n);
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& append(const _CharT* __s, size_type __n) {
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::append(__s, __n);
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& append(const _CharT* __s) {
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::append(__s);
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& append(size_type __n, _CharT __c) {
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::append(__n, __c);
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check to see if _InputIterator is an integer type.  If so, then
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // it can't be an iterator.
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& append(_InputIter __first, _InputIter __last) {
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIter>::_Ret _Integral;
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_append_dispatch(__first, __last, _Integral());
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_METHOD_SPECIALIZATION) && !defined (_STLP_NO_EXTENSIONS)
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //See equivalent assign method remark.
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& append(const _CharT* __f, const _CharT* __l) {
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__f)_STLP_FIX_LITERAL_BUG(__l)
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::append(__f, __l);
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:                        // Helper functions for append.
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& _M_appendT(_InputIter __first, _InputIter __last,
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   const input_iterator_tag &) {
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first != __last ; ++__first)
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Base::push_back(*__first);
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIter>
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& _M_appendT(_ForwardIter __first, _ForwardIter __last,
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    const forward_iterator_tag &)  {
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first != __last) {
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      const size_type __n = __STATIC_CAST(size_type, _STLP_STD::distance(__first, __last));
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (__n >= this->_M_rest()) {
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        size_type __len = this->_M_compute_next_size(__n);
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pointer __new_start = this->_M_start_of_storage.allocate(__len, __len);
223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pointer __new_finish = uninitialized_copy(this->_M_Start(), this->_M_Finish(), __new_start);
224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        __new_finish = uninitialized_copy(__first, __last, __new_finish);
225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        this->_M_construct_null(__new_finish);
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_deallocate_block();
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_reset(__new_start, __new_finish, __new_start + __len);
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _Traits::assign(*this->_M_finish, *__first++);
231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        uninitialized_copy(__first, __last, this->_M_Finish() + 1);
232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        this->_M_construct_null(this->_M_Finish() + __n);
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish += __n;
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Self& _M_append_dispatch(_Integer __n, _Integer __x, const __true_type& /*Integral*/)
241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return append((size_type) __n, (_CharT) __x); }
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Self& _M_append_dispatch(_InputIter __f, _InputIter __l, const __false_type& /*Integral*/)
245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _M_appendT(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter)); }
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Assign
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& assign(const _Self& __s) {
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::assign(__s);
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& assign(const _Self& __s,
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                size_type __pos, size_type __n) {
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::assign(__s, __pos, __n);
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& assign(const _CharT* __s, size_type __n) {
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::assign(__s, __n);
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& assign(const _CharT* __s) {
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::assign(__s);
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& assign(size_type __n, _CharT __c) {
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::assign(__n, __c);
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:                        // Helper functions for assign.
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Self& _M_assign_dispatch(_Integer __n, _Integer __x, const __true_type& /*_Integral*/)
280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return assign((size_type) __n, (_CharT) __x); }
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& _M_assign_dispatch(_InputIter __f, _InputIter __l, const __false_type& /*_Integral*/)  {
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pointer __cur = this->_M_Start();
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__f != __l && __cur != this->_M_Finish()) {
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Traits::assign(*__cur, *__f);
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__f;
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__cur;
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__f == __l)
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Base::erase(__cur, this->_M_Finish());
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_appendT(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter));
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check to see if _InputIterator is an integer type.  If so, then
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // it can't be an iterator.
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& assign(_InputIter __first, _InputIter __last) {
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIter>::_Ret _Integral;
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_assign_dispatch(__first, __last, _Integral());
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_METHOD_SPECIALIZATION) && !defined (_STLP_NO_EXTENSIONS)
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  /* This method is not part of the standard and is a specialization of the
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   * template method assign. It is only granted for convenience to call assign
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   * with mixed parameters iterator and const_iterator.
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   */
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& assign(const _CharT* __f, const _CharT* __l) {
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__f)_STLP_FIX_LITERAL_BUG(__l)
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::assign(__f, __l);
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Insert
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& insert(size_type __pos, const _Self& __s) {
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::insert(__pos, __s);
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& insert(size_type __pos, const _Self& __s,
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                size_type __beg, size_type __n) {
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::insert(__pos, __s, __beg, __n);
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& insert(size_type __pos, const _CharT* __s, size_type __n) {
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::insert(__pos, __s, __n);
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& insert(size_type __pos, const _CharT* __s) {
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::insert(__pos, __s);
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& insert(size_type __pos, size_type __n, _CharT __c) {
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::insert(__pos, __n, __c);
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  iterator insert(iterator __p, _CharT __c)
347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _Base::insert(__p, __c); }
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void insert(iterator __p, size_t __n, _CharT __c)
350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { _Base::insert(__p, __n, __c); }
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check to see if _InputIterator is an integer type.  If so, then
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // it can't be an iterator.
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __p, _InputIter __first, _InputIter __last) {
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIter>::_Ret _Integral;
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_dispatch(__p, __first, __last, _Integral());
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
360e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_METHOD_SPECIALIZATION)
361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpublic:
362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void insert(iterator __p, const _CharT* __f, const _CharT* __l) {
363e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_insert(__p, __f, __l, this->_M_inside(__f));
365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprivate:  // Helper functions for insert.
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert(iterator __p, const _CharT* __f, const _CharT* __l, bool __self_ref) {
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__f)_STLP_FIX_LITERAL_BUG(__l)
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::_M_insert(__p, __f, __l, __self_ref);
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIter>
375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_insert_overflow(iterator __pos, _ForwardIter __first, _ForwardIter __last,
376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                          size_type __n) {
377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_type __len = this->_M_compute_next_size(__n);
378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    pointer __new_start = this->_M_start_of_storage.allocate(__len, __len);
379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    pointer __new_finish = uninitialized_copy(this->_M_Start(), __pos, __new_start);
380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __new_finish = uninitialized_copy(__first, __last, __new_finish);
381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __new_finish = uninitialized_copy(__pos, this->_M_Finish(), __new_finish);
382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    this->_M_construct_null(__new_finish);
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_deallocate_block();
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_reset(__new_start, __new_finish, __new_start + __len);
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insertT(iterator __p, _InputIter __first, _InputIter __last,
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  const input_iterator_tag &) {
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first != __last; ++__first) {
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __p = insert(__p, *__first);
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__p;
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIter>
397e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_insertT(iterator __pos, _ForwardIter __first, _ForwardIter __last,
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  const forward_iterator_tag &) {
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first != __last) {
400e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      size_type __n = __STATIC_CAST(size_type, _STLP_STD::distance(__first, __last));
401e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (__n < this->_M_rest()) {
402e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        const size_type __elems_after = this->_M_finish - __pos;
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__elems_after >= __n) {
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          uninitialized_copy((this->_M_Finish() - __n) + 1, this->_M_Finish() + 1, this->_M_Finish() + 1);
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->_M_finish += __n;
406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _Traits::move(__pos + __n, __pos, (__elems_after - __n) + 1);
407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _M_copyT(__first, __last, __pos);
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        else {
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          pointer __old_finish = this->_M_Finish();
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _ForwardIter __mid = __first;
412e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::advance(__mid, __elems_after + 1);
413e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::uninitialized_copy(__mid, __last, this->_M_Finish() + 1);
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->_M_finish += __n - __elems_after;
415e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          uninitialized_copy(__pos, __old_finish + 1, this->_M_Finish());
416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          this->_M_finish += __elems_after;
417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _M_copyT(__first, __mid, __pos);
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
421e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _M_insert_overflow(__pos, __first, __last, __n);
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_dispatch(iterator __p, _Integer __n, _Integer __x,
428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                          const __true_type& /*Integral*/)
429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { insert(__p, (size_type) __n, (_CharT) __x); }
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_dispatch(iterator __p, _InputIter __first, _InputIter __last,
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type& /*Integral*/) {
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__p)
435e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* We are forced to do a temporary string to avoid the self referencing issue. */
436e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const _Self __self(__first, __last, this->get_allocator());
437e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_insertT(__p, __self.begin(), __self.end(), _STLP_ITERATOR_CATEGORY(__first, _InputIter));
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_copyT(_InputIterator __first, _InputIterator __last, pointer __result) {
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__p)
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first != __last; ++__first, ++__result)
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Traits::assign(*__result, *__first);
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_METHOD_SPECIALIZATION)
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_copyT(const _CharT* __f, const _CharT* __l, _CharT* __res) {
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l) _STLP_FIX_LITERAL_BUG(__res)
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::_M_copy(__f, __l, __res);
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Erase.
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& erase(size_type __pos = 0, size_type __n = npos) {
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::erase(__pos, __n);
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __pos) {
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__pos)
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _Base::erase(__pos);
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __first, iterator __last) {
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _Base::erase(__first, __last);
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Replace.  (Conceptually equivalent
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                // to erase followed by insert.)
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(size_type __pos, size_type __n, const _Self& __s) {
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::replace(__pos, __n, __s);
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(size_type __pos1, size_type __n1, const _Self& __s,
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 size_type __pos2, size_type __n2) {
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::replace(__pos1, __n1, __s, __pos2, __n2);
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(size_type __pos, size_type __n1,
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 const _CharT* __s, size_type __n2) {
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::replace(__pos, __n1, __s, __n2);
4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(size_type __pos, size_type __n1, const _CharT* __s) {
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::replace(__pos, __n1, __s);
4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(size_type __pos, size_type __n1,
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 size_type __n2, _CharT __c) {
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::replace(__pos, __n1, __n2, __c);
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(iterator __first, iterator __last, const _Self& __s) {
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::replace(__first, __last, __s);
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(iterator __first, iterator __last,
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 const _CharT* __s, size_type __n) {
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::replace(__first, __last, __s, __n);
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(iterator __first, iterator __last,
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 const _CharT* __s) {
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__s)
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::replace(__first, __last, __s);
5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(iterator __first, iterator __last,
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 size_type __n, _CharT __c) {
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::replace(__first, __last, __n, __c);
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check to see if _InputIter is an integer type.  If so, then
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // it can't be an iterator.
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(iterator __first, iterator __last,
5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 _InputIter __f, _InputIter __l) {
5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__first)_STLP_FIX_LITERAL_BUG(__last)
5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIter>::_Ret _Integral;
538e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return _M_replace_dispatch(__first, __last, __f, __l, _Integral());
5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
541e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_METHOD_SPECIALIZATION)
5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& replace(iterator __first, iterator __last,
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 const _CharT* __f, const _CharT* __l) {
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
546e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return _M_replace(__first, __last, __f, __l, this->_M_inside(__f));
5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
550e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprivate:                        // Helper functions for replace.
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& _M_replace(iterator __first, iterator __last,
5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    const _CharT* __f, const _CharT* __l, bool __self_ref) {
5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Base::_M_replace(__first, __last, __f, __l, __self_ref);
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& _M_replace_dispatch(iterator __first, iterator __last,
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             _Integer __n, _Integer __x, const __true_type& /*IsIntegral*/) {
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return replace(__first, __last, (size_type) __n, (_CharT) __x);
5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& _M_replace_dispatch(iterator __first, iterator __last,
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             _InputIter __f, _InputIter __l, const __false_type& /*IsIntegral*/) {
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
570e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* We are forced to do a temporary string to avoid the self referencing issue. */
571e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const _Self __self(__f, __l, this->get_allocator());
572e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return _M_replace(__first, __last, __self._M_Start(), __self._M_Finish(), false);
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Other modifier member functions.
576e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void swap(_Self& __s) { _Base::swap(__s); }
577e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
578e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_swap_workaround(_Self& __x) { swap(__x); }
579e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Substring.
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self substr(size_type __pos = 0, size_type __n = npos) const
583e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _Self(*this, __pos, __n, this->get_allocator()); }
5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_TEMPLATE_EXPRESSION) && !defined (_STLP_DEBUG)
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _STLP_STRING_SUM_BASE _STLP_NO_MEM_T_STRING_BASE
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_string_sum_methods.h>
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef _STLP_STRING_SUM_BASE
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_NO_MEM_T_STRING_BASE
5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (basic_string)
5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef basic_string
5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
600