Index: include/bits/basic_string.h =================================================================== RCS file: /cvsroot/gcc/gcc/libstdc++-v3/include/bits/basic_string.h,v retrieving revision 1.34 diff -c -3 -p -r1.34 basic_string.h *** include/bits/basic_string.h 13 Jun 2003 20:59:42 -0000 1.34 --- include/bits/basic_string.h 19 Jun 2003 22:58:23 -0000 *************** namespace std *** 625,638 **** { return this->replace(__i1, __i2, __s, traits_type::length(__s)); } basic_string& ! replace(iterator __i1, iterator __i2, size_type __n, _CharT __c); template basic_string& replace(iterator __i1, iterator __i2, _InputIterator __k1, _InputIterator __k2) ! { return _M_replace(__i1, __i2, __k1, __k2, ! typename iterator_traits<_InputIterator>::iterator_category()); } // Specializations for the common case of pointer and iterator: // useful to avoid the overhead of temporary buffering in _M_replace. --- 625,639 ---- { return this->replace(__i1, __i2, __s, traits_type::length(__s)); } basic_string& ! replace(iterator __i1, iterator __i2, size_type __n, _CharT __c) ! { return _M_replace_aux(__i1, __i2, __n, __c); } template basic_string& replace(iterator __i1, iterator __i2, _InputIterator __k1, _InputIterator __k2) ! { typedef typename _Is_integer<_InputIterator>::_Integral _Integral; ! return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral()); } // Specializations for the common case of pointer and iterator: // useful to avoid the overhead of temporary buffering in _M_replace. *************** namespace std *** 659,664 **** --- 660,684 ---- } private: + template + basic_string& + _M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n, + _Integer __val, __true_type) + { return _M_replace_aux(__i1, __i2, __n, __val); } + + template + basic_string& + _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1, + _InputIterator __k2, __false_type) + { + typedef typename iterator_traits<_InputIterator>::iterator_category + _Category; + return _M_replace(__i1, __i2, __k1, __k2, _Category()); + } + + basic_string& + _M_replace_aux(iterator __i1, iterator __i2, size_type __n2, _CharT __c); + template basic_string& _M_replace(iterator __i1, iterator __i2, _InputIterator __k1, Index: include/bits/basic_string.tcc =================================================================== RCS file: /cvsroot/gcc/gcc/libstdc++-v3/include/bits/basic_string.tcc,v retrieving revision 1.38 diff -c -3 -p -r1.38 basic_string.tcc *** include/bits/basic_string.tcc 13 Jun 2003 20:59:42 -0000 1.38 --- include/bits/basic_string.tcc 19 Jun 2003 22:58:23 -0000 *************** namespace std *** 621,626 **** --- 621,642 ---- // else nothing (in particular, avoid calling _M_mutate() unnecessarily.) } + template + basic_string<_CharT, _Traits, _Alloc>& + basic_string<_CharT, _Traits, _Alloc>:: + _M_replace_aux(iterator __i1, iterator __i2, size_type __n2, _CharT __c) + { + size_type __n1 = __i2 - __i1; + size_type __off1 = __i1 - _M_ibegin(); + if (max_size() - (this->size() - __n1) <= __n2) + __throw_length_error("basic_string::replace"); + _M_mutate (__off1, __n1, __n2); + // Invalidated __i1, __i2 + if (__n2) + traits_type::assign(_M_data() + __off1, __n2, __c); + return *this; + } + // This is the general replace helper, which currently gets instantiated both // for input iterators and reverse iterators. It buffers internally and then // calls _M_replace_safe. *************** namespace std *** 760,781 **** return __str; } - template - basic_string<_CharT, _Traits, _Alloc>& - basic_string<_CharT, _Traits, _Alloc>:: - replace(iterator __i1, iterator __i2, size_type __n2, _CharT __c) - { - const size_type __n1 = __i2 - __i1; - const size_type __off1 = __i1 - _M_ibegin(); - if (max_size() - (this->size() - __n1) <= __n2) - __throw_length_error("basic_string::replace"); - _M_mutate (__off1, __n1, __n2); - // Invalidated __i1, __i2 - if (__n2) - traits_type::assign(_M_data() + __off1, __n2, __c); - return *this; - } - template typename basic_string<_CharT, _Traits, _Alloc>::size_type basic_string<_CharT, _Traits, _Alloc>:: --- 776,781 ---- Index: testsuite/21_strings/basic_string/assign/char/1.cc =================================================================== RCS file: /cvsroot/gcc/gcc/libstdc++-v3/testsuite/21_strings/basic_string/assign/char/1.cc,v retrieving revision 1.1 diff -c -3 -p -r1.1 1.cc *** testsuite/21_strings/basic_string/assign/char/1.cc 18 Mar 2003 05:04:11 -0000 1.1 --- testsuite/21_strings/basic_string/assign/char/1.cc 19 Jun 2003 22:58:23 -0000 *************** test01() *** 44,49 **** --- 44,52 ---- aux.assign(aux, i + 1, string::npos); VERIFY(aux.c_str()[9] == 'B'); VERIFY(aux == "/Hanalei Bay/Kauai/Hawaii"); + + aux.assign(10, 0); + VERIFY(aux.length() == 10); } int main()