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] std::reverse improvements + minor bits


Hi,

tested x86-linux, committed to mainline.

Paolo.

//////////////
2004-10-06  Paolo Carlini  <pcarlini@suse.de>

	* include/bits/stl_algo.h (__reverse(bidirectional_iterator_tag)):
	Avoid iterator postincrement.
	(__rotate): Likewise.

	* include/bits/stl_algo.h: Minor formatting tweaks.

2004-10-06  Christopher Jefferson <caj@cs.york.ac.uk>

	* include/bits/stl_algo.h (__reverse(random_access_iterator_tag)):
	Avoid iterator postincrement; fix swapping middle element with
	itself on odd-length inputs.

diff -urN libstdc++-v3-orig/include/bits/stl_algo.h libstdc++-v3/include/bits/stl_algo.h
--- libstdc++-v3-orig/include/bits/stl_algo.h	2004-09-17 16:11:59.000000000 +0200
+++ libstdc++-v3/include/bits/stl_algo.h	2004-10-05 14:01:29.000000000 +0200
@@ -1412,29 +1412,39 @@
   template<typename _BidirectionalIterator>
     void
     __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
-			  bidirectional_iterator_tag)
+	      bidirectional_iterator_tag)
     {
       while (true)
 	if (__first == __last || __first == --__last)
 	  return;
 	else
-	  std::iter_swap(__first++, __last);
+	  {
+	    std::iter_swap(__first, __last);
+	    ++__first;
+	  }
     }
 
   /**
    *  @if maint
    *  This is an uglified reverse(_BidirectionalIterator,
    *                              _BidirectionalIterator)
-   *  overloaded for bidirectional iterators.
+   *  overloaded for random access iterators.
    *  @endif
   */
   template<typename _RandomAccessIterator>
     void
     __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
-			  random_access_iterator_tag)
+	      random_access_iterator_tag)
     {
+      if (__first == __last)
+	return;
+      --__last;
       while (__first < __last)
-	std::iter_swap(__first++, --__last);
+	{
+	  std::iter_swap(__first, __last);
+	  ++__first;
+	  --__last;
+	}
     }
 
   /**
@@ -1454,7 +1464,7 @@
     {
       // concept requirements
       __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
-		    _BidirectionalIterator>)
+				  _BidirectionalIterator>)
       __glibcxx_requires_valid_range(__first, __last);
       std::__reverse(__first, __last, std::__iterator_category(__first));
     }
@@ -1525,15 +1535,17 @@
     __rotate(_ForwardIterator __first,
 	     _ForwardIterator __middle,
 	     _ForwardIterator __last,
-	      forward_iterator_tag)
+	     forward_iterator_tag)
     {
-      if ((__first == __middle) || (__last  == __middle))
+      if (__first == __middle || __last  == __middle)
 	return;
 
       _ForwardIterator __first2 = __middle;
       do
 	{
-	  swap(*__first++, *__first2++);
+	  swap(*__first, *__first2);
+	  ++__first;
+	  ++__first2;
 	  if (__first == __middle)
 	    __middle = __first2;
 	}
@@ -1543,7 +1555,9 @@
 
       while (__first2 != __last)
 	{
-	  swap(*__first++, *__first2++);
+	  swap(*__first, *__first2);
+	  ++__first;
+	  ++__first2;
 	  if (__first == __middle)
 	    __middle = __first2;
 	  else if (__first2 == __last)
@@ -1565,16 +1579,19 @@
     {
       // concept requirements
       __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
-	    _BidirectionalIterator>)
+				  _BidirectionalIterator>)
 
-      if ((__first == __middle) || (__last  == __middle))
+      if (__first == __middle || __last  == __middle)
 	return;
 
       std::__reverse(__first,  __middle, bidirectional_iterator_tag());
       std::__reverse(__middle, __last,   bidirectional_iterator_tag());
 
       while (__first != __middle && __middle != __last)
-	swap(*__first++, *--__last);
+	{
+	  swap(*__first, *--__last);
+	  ++__first;
+	}
 
       if (__first == __middle)
 	std::__reverse(__middle, __last,   bidirectional_iterator_tag());
@@ -1596,9 +1613,9 @@
     {
       // concept requirements
       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
-	    _RandomAccessIterator>)
+				  _RandomAccessIterator>)
 
-      if ((__first == __middle) || (__last  == __middle))
+      if (__first == __middle || __last  == __middle)
 	return;
 
       typedef typename iterator_traits<_RandomAccessIterator>::difference_type

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