_string_workaround.h revision 9720d5f59b9c1f5d1b9ecbc9173dbcb71bd557be
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 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && \ 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block !defined (basic_string) 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block , public __stlport_class<basic_string<_CharT, _Traits, _Alloc> > 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: // Protected members inherited from base. 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef basic_string<_CharT, _Traits, _Alloc> _Self; 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLP_NO_MEM_T_STRING_BASE _Base; 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Base::_Char_Is_POD _Char_Is_POD; 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __IMPORT_WITH_REVERSE_ITERATORS(_Base) 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Base::_Iterator_category _Iterator_category; 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Base::traits_type traits_type; 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Base::_Reserve_t _Reserve_t; 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 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 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_string(__move_source<_Self> src) 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _STLP_NO_MEM_T_STRING_BASE(__move_source<_Base>(src.get())) {} 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Check to see if _InputIterator is an integer type. If so, then 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // it can't be an iterator. 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !(defined(__MRC__) || (defined(__SC__) && !defined(__DMC__))) //*ty 04/30/2001 - mpw compilers choke on this ctor 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIterator> 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_string(_InputIterator __f, _InputIterator __l, 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const allocator_type & __a _STLP_ALLOCATOR_TYPE_DFL) 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _STLP_NO_MEM_T_STRING_BASE(_Base::_CalledFromWorkaround_t(), __a) { 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _IsIntegral<_InputIterator>::_Ret _Integral; 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_initialize_dispatch(__f, __l, _Integral()); 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS) 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIterator> 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_string(_InputIterator __f, _InputIterator __l) 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _STLP_NO_MEM_T_STRING_BASE(_Base::_CalledFromWorkaround_t(), allocator_type()) { 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _IsIntegral<_InputIterator>::_Ret _Integral; 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_initialize_dispatch(__f, __l, _Integral()); 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* !__MRC__ || (__SC__ && !__DMC__) */ 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()); 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_appendT(__f, __l, __tag); 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND(this->_M_destroy_range()) 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _ForwardIter> 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_range_initialize(_ForwardIter __f, _ForwardIter __l, 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const forward_iterator_tag &) { 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block difference_type __n = distance(__f, __l); 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_allocate_block(__n + 1); 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_SHORT_STRING_OPTIM) 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (this->_M_using_static_buf()) { 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copyT(__f, __l, this->_M_Start()); 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_finish = this->_M_Start() + __n; 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SHORT_STRING_OPTIM */ 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_finish = uninitialized_copy(__f, __l, this->_M_Start()); 1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_terminate_string(); 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_range_initializeT(_InputIter __f, _InputIter __l) { 1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_range_initialize(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter)); 1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _Integer> 1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_initialize_dispatch(_Integer __n, _Integer __x, const __true_type& /*_Integral*/) { 1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_allocate_block(__n + 1); 1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_SHORT_STRING_OPTIM) 1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (this->_M_using_static_buf()) { 1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Traits::assign(this->_M_Start(), __n, __x); 1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_finish = this->_M_Start() + __n; 1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SHORT_STRING_OPTIM */ 1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_finish = uninitialized_fill_n(this->_M_Start(), __n, __x); 1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_terminate_string(); 1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_initialize_dispatch(_InputIter __f, _InputIter __l, const __false_type& /*_Integral*/) { 1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_range_initializeT(__f, __l); 1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Append, operator+=, push_back. 1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator+=(const _Self& __s) { 1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::operator+=(__s); 1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator+=(const _CharT* __s) { 1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::operator+=(__s); 1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator+=(_CharT __c) { 1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::operator+=(__c); 1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(const _Self& __s) { 1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::append(__s); 1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(const _Self& __s, 1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __pos, size_type __n) { 1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::append(__s, __pos, __n); 1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(const _CharT* __s, size_type __n) { 1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::append(__s, __n); 1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(const _CharT* __s) { 1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::append(__s); 1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(size_type __n, _CharT __c) { 2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::append(__n, __c); 2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Check to see if _InputIterator is an integer type. If so, then 2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // it can't be an iterator. 2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(_InputIter __first, _InputIter __last) { 2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _IsIntegral<_InputIter>::_Ret _Integral; 2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_append_dispatch(__first, __last, _Integral()); 2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_METHOD_SPECIALIZATION) && !defined (_STLP_NO_EXTENSIONS) 2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //See equivalent assign method remark. 2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(const _CharT* __f, const _CharT* __l) { 2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__f)_STLP_FIX_LITERAL_BUG(__l) 2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::append(__f, __l); 2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: // Helper functions for append. 2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_appendT(_InputIter __first, _InputIter __last, 2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const input_iterator_tag &) { 2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( ; __first != __last ; ++__first) 2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::push_back(*__first); 2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _ForwardIter> 2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_appendT(_ForwardIter __first, _ForwardIter __last, 2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const forward_iterator_tag &) { 2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__first != __last) { 2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_type __old_size = this->size(); 2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block difference_type __n = distance(__first, __last); 2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__STATIC_CAST(size_type,__n) > max_size() || __old_size > max_size() - __STATIC_CAST(size_type,__n)) 2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_throw_length_error(); 2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__old_size + __n > capacity()) { 2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_type __len = __old_size + 2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block (max)(__old_size, __STATIC_CAST(size_type,__n)) + 1; 2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pointer __new_start = this->_M_end_of_storage.allocate(__len); 2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pointer __new_finish = __new_start; 2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __new_finish = uninitialized_copy(this->_M_Start(), this->_M_Finish(), __new_start); 2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __new_finish = uninitialized_copy(__first, __last, __new_finish); 2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_construct_null(__new_finish); 2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start,__new_finish), 2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_end_of_storage.deallocate(__new_start,__len))) 2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_destroy_range(); 2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_deallocate_block(); 2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_reset(__new_start, __new_finish, __new_start + __len); 2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ForwardIter __f1 = __first; 2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__f1; 2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_SHORT_STRING_OPTIM) 2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (this->_M_using_static_buf()) 2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copyT(__f1, __last, this->_M_Finish() + 1); 2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SHORT_STRING_OPTIM */ 2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block uninitialized_copy(__f1, __last, this->_M_Finish() + 1); 2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_construct_null(this->_M_Finish() + __n); 2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND(this->_M_destroy_ptr_range(this->_M_Finish() + 1, this->_M_Finish() + __n)) 2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Traits::assign(*this->_M_finish, *__first); 2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_finish += __n; 2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _Integer> 2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_append_dispatch(_Integer __n, _Integer __x, const __true_type& /*Integral*/) { 2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return append((size_type) __n, (_CharT) __x); 2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_append_dispatch(_InputIter __f, _InputIter __l, const __false_type& /*Integral*/) { 2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_appendT(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter)); 2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Assign 2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& assign(const _Self& __s) { 2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::assign(__s); 2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& assign(const _Self& __s, 2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __pos, size_type __n) { 2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::assign(__s, __pos, __n); 2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& assign(const _CharT* __s, size_type __n) { 3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::assign(__s, __n); 3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& assign(const _CharT* __s) { 3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::assign(__s); 3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& assign(size_type __n, _CharT __c) { 3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::assign(__n, __c); 3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: // Helper functions for assign. 3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _Integer> 3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_assign_dispatch(_Integer __n, _Integer __x, const __true_type& /*_Integral*/) { 3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return assign((size_type) __n, (_CharT) __x); 3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_assign_dispatch(_InputIter __f, _InputIter __l, const __false_type& /*_Integral*/) { 3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pointer __cur = this->_M_Start(); 3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block while (__f != __l && __cur != this->_M_Finish()) { 3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Traits::assign(*__cur, *__f); 3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__f; 3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__cur; 3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__f == __l) 3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::erase(__cur, this->_M_Finish()); 3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_appendT(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter)); 3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Check to see if _InputIterator is an integer type. If so, then 3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // it can't be an iterator. 3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& assign(_InputIter __first, _InputIter __last) { 3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _IsIntegral<_InputIter>::_Ret _Integral; 3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_assign_dispatch(__first, __last, _Integral()); 3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_METHOD_SPECIALIZATION) && !defined (_STLP_NO_EXTENSIONS) 3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* This method is not part of the standard and is a specialization of the 3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * template method assign. It is only granted for convenience to call assign 3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * with mixed parameters iterator and const_iterator. 3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& assign(const _CharT* __f, const _CharT* __l) { 3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__f)_STLP_FIX_LITERAL_BUG(__l) 3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::assign(__f, __l); 3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Insert 3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& insert(size_type __pos, const _Self& __s) { 3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::insert(__pos, __s); 3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& insert(size_type __pos, const _Self& __s, 3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __beg, size_type __n) { 3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::insert(__pos, __s, __beg, __n); 3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& insert(size_type __pos, const _CharT* __s, size_type __n) { 3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::insert(__pos, __s, __n); 3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& insert(size_type __pos, const _CharT* __s) { 3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::insert(__pos, __s); 3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& insert(size_type __pos, size_type __n, _CharT __c) { 3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::insert(__pos, __n, __c); 3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator insert(iterator __p, _CharT __c) { 3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Base::insert(__p, __c); 3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(iterator __p, size_t __n, _CharT __c) { 3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::insert(__p, __n, __c); 3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Check to see if _InputIterator is an integer type. If so, then 3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // it can't be an iterator. 3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(iterator __p, _InputIter __first, _InputIter __last) { 4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _IsIntegral<_InputIter>::_Ret _Integral; 4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_insert_dispatch(__p, __first, __last, _Integral()); 4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: // Helper functions for insert. 4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_insert(iterator __p, const _CharT* __f, const _CharT* __l, bool __self_ref) { 4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__f)_STLP_FIX_LITERAL_BUG(__l) 4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::_M_insert(__p, __f, __l, __self_ref); 4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _ForwardIter> 4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_insert_overflow(iterator __position, _ForwardIter __first, _ForwardIter __last, 4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block difference_type __n) { 4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_type __old_size = this->size(); 4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_type __len = __old_size + (max)(__old_size, __STATIC_CAST(size_type,__n)) + 1; 4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pointer __new_start = this->_M_end_of_storage.allocate(__len); 4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pointer __new_finish = __new_start; 4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __new_finish = uninitialized_copy(this->_M_Start(), __position, __new_start); 4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __new_finish = uninitialized_copy(__first, __last, __new_finish); 4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __new_finish = uninitialized_copy(__position, this->_M_Finish(), __new_finish); 4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_construct_null(__new_finish); 4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start,__new_finish), 4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_end_of_storage.deallocate(__new_start,__len))) 4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_destroy_range(); 4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_deallocate_block(); 4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_reset(__new_start, __new_finish, __new_start + __len); 4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_insertT(iterator __p, _InputIter __first, _InputIter __last, 4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const input_iterator_tag &) { 4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( ; __first != __last; ++__first) { 4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __p = insert(__p, *__first); 4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__p; 4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _ForwardIter> 4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_insertT(iterator __position, _ForwardIter __first, _ForwardIter __last, 4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const forward_iterator_tag &) { 4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__first != __last) { 4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block difference_type __n = distance(__first, __last); 4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (this->_M_end_of_storage._M_data - this->_M_finish >= __n + 1) { 4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const difference_type __elems_after = this->_M_finish - __position; 4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__elems_after >= __n) { 4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_SHORT_STRING_OPTIM) 4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (this->_M_using_static_buf()) 4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::_M_copy((this->_M_Finish() - __n) + 1, this->_M_Finish() + 1, this->_M_Finish() + 1); 4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SHORT_STRING_OPTIM */ 4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block uninitialized_copy((this->_M_Finish() - __n) + 1, this->_M_Finish() + 1, this->_M_Finish() + 1); 4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_finish += __n; 4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Traits::move(__position + __n, __position, (__elems_after - __n) + 1); 4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copyT(__first, __last, __position); 4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pointer __old_finish = this->_M_Finish(); 4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ForwardIter __mid = __first; 4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block advance(__mid, __elems_after + 1); 4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_SHORT_STRING_OPTIM) 4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (this->_M_using_static_buf()) 4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copyT(__mid, __last, this->_M_Finish() + 1); 4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SHORT_STRING_OPTIM */ 4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block uninitialized_copy(__mid, __last, this->_M_Finish() + 1); 4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_finish += __n - __elems_after; 4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_SHORT_STRING_OPTIM) 4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (this->_M_using_static_buf()) 4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::_M_copy(__position, __old_finish + 1, this->_M_Finish()); 4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SHORT_STRING_OPTIM */ 4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block uninitialized_copy(__position, __old_finish + 1, this->_M_Finish()); 4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_finish += __elems_after; 4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND((this->_M_destroy_ptr_range(__old_finish + 1, this->_M_Finish()), 4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_finish = __old_finish)) 4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copyT(__first, __mid, __position); 4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_insert_overflow(__position, __first, __last, __n); 4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _Integer> 4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_insert_dispatch(iterator __p, _Integer __n, _Integer __x, 4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const __true_type& /*Integral*/) { 4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block insert(__p, (size_type) __n, (_CharT) __x); 4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_insert_dispatch(iterator __p, _InputIter __first, _InputIter __last, 4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const __false_type& /*Integral*/) { 4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__p) 4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* 5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Within the basic_string implementation we are only going to check for 5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * self referencing if iterators are string iterators or _CharT pointers. 5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * A user could encapsulate those iterator within their own iterator interface 5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * and in this case lead to a bad behavior, this is a known limitation. 5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _AreSameUnCVTypes<_InputIter, iterator>::_Ret _IsIterator; 5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _AreSameUnCVTypes<_InputIter, const_iterator>::_Ret _IsConstIterator; 5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Lor2<_IsIterator, _IsConstIterator>::_Ret _CheckInside; 5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_insert_aux(__p, __first, __last, _CheckInside()); 5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _RandomIter> 5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_insert_aux (iterator __p, _RandomIter __first, _RandomIter __last, 5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const __true_type& /*_CheckInside*/) { 5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__p) 5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_insert(__p, &(*__first), &(*__last), _Base::_M_inside(&(*__first))); 5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template<class _InputIter> 5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_insert_aux (iterator __p, _InputIter __first, _InputIter __last, 5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const __false_type& /*_CheckInside*/) { 5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__p) 5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_insertT(__p, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter)); 5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIterator> 5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_copyT(_InputIterator __first, _InputIterator __last, pointer __result) { 5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__p) 5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( ; __first != __last; ++__first, ++__result) 5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Traits::assign(*__result, *__first); 5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_METHOD_SPECIALIZATION) 5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_copyT(const _CharT* __f, const _CharT* __l, _CharT* __res) { 5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l) _STLP_FIX_LITERAL_BUG(__res) 5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::_M_copy(__f, __l, __res); 5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Erase. 5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& erase(size_type __pos = 0, size_type __n = npos) { 5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::erase(__pos, __n); 5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator erase(iterator __pos) { 5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__pos) 5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Base::erase(__pos); 5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator erase(iterator __first, iterator __last) { 5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Base::erase(__first, __last); 5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Replace. (Conceptually equivalent 5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // to erase followed by insert.) 5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(size_type __pos, size_type __n, const _Self& __s) { 5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::replace(__pos, __n, __s); 5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(size_type __pos1, size_type __n1, const _Self& __s, 5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __pos2, size_type __n2) { 5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::replace(__pos1, __n1, __s, __pos2, __n2); 5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(size_type __pos, size_type __n1, 5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __s, size_type __n2) { 5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::replace(__pos, __n1, __s, __n2); 5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(size_type __pos, size_type __n1, const _CharT* __s) { 5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::replace(__pos, __n1, __s); 5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(size_type __pos, size_type __n1, 5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __n2, _CharT __c) { 5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::replace(__pos, __n1, __n2, __c); 5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(iterator __first, iterator __last, const _Self& __s) { 5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::replace(__first, __last, __s); 5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(iterator __first, iterator __last, 5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __s, size_type __n) { 5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::replace(__first, __last, __s, __n); 5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(iterator __first, iterator __last, 6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __s) { 6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__s) 6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::replace(__first, __last, __s); 6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(iterator __first, iterator __last, 6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __n, _CharT __c) { 6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::replace(__first, __last, __n, __c); 6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Check to see if _InputIter is an integer type. If so, then 6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // it can't be an iterator. 6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(iterator __first, iterator __last, 6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _InputIter __f, _InputIter __l) { 6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first)_STLP_FIX_LITERAL_BUG(__last) 6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _IsIntegral<_InputIter>::_Ret _Integral; 6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_replace_dispatch(__first, __last, __f, __l, _Integral()); 6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_METHOD_SPECIALIZATION) && !defined (_STLP_NO_EXTENSIONS) 6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& replace(iterator __first, iterator __last, 6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __f, const _CharT* __l) { 6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l) 6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::replace(__first, __last, __f, __l); 6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: // Helper functions for replace. 6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_replace(iterator __first, iterator __last, 6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __f, const _CharT* __l, bool __self_ref) { 6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l) 6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::_M_replace(__first, __last, __f, __l, __self_ref); 6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _Integer> 6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_replace_dispatch(iterator __first, iterator __last, 6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Integer __n, _Integer __x, const __true_type& /*IsIntegral*/) { 6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return replace(__first, __last, (size_type) __n, (_CharT) __x); 6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_replace_dispatch(iterator __first, iterator __last, 6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _InputIter __f, _InputIter __l, const __false_type& /*IsIntegral*/) { 6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _AreSameUnCVTypes<_InputIter, iterator>::_Ret _IsIterator; 6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _AreSameUnCVTypes<_InputIter, const_iterator>::_Ret _IsConstIterator; 6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Lor2<_IsIterator, _IsConstIterator>::_Ret _CheckInside; 6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_replace_aux(__first, __last, __f, __l, _CheckInside()); 6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _RandomIter> 6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_replace_aux(iterator __first, iterator __last, 6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RandomIter __f, _RandomIter __l, __true_type const& /*_CheckInside*/) { 6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_replace(__first, __last, &(*__f), &(*__l), _Base::_M_inside(&(*__f))); 6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_replace_aux(iterator __first, iterator __last, 6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _InputIter __f, _InputIter __l, __false_type const& /*_CheckInside*/) { 6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_replaceT(__first, __last, __f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter)); 6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _InputIter> 6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_replaceT(iterator __first, iterator __last, 6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _InputIter __f, _InputIter __l, const input_iterator_tag&__ite_tag) { 6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( ; __first != __last && __f != __l; ++__first, ++__f) 6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Traits::assign(*__first, *__f); 6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__f == __l) 6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::erase(__first, __last); 6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_insertT(__last, __f, __l, __ite_tag); 6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _ForwardIter> 6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& _M_replaceT(iterator __first, iterator __last, 6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ForwardIter __f, _ForwardIter __l, const forward_iterator_tag &__ite_tag) { 6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) 6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block difference_type __n = distance(__f, __l); 6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const difference_type __len = __last - __first; 6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__len >= __n) { 6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copyT(__f, __l, __first); 6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::erase(__first + __n, __last); 6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ForwardIter __m = __f; 7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block advance(__m, __len); 7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copyT(__f, __m, __first); 7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_insertT(__last, __m, __l, __ite_tag); 7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Other modifier member functions. 7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void swap(_Self& __s) 7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { _Base::swap(__s); } 7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Substring. 7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self substr(size_type __pos = 0, size_type __n = npos) const 7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return _Self(*this, __pos, __n, get_allocator()); } 7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_TEMPLATE_EXPRESSION) && !defined (_STLP_DEBUG) 7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define _STLP_STRING_SUM_BASE _STLP_NO_MEM_T_STRING_BASE 7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_string_sum_methods.h> 7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# undef _STLP_STRING_SUM_BASE 7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_NO_MEM_T_STRING_BASE 7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (basic_string) 7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# undef basic_string 7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 734