177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1994 377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Hewlett-Packard Company 477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1996,1997 677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc. 777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1997 977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Moscow Center for SPARC Technology 1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999 1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev 1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed 1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk. 1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted 1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies. 1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted, 2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was 2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice. 2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_STRING_C 2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_STRING_C 2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_STRING_H 2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_string.h> 2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_CTRAITS_FUNCTIONS_H 3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_ctraits_fns.h> 3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_FUNCTION_H 3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_function.h> 3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND) 4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define basic_string _STLP_NO_MEM_T_NAME(str) 4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#elif defined (_STLP_DEBUG) 4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define basic_string _STLP_NON_DBG_NAME(str) 4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_NESTED_TYPE_PARAM_BUG) 4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define __size_type__ size_t 4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define size_type size_t 4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define iterator _CharT* 4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define __size_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_string<_CharT,_Traits,_Alloc>::size_type 5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE 5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE 5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// A helper class to use a char_traits as a function object. 5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Traits> 5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Not_within_traits : public unary_function<typename _Traits::char_type, bool> { 6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Traits::char_type _CharT; 6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* _M_first; 6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* _M_last; 6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Not_within_traits(const _CharT* __f, const _CharT* __l) 6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_first(__f), _M_last(__l) {} 6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool operator()(const _CharT& __x) const { 6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return find_if(_M_first, _M_last, 6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV _Eq_char_bound<_Traits>(__x)) == _M_last; 7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _InputIter, class _CharT, class _Traits> 7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _InputIter __str_find_first_of_aux(_InputIter __first1, _InputIter __last1, 7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __first2, const _CharT* __last2, 7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits*, const __true_type& /* _STLportTraits */) 7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __find_first_of(__first1, __last1, __first2, __last2); } 7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _InputIter, class _CharT, class _Traits> 8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _InputIter __str_find_first_of_aux(_InputIter __first1, _InputIter __last1, 8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __first2, const _CharT* __last2, 8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits*, const __false_type& /* _STLportTraits */) 8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __find_first_of(__first1, __last1, __first2, __last2, _STLP_PRIV _Eq_traits<_Traits>()); } 8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _InputIter, class _CharT, class _Traits> 8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _InputIter __str_find_first_of(_InputIter __first1, _InputIter __last1, 8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __first2, const _CharT* __last2, 8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits* __traits) { 8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (__BORLANDC__) 9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsSTLportClass<_Traits>::_Ret _STLportTraits; 9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _Is = _IsSTLportClass<_Traits>::_Is }; 9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<_Is>::_Ret _STLportTraits; 9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __str_find_first_of_aux(__first1, __last1, __first2, __last2, __traits, _STLportTraits()); 9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _InputIter, class _CharT, class _Traits> 9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _InputIter __str_find_first_not_of_aux3(_InputIter __first1, _InputIter __last1, 10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __first2, const _CharT* __last2, 10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits* /* __traits */, const __true_type& __useStrcspnLikeAlgo) 10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __find_first_of_aux2(__first1, __last1, __first2, __last2, __first2, not1(_Identity<bool>()), __useStrcspnLikeAlgo); } 10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _InputIter, class _CharT, class _Traits> 10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _InputIter __str_find_first_not_of_aux3(_InputIter __first1, _InputIter __last1, 10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __first2, const _CharT* __last2, 10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits* /* __traits */, const __false_type& /* _UseStrcspnLikeAlgo */) 10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _STLP_STD::find_if(__first1, __last1, _STLP_PRIV _Not_within_traits<_Traits>(__first2, __last2)); } 10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _InputIter, class _CharT, class _Tp, class _Traits> 11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _InputIter __str_find_first_not_of_aux2(_InputIter __first1, _InputIter __last1, 11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __first2, const _CharT* __last2, 11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Tp* __pt, _Traits* __traits) { 11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsIntegral<_Tp>::_Ret _IsIntegral; 11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsCharLikeType<_CharT>::_Ret _IsCharLike; 11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land2<_IsIntegral, _IsCharLike>::_Ret _UseStrcspnLikeAlgo; 11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __str_find_first_not_of_aux3(__first1, __last1, __first2, __last2, __traits, _UseStrcspnLikeAlgo()); 11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _InputIter, class _CharT, class _Traits> 12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _InputIter __str_find_first_not_of_aux1(_InputIter __first1, _InputIter __last1, 12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __first2, const _CharT* __last2, 12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits* __traits, const __true_type& /* _STLportTraits */) 12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __str_find_first_not_of_aux2(__first1, __last1, __first2, __last2, 12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_VALUE_TYPE(__first1, _InputIter), __traits); } 12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _InputIter, class _CharT, class _Traits> 12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _InputIter __str_find_first_not_of_aux1(_InputIter __first1, _InputIter __last1, 12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __first2, const _CharT* __last2, 13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits*, const __false_type& /* _STLportTraits */) 13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _STLP_STD::find_if(__first1, __last1, _STLP_PRIV _Not_within_traits<_Traits>(__first2, __last2)); } 13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _InputIter, class _CharT, class _Traits> 13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _InputIter __str_find_first_not_of(_InputIter __first1, _InputIter __last1, 13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __first2, const _CharT* __last2, 13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits* __traits) { 13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (__BORLANDC__) 13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsSTLportClass<_Traits>::_Ret _STLportTraits; 13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _Is = _IsSTLportClass<_Traits>::_Is }; 14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<_Is>::_Ret _STLportTraits; 14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __str_find_first_not_of_aux1(__first1, __last1, __first2, __last2, __traits, _STLportTraits()); 14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// ------------------------------------------------------------ 14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Non-inline declarations. 14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (basic_string) 15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE 15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Change the string's capacity so that it is large enough to hold 15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// at least __res_arg elements, plus the terminating _CharT(). Note that, 15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// if __res_arg < capacity(), this member function may actually decrease 15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// the string's capacity. 15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid basic_string<_CharT,_Traits,_Alloc>::reserve(size_type __res_arg) { 15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__res_arg > max_size()) 16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_throw_length_error(); 16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __n = (max)(__res_arg, size()) + 1; 16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n < this->_M_capacity()) 16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return; 16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reserve(__n); 16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid basic_string<_CharT,_Traits,_Alloc>::_M_reserve(size_type __n) { 17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_start = this->_M_start_of_storage.allocate(__n, __n); 17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_finish = _STLP_PRIV __ucopy(this->_M_Start(), this->_M_Finish(), __new_start); 17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_construct_null(__new_finish); 17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_deallocate_block(); 17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_reset(__new_start, __new_finish, __new_start + __n); 17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc>& 18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc>::append(size_type __n, _CharT __c) { 18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n > 0) { 18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n > max_size() - size()) 18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_throw_length_error(); 18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n >= this->_M_rest()) 18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reserve(_M_compute_next_size(__n)); 18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __uninitialized_fill_n(this->_M_finish + 1, __n - 1, __c); 18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_construct_null(this->_M_finish + __n); 18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::assign(*end(), __c); 18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_finish += __n; 19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT, _Traits, _Alloc>& 19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT, _Traits, _Alloc>::_M_append(const _CharT* __first, const _CharT* __last) { 19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__first != __last) { 19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __n = __STATIC_CAST(size_type, __last - __first); 19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n >= this->_M_rest()) { 20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __len = _M_compute_next_size(__n); 20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_start = this->_M_start_of_storage.allocate(__len, __len); 20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_finish = _STLP_PRIV __ucopy(this->_M_Start(), this->_M_Finish(), __new_start); 20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __new_finish = _STLP_PRIV __ucopy(__first, __last, __new_finish); 20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_construct_null(__new_finish); 20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_deallocate_block(); 20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_reset(__new_start, __new_finish, __new_start + __len); 20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __f1 = __first; 21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ++__f1; 21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __ucopy(__f1, __last, this->_M_finish + 1); 21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_construct_null(this->_M_finish + __n); 21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::assign(*end(), *__first); 21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_finish += __n; 21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc>& 22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc>::assign(size_type __n, _CharT __c) { 22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n <= size()) { 22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::assign(this->_M_Start(), __n, __c); 22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner erase(begin() + __n, end()); 22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n < capacity()) { 22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::assign(this->_M_Start(), size(), __c); 23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner append(__n - size(), __c); 23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self __str(__n, __c); 23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->swap(__str); 23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 24077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 24177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc>& 24277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc>::_M_assign(const _CharT* __f, const _CharT* __l) { 24377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ptrdiff_t __n = __l - __f; 24477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__STATIC_CAST(size_type, __n) <= size()) { 2452590f1e2174e97558461669792b565903a8398caDavid 'Digit' Turner _Traits::move(this->_M_Start(), __f, __n); 24677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner erase(begin() + __n, end()); 24777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 24877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 2492590f1e2174e97558461669792b565903a8398caDavid 'Digit' Turner _Traits::move(this->_M_Start(), __f, size()); 25077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_append(__f + size(), __l); 25177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 25277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 25377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 25477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 25577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 25677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_CharT* basic_string<_CharT,_Traits,_Alloc> ::_M_insert_aux(_CharT* __p, 25777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT __c) { 25877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_pos = __p; 25977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (this->_M_rest() > 1 ) { 26077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_construct_null(this->_M_finish + 1); 26177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::move(__p + 1, __p, this->_M_finish - __p); 26277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::assign(*__p, __c); 26377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ++this->_M_finish; 26477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 26577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 26677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __len = _M_compute_next_size(1); 26777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_start = this->_M_start_of_storage.allocate(__len, __len); 26877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __new_pos = _STLP_PRIV __ucopy(this->_M_Start(), __p, __new_start); 26977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::assign(*__new_pos, __c); 27077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_finish = __new_pos + 1; 27177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __new_finish = _STLP_PRIV __ucopy(__p, this->_M_finish, __new_finish); 27277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_construct_null(__new_finish); 27377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_deallocate_block(); 27477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_reset(__new_start, __new_finish, __new_start + __len); 27577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 27677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __new_pos; 27777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 27877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 27977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 28077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid basic_string<_CharT,_Traits,_Alloc>::insert(iterator __pos, 28177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __n, _CharT __c) { 28277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n != 0) { 28377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (this->_M_rest() > __n) { 28477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const size_type __elems_after = this->_M_finish - __pos; 28577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __old_finish = this->_M_finish; 28677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__elems_after >= __n) { 28777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __ucopy((this->_M_finish - __n) + 1, this->_M_finish + 1, this->_M_finish + 1); 28877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_finish += __n; 28977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::move(__pos + __n, __pos, (__elems_after - __n) + 1); 29077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::assign(__pos, __n, __c); 29177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 29277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 29377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __uninitialized_fill_n(this->_M_finish + 1, __n - __elems_after - 1, __c); 29477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_finish += __n - __elems_after; 29577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __ucopy(__pos, __old_finish + 1, this->_M_finish); 29677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_finish += __elems_after; 29777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::assign(__pos, __elems_after + 1, __c); 29877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 29977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 30077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 30177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __len = _M_compute_next_size(__n); 30277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_start = this->_M_start_of_storage.allocate(__len, __len); 30377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_finish = _STLP_PRIV __ucopy(this->_M_Start(), __pos, __new_start); 30477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __new_finish = _STLP_PRIV __uninitialized_fill_n(__new_finish, __n, __c); 30577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __new_finish = _STLP_PRIV __ucopy(__pos, this->_M_finish, __new_finish); 30677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_construct_null(__new_finish); 30777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_deallocate_block(); 30877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_reset(__new_start, __new_finish, __new_start + __len); 30977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 31077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 31177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 31277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 31377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 31477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid basic_string<_CharT,_Traits,_Alloc>::_M_insert(iterator __pos, 31577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __first, const _CharT* __last, 31677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool __self_ref) { 31777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //this version has to take care about the auto referencing 31877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__first != __last) { 31977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const size_t __n = __last - __first; 32077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (this->_M_rest() > __n) { 32177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const size_t __elems_after = this->_M_finish - __pos; 32277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __old_finish = this->_M_finish; 32377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__elems_after >= __n) { 32477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __ucopy((this->_M_finish - __n) + 1, this->_M_finish + 1, this->_M_finish + 1); 32577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_finish += __n; 32677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::move(__pos + __n, __pos, (__elems_after - __n) + 1); 32777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (!__self_ref || __last < __pos) { 32877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_copy(__first, __last, __pos); 32977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 33077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 33177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //We have to check that the source buffer hasn't move 33277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__first >= __pos) { 33377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //The source buffer has move 33477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __first += __n; 33577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __last += __n; 33677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_copy(__first, __last, __pos); 33777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 33877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 33977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //The source buffer hasn't move, it has been duplicated 34077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_move(__first, __last, __pos); 34177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 34277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 34377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 34477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 34577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __mid = __first; 34677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __mid += __elems_after + 1; 34777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __ucopy(__mid, __last, this->_M_finish + 1); 34877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_finish += __n - __elems_after; 34977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __ucopy(__pos, __old_finish + 1, this->_M_finish); 35077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_finish += __elems_after; 35177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (!__self_ref) 35277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_copy(__first, __mid, __pos); 35377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else 35477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_move(__first, __mid, __pos); 35577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 35677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 35777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 35877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __len = _M_compute_next_size(__n); 35977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_start = this->_M_start_of_storage.allocate(__len, __len); 36077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pointer __new_finish = _STLP_PRIV __ucopy(this->_M_Start(), __pos, __new_start); 36177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __new_finish = _STLP_PRIV __ucopy(__first, __last, __new_finish); 36277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __new_finish = _STLP_PRIV __ucopy(__pos, this->_M_finish, __new_finish); 36377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_construct_null(__new_finish); 36477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_deallocate_block(); 36577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_reset(__new_start, __new_finish, __new_start + __len); 36677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 36777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 36877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 36977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 37077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 37177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc>& 37277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc> ::replace(iterator __first, iterator __last, 37377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __n, _CharT __c) { 37477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __len = (size_type)(__last - __first); 37577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 37677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__len >= __n) { 37777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::assign(__first, __n, __c); 37877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner erase(__first + __n, __last); 37977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 38077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 38177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::assign(__first, __len, __c); 38277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner insert(__last, __n - __len, __c); 38377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 38477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 38577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 38677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 38777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 38877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc>& 38977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc> ::_M_replace(iterator __first, iterator __last, 39077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __f, const _CharT* __l, 39177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool __self_ref) { 39277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const ptrdiff_t __n = __l - __f; 39377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const difference_type __len = __last - __first; 39477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__len >= __n) { 39577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (!__self_ref || __l < __first || __f >= __last) 39677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_copy(__f, __l, __first); 39777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else 39877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_move(__f, __l, __first); 39977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner erase(__first + __n, __last); 40077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else if (!__self_ref || (__f >= __last) || (__l <= __first)) { // no overlap 40177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __m = __f + __len; 40277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_copy(__f, __m, __first); 40377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_insert(__last, __m, __l, __self_ref ); 40477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else if (__f < __first) { // we have to take care of overlaping 40577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __m = __f + __len; 40677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // We have to deal with possible reallocation because we do insert first. 40777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const difference_type __off_dest = __first - this->begin(); 40877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const difference_type __off_src = __f - this->begin(); 40977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_insert(__last, __m, __l, true); 41077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::move(begin() + __off_dest, begin() + __off_src, __len); 41177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 41277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __m = __f + __len; 41377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Traits::move(__first, __f, __len); 41477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_insert(__last, __m, __l, true); 41577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 41677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 41777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 41877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 41977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 42077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__size_type__ basic_string<_CharT,_Traits,_Alloc>::find( const _CharT* __s, size_type __pos, 42177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __n) const 42277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 42377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const size_t __len = size(); 42477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__pos >= __len || __pos + __n > __len) { 42577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( __n == 0 && __pos <= __len ) { // marginal case 42677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __pos; 42777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 42877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 42977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 43077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 43177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_pointer __result = 43277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::search(this->_M_Start() + __pos, this->_M_Finish(), 43377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __s, __s + __n, _STLP_PRIV _Eq_traits<_Traits>()); 43477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __result != this->_M_Finish() ? __result - this->_M_Start() : npos; 43577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 43677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 43777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 43877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__size_type__ basic_string<_CharT,_Traits,_Alloc>::find(_CharT __c, size_type __pos) const 43977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 44077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__pos >= size()) { /*__pos + 1 > size()*/ 44177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 44277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 44377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 44477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_pointer __result = 44577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::find_if(this->_M_Start() + __pos, this->_M_Finish(), 44677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV _Eq_char_bound<_Traits>(__c)); 44777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __result != this->_M_Finish() ? __result - this->_M_Start() : npos; 44877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 44977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 45077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 45177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__size_type__ basic_string<_CharT,_Traits,_Alloc>::rfind(const _CharT* __s, size_type __pos, 45277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __n) const 45377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 45477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const size_type __len = size(); 45577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( __len < __n ) { 45677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 45777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 45877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_pointer __last = this->_M_Start() + (min)( __len - __n, __pos) + __n; 45977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( __n == 0 ) { // marginal case 46077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __last - this->_M_Start(); 46177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 46277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_pointer __result = _STLP_STD::find_end(this->_M_Start(), __last, 46377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __s, __s + __n, _STLP_PRIV _Eq_traits<_Traits>()); 46477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __result != __last ? __result - this->_M_Start() : npos; 46577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 46677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 46777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 46877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__size_type__ basic_string<_CharT,_Traits,_Alloc>::rfind(_CharT __c, size_type __pos) const 46977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 47077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const size_type __len = size(); 47177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( __len < 1 ) { 47277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 47377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 47477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __last = begin() + (min)(__len - 1, __pos) + 1; 47577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator __rresult = 47677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::find_if(const_reverse_iterator(__last), rend(), 47777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV _Eq_char_bound<_Traits>(__c)); 47877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos; 47977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 48077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 48177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> __size_type__ 48277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc> ::find_first_of(const _CharT* __s, size_type __pos, 48377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __n) const { 48477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__pos >= size()) /*__pos + 1 > size()*/ 48577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 48677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 48777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __result = _STLP_PRIV __str_find_first_of(begin() + __pos, end(), 48877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __s, __s + __n, 48977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(_Traits*, 0)); 49077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __result != end() ? __result - begin() : npos; 49177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 49277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 49377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 49477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 49577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __size_type__ 49677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc> ::find_last_of(const _CharT* __s, size_type __pos, 49777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __n) const 49877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 49977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const size_type __len = size(); 50077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( __len < 1 ) { 50177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 50277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 50377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const const_iterator __last = begin() + (min)(__len - 1, __pos) + 1; 50477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const const_reverse_iterator __rresult = 50577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __str_find_first_of(const_reverse_iterator(__last), rend(), 50677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __s, __s + __n, 50777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(_Traits*, 0)); 50877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos; 50977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 51077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 51177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 51277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> __size_type__ 51377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc> ::find_first_not_of(const _CharT* __s, size_type __pos, 51477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __n) const { 51577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Traits::char_type _CharType; 51677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__pos >= size()) /*__pos + 1 >= size()*/ 51777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 51877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 51977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_pointer __result = _STLP_PRIV __str_find_first_not_of(this->_M_Start() + __pos, this->_M_Finish(), 52077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(const _CharType*, __s), 52177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(const _CharType*, __s) + __n, 52277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(_Traits*, 0)); 52377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __result != this->_M_finish ? __result - this->_M_Start() : npos; 52477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 52577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 52677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 52777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> __size_type__ 52877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc> ::find_first_not_of(_CharT __c, size_type __pos) const { 52977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (1 > size()) 53077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 53177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 53277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_pointer __result = _STLP_STD::find_if(this->_M_Start() + __pos, this->_M_Finish(), 53377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV _Neq_char_bound<_Traits>(__c)); 53477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __result != this->_M_finish ? __result - this->_M_Start() : npos; 53577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 53677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 53777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 53877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 53977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__size_type__ 54077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT,_Traits,_Alloc>::find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const 54177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 54277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Traits::char_type _CharType; 54377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const size_type __len = size(); 54477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( __len < 1 ) { 54577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 54677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 54777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __last = begin() + (min)(__len - 1, __pos) + 1; 54877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator __rlast = const_reverse_iterator(__last); 54977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator __rresult = 55077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __str_find_first_not_of(__rlast, rend(), 55177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(const _CharType*, __s), 55277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(const _CharType*, __s) + __n, 55377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(_Traits*, 0)); 55477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos; 55577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 55677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 55777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 55877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__size_type__ 55977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT, _Traits, _Alloc>::find_last_not_of(_CharT __c, size_type __pos) const 56077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 56177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const size_type __len = size(); 56277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( __len < 1 ) { 56377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 56477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 56577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __last = begin() + (min)(__len - 1, __pos) + 1; 56677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator __rlast = const_reverse_iterator(__last); 56777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator __rresult = 56877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::find_if(__rlast, rend(), 56977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV _Neq_char_bound<_Traits>(__c)); 57077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos; 57177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 57277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 57377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (basic_string) 57477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE 57577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 57677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 57777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 57877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _STLP_CALL _S_string_copy(const basic_string<_CharT,_Traits,_Alloc>& __s, 57977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* __buf, size_t __n) { 58077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n > 0) { 58177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __n = (min) (__n - 1, __s.size()); 58277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::copy(__s.begin(), __s.begin() + __n, __buf); 58377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __buf[__n] = _CharT(); 58477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 58577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 58677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 58777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE 58877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 58977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE 59077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 59177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <stl/_range_errors.h> 59277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 59377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE 59477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 59577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE 59677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 59777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// _String_base methods 59877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp, class _Alloc> 59977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _String_base<_Tp,_Alloc>::_M_throw_length_error() const 60077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ __stl_throw_length_error("basic_string"); } 60177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 60277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp, class _Alloc> 60377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _String_base<_Tp, _Alloc>::_M_throw_out_of_range() const 60477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ __stl_throw_out_of_range("basic_string"); } 60577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 60677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp, class _Alloc> 60777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _String_base<_Tp, _Alloc>::_M_allocate_block(size_t __n) { 60877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ((__n <= (max_size() + 1)) && (__n > 0)) { 60977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_SHORT_STRING_OPTIM) 61077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n > _DEFAULT_SIZE) { 61177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_start_of_storage._M_data = _M_start_of_storage.allocate(__n, __n); 61277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_finish = this->_M_start_of_storage._M_data; 61377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_buffers._M_end_of_storage = this->_M_start_of_storage._M_data + __n; 61477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 61577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 61677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_start_of_storage._M_data = _M_start_of_storage.allocate(__n, __n); 61777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_finish = this->_M_start_of_storage._M_data; 61877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_end_of_storage = this->_M_start_of_storage._M_data + __n; 61977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 62077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 62177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_throw_length_error(); 62277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 62377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 62477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 62577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (basic_string) 62677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE 62777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 62877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 62977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DONT_SUP_DFLT_PARAM) 63077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 63177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT* __s) 63277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _STLP_PRIV _String_base<_CharT,_Alloc>(allocator_type()) { 63377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_FIX_LITERAL_BUG(__s) 63477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_range_initialize(__s, __s + traits_type::length(__s)); 63577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 63677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 63777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 63877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 63977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT* __s, 64077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const allocator_type& __a) 64177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _STLP_PRIV _String_base<_CharT,_Alloc>(__a) { 64277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_FIX_LITERAL_BUG(__s) 64377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_range_initialize(__s, __s + traits_type::length(__s)); 64477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 64577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 64677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 64777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_string<_CharT, _Traits, _Alloc>::basic_string(const basic_string<_CharT, _Traits, _Alloc> & __s) 64877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _STLP_PRIV _String_base<_CharT,_Alloc>(__s.get_allocator()) 64977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _M_range_initialize(__s._M_Start(), __s._M_Finish()); } 65077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 65177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (basic_string) 65277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE 65377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# undef basic_string 65477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 65577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 65677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_STATIC_CONST_INIT_BUG) && !defined (_STLP_NO_STATIC_CONST_DEFINITION) 65777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Traits, class _Alloc> 65877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst size_t basic_string<_CharT, _Traits, _Alloc>::npos; 65977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 66077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 66177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE 66277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 66377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#undef __size_type__ 66477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_NESTED_TYPE_PARAM_BUG) 66577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# undef size_type 66677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# undef iterator 66777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 66877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 66977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_STRING_C */ 67077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 67177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables: 67277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++ 67377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End: 674