[PATCH] Basic_string::_M_replace clean up
Paolo Carlini
pcarlini@unitus.it
Sat Dec 8 13:14:00 GMT 2001
Hi,
I would like to ask approval for the following clean up, which I had already
imagined at the time of PR4354.
Currently, we have the following helper
basic_string::_M_replace(iterator __i1, iterator __i2, _InputIter __k1,
_InputIter __k2, input_iterator_tag)
{
basic_string __s(__k1, __k2);
return this->replace(__i1, __i2, __s._M_ibegin(), __s._M_iend());
}
in addition to
basic_string::_M_replace(iterator __i1, iterator __i2, _ForwardIter __k1,
_ForwardIter __k2, forward_iterator_tag)
What I propose is getting rid of the first, changing the signature of the second
to:
basic_string::_M_replace(iterator __i1, iterator __i2, _InputIter __k1,
_InputIter __k2, input_iterator_tag)
The former appears completely unused (I have simply checked for this by running
the testsuite with a throw in it) and in fact, if it were, it would call:
replace(__i1, __i2, __s._M_ibegin(), __s._M_iend())
which has a signature (iterator, iterator, iterator, iterator) and thus:
template<class _InputIterator>
basic_string&
replace(iterator __i1, iterator __i2, _InputIterator __k1,
_InputIterator __k2)
{
return _M_replace(__i1, __i2, __k1, __k2,
typename iterator_traits<_InputIterator>::iterator_category());
}
replace in principle could either call _M_replace(input_iterator_tag), thus
leading to infinite recursion, or _M_replace(forward_iterator_tag), with a
definite loss of efficiency.
Tested on i686-pc-linux-gnu, as usual.
Cheers,
Paolo.
////////////////
2001-12-08 Paolo Carlini <pcarlini@unitus.it>
* include/bits/basic_string.tcc (_M_replace(input_iterator_tag)):
Remove.
* include/bits/basic_string.h (_M_replace(forward_iterator_tag)):
Adjust signature.
* src/string-inst.cc: Adjust declarations.
diff -urN libstdc++-v3-orig/include/bits/basic_string.h
libstdc++-v3/include/bits/basic_string.h
-- libstdc++-v3-orig/include/bits/basic_string.h Sat Dec 8 17:57:02 2001
+++ libstdc++-v3/include/bits/basic_string.h Sat Dec 8 18:29:10 2001
@@ -639,11 +639,6 @@
_M_replace(iterator __i1, iterator __i2, _InputIterator __k1,
_InputIterator __k2, input_iterator_tag);
- template<class _FwdIterator>
- basic_string&
- _M_replace(iterator __i1, iterator __i2, _FwdIterator __k1,
- _FwdIterator __k2, forward_iterator_tag);
-
// _S_construct_aux is used to implement the 21.3.1 para 15 which
// requires special behaviour if _InIter is an integral type
template<class _InIter>
diff -urN libstdc++-v3-orig/include/bits/basic_string.tcc
libstdc++-v3/include/bits/basic_string.tcc
--- libstdc++-v3-orig/include/bits/basic_string.tcc Sat Dec 8 17:56:54 2001
+++ libstdc++-v3/include/bits/basic_string.tcc Sat Dec 8 18:29:56 2001
@@ -497,17 +497,6 @@
_M_replace(iterator __i1, iterator __i2, _InputIter __k1,
_InputIter __k2, input_iterator_tag)
{
- basic_string __s(__k1, __k2);
- return this->replace(__i1, __i2, __s._M_ibegin(), __s._M_iend());
- }
-
- template<typename _CharT, typename _Traits, typename _Alloc>
- template<typename _ForwardIter>
- basic_string<_CharT, _Traits, _Alloc>&
- basic_string<_CharT, _Traits, _Alloc>::
- _M_replace(iterator __i1, iterator __i2, _ForwardIter __k1,
- _ForwardIter __k2, forward_iterator_tag)
- {
size_type __dnew = static_cast<size_type>(distance(__k1, __k2));
size_type __dold = __i2 - __i1;
size_type __dmax = this->max_size();
diff -urN libstdc++-v3-orig/src/string-inst.cc libstdc++-v3/src/string-inst.cc
--- libstdc++-v3-orig/src/string-inst.cc Sat Dec 8 18:42:47 2001
+++ libstdc++-v3/src/string-inst.cc Sat Dec 8 18:43:18 2001
@@ -71,21 +71,21 @@
template
S&
S::_M_replace(S::iterator, S::iterator, S::iterator, S::iterator,
- forward_iterator_tag);
+ input_iterator_tag);
template
S&
S::_M_replace(S::iterator, S::iterator, S::const_iterator,
- S::const_iterator, forward_iterator_tag);
+ S::const_iterator, input_iterator_tag);
template
S&
- S::_M_replace(S::iterator, S::iterator, C*, C*, forward_iterator_tag);
+ S::_M_replace(S::iterator, S::iterator, C*, C*, input_iterator_tag);
template
S&
S::_M_replace(S::iterator, S::iterator, const C*, const C*,
- forward_iterator_tag);
+ input_iterator_tag);
template
C*
More information about the Libstdc++
mailing list