This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] Move inline _M_replace_safe/aux (and some numbers!)


Hi,

now that are stripped to the bone, can be moved inline and
the effect is measurable:

current mainline
----------------
string_append.cc    char     94r   81u    5s   0mem    0pf
string_append.cc  string    121r   98u    7s   0mem    0pf

current + patch
---------------
string_append.cc    char     73r   70u    3s   0mem    0pf
string_append.cc  string    102r   91u    4s   0mem    0pf


Tested x86-linux


Paolo.

//////////////

2004-01-25  Paolo Carlini  <pcarlini@suse.de>

	* include/bits/basic_string.h (_M_replace_aux, _M_replace_safe):
	Define inline here.
	* include/bits/basic_string.tcc (_M_replace_aux, _M_replace_safe):
	Move inline.

	* include/bits/basic_string.tcc: Very minor tweaks.
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	2004-01-25 11:02:14.000000000 +0100
+++ libstdc++-v3/include/bits/basic_string.h	2004-01-25 22:20:38.000000000 +0100
@@ -1361,11 +1361,26 @@
 			    _InputIterator __k2, __false_type);
 
       basic_string&
-      _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2, _CharT __c);
+      _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
+		     _CharT __c)
+      {
+	if (this->max_size() - (this->size() - __n1) < __n2)
+	  __throw_length_error("basic_string::_M_replace_aux");
+	_M_mutate(__pos1, __n1, __n2);
+	if (__n2)
+	  traits_type::assign(_M_data() + __pos1, __n2, __c);
+	return *this;	
+      }
 
       basic_string&
       _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
-		      size_type __n2);
+		      size_type __n2)
+      {
+	_M_mutate(__pos1, __n1, __n2);
+	if (__n2)
+	  traits_type::copy(_M_data() + __pos1, __s, __n2);
+	return *this;	
+      }
 
       // _S_construct_aux is used to implement the 21.3.1 para 15 which
       // requires special behaviour if _InIter is an integral type
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	2004-01-24 19:51:41.000000000 +0100
+++ libstdc++-v3/include/bits/basic_string.tcc	2004-01-25 22:20:45.000000000 +0100
@@ -142,7 +142,7 @@
       }
   
   template<typename _CharT, typename _Traits, typename _Alloc>
-    template <class _InIterator>
+    template <typename _InIterator>
       _CharT*
       basic_string<_CharT, _Traits, _Alloc>::
       _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a, 
@@ -391,7 +391,7 @@
 	  || _M_rep()->_M_is_shared() || __new_size > capacity())
 	{
 	  // Must reallocate.
-	  allocator_type __a = get_allocator();
+	  const allocator_type __a = get_allocator();
 	  // See below (_S_create) for the meaning and value of these
 	  // constants.
 	  const size_type __pagesize = 4096;
@@ -439,7 +439,7 @@
 	  // Make sure we don't shrink below the current size
 	  if (__res < this->size())
 	    __res = this->size();
-	  allocator_type __a = get_allocator();
+	  const allocator_type __a = get_allocator();
 	  _CharT* __tmp = _M_rep()->_M_clone(__a, __res - this->size());
 	  _M_rep()->_M_dispose(__a);
 	  _M_data(__tmp);
@@ -599,34 +599,6 @@
 			       __s.size());
       }
 
-  // This helper doesn't buffer internally and can be used in "safe" situations,
-  // i.e., when source and destination ranges are known to not overlap.
-  template<typename _CharT, typename _Traits, typename _Alloc>
-    basic_string<_CharT, _Traits, _Alloc>&
-    basic_string<_CharT, _Traits, _Alloc>::
-    _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
-		    size_type __n2)
-    {
-      _M_mutate(__pos1, __n1, __n2);
-      if (__n2)
-	traits_type::copy(_M_data() + __pos1, __s, __n2);
-      return *this;
-    }
-
-  template<typename _CharT, typename _Traits, typename _Alloc>
-    basic_string<_CharT, _Traits, _Alloc>&
-    basic_string<_CharT, _Traits, _Alloc>::
-    _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
-		   _CharT __c)
-    {
-      if (this->max_size() - (this->size() - __n1) < __n2)
-	__throw_length_error("basic_string::_M_replace_aux");
-      _M_mutate(__pos1, __n1, __n2);
-      if (__n2)
-	traits_type::assign(_M_data() + __pos1, __n2, __c);
-      return *this;
-    }
-
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>&
     basic_string<_CharT, _Traits, _Alloc>::

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]