[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