stl_algobase.h (iter_swap): delegate to swap via __iter_swap when iterator's value_ty...
authorChristopher Jefferson <caj@cs.york.ac.uk>
Tue, 5 Oct 2004 10:28:17 +0000 (10:28 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 5 Oct 2004 10:28:17 +0000 (10:28 +0000)
2004-10-05  Christopher Jefferson  <caj@cs.york.ac.uk>

* include/bits/stl_algobase.h (iter_swap): delegate to swap via
__iter_swap when iterator's value_types are equal.
(struct __iter_swap): New.

From-SVN: r88549

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_algobase.h

index 834f0b1d9df47e8b276a85ff5725a5a969fd927b..7dd6e7e8cc29665b2285d3a857864c2044083a68 100644 (file)
@@ -1,3 +1,9 @@
+2004-10-05  Christopher Jefferson  <caj@cs.york.ac.uk>
+
+       * include/bits/stl_algobase.h (iter_swap): delegate to swap via
+       __iter_swap when iterator's value_types are equal.
+       (struct __iter_swap): New.
+
 2004-10-04  Benjamin Kosnik  <bkoz@redhat.com>
 
        * configure.ac (libtool_VERSION): To 6:3:0.
index f3f20e6680244d431b7ef34a3dcf7ee579653fc6..62578902c051e8df01958bddf9be719400b0b38b 100644 (file)
 
 namespace std
 {
+
+  /**
+   *  @brief Swaps two values.
+   *  @param  a  A thing of arbitrary type.
+   *  @param  b  Another thing of arbitrary type.
+   *  @return   Nothing.
+   *
+   *  This is the simple classic generic implementation.  It will work on
+   *  any type which has a copy constructor and an assignment operator.
+  */
+  template<typename _Tp>
+    inline void
+    swap(_Tp& __a, _Tp& __b)
+    {
+      // concept requirements
+      __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
+
+      const _Tp __tmp = __a;
+      __a = __b;
+      __b = __tmp;
+    }
+
+  // See http://gcc.gnu.org/ml/libstdc++/2004-08/msg00167.html: in a
+  // nutshell, we are partially implementing the resolution of DR 187,
+  // when it's safe, i.e., the value_types are equal.
+  template<bool _BoolType>
+    struct __iter_swap
+    {
+      template<typename _ForwardIterator1, typename _ForwardIterator2>
+        static void
+        iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+        {
+          typedef typename iterator_traits<_ForwardIterator1>::value_type
+            _ValueType1;
+          const _ValueType1 __tmp = *__a;
+          *__a = *__b;
+          *__b = __tmp; 
+       }
+    };
+
+  template<>
+    struct __iter_swap<true>
+    {
+      template<typename _ForwardIterator1, typename _ForwardIterator2>
+        static void 
+        iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+        {
+          swap(*__a, *__b);
+        }
+    };
+
   /**
    *  @brief Swaps the contents of two iterators.
    *  @param  a  An iterator.
@@ -104,31 +155,8 @@ namespace std
                                  _ValueType2>)
       __glibcxx_function_requires(_ConvertibleConcept<_ValueType2,
                                  _ValueType1>)
-
-      const _ValueType1 __tmp = *__a;
-      *__a = *__b;
-      *__b = __tmp;
-    }
-
-  /**
-   *  @brief Swaps two values.
-   *  @param  a  A thing of arbitrary type.
-   *  @param  b  Another thing of arbitrary type.
-   *  @return   Nothing.
-   *
-   *  This is the simple classic generic implementation.  It will work on
-   *  any type which has a copy constructor and an assignment operator.
-  */
-  template<typename _Tp>
-    inline void
-    swap(_Tp& __a, _Tp& __b)
-    {
-      // concept requirements
-      __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
-
-      const _Tp __tmp = __a;
-      __a = __b;
-      __b = __tmp;
+      std::__iter_swap<__are_same<_ValueType1, _ValueType2>::_M_type>::
+       iter_swap(__a, __b);
     }
 
   #undef min