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