stl_algobase.h (equal): Make C++14 overloads from N3671 dispatch to traditional std...
authorJonathan Wakely <jwakely.gcc@gmail.com>
Mon, 17 Jun 2013 00:47:55 +0000 (00:47 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 17 Jun 2013 00:47:55 +0000 (01:47 +0100)
2013-06-17  Jonathan Wakely  <jwakely.gcc@gmail.com>
    Chris Jefferson  <chris@bubblescope.net>

* include/bits/stl_algobase.h (equal): Make C++14 overloads from N3671
dispatch to traditional std::equal for random-access iterators.
(__equal2_aux, __equal2): Remove.
(__equal::equal): Remove unused overloads.
* include/bits/stl_algo.h (is_permutation): Fix typos.

Co-Authored-By: Chris Jefferson <chris@bubblescope.net>
From-SVN: r200145

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

index 332b01b3d94de68613859d0fabfcf96dd6fb127c..cbbef59144744a5b7c73781f1bae9b9a35d4e333 100644 (file)
@@ -1,3 +1,12 @@
+2013-06-17  Jonathan Wakely  <jwakely.gcc@gmail.com>
+           Chris Jefferson  <chris@bubblescope.net>
+
+       * include/bits/stl_algobase.h (equal): Make C++14 overloads from N3671
+       dispatch to traditional std::equal for random-access iterators.
+       (__equal2_aux, __equal2): Remove.
+       (__equal::equal): Remove unused overloads.
+       * include/bits/stl_algo.h (is_permutation): Fix typos.
+
 2013-06-16  Jonathan Wakely  <jwakely.gcc@gmail.com>
 
        * include/std/shared_mutex (shared_lock::operator=): Add missing
index e61f22b66a87a48c67e1949e38e05f4996e3e49c..9d6b466cf2ee5b008fb79a53a8d9a41af921bb65 100644 (file)
@@ -4396,7 +4396,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        = typename iterator_traits<_ForwardIterator2>::iterator_category;
       using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
       using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
-      if (_It1_is_RA() && _It1_is_RA())
+      if (_It1_is_RA() && _It2_is_RA())
        {
          auto __d1 = std::distance(__first1, __last1);
          auto __d2 = std::distance(__first2, __last2);
@@ -4456,7 +4456,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        = typename iterator_traits<_ForwardIterator2>::iterator_category;
       using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
       using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
-      constexpr bool __ra_iters = _It1_is_RA() && _It1_is_RA();
+      constexpr bool __ra_iters = _It1_is_RA() && _It2_is_RA();
       if (__ra_iters)
        {
          auto __d1 = std::distance(__first1, __last1);
index 67f859b3602081d75cbfc0feaad768f8ac80d362..e1daac2dddad8b33d3fb0bf1f1d1ecd90ebece04 100644 (file)
@@ -798,19 +798,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
              return false;
          return true;
        }
-
-#if __cplusplus > 201103L
-      template<typename _II1, typename _II2>
-        static bool
-        equal(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
-        {
-         for (; __first1 != __last1 && __first2 != __last2;
-             ++__first1, ++__first2)
-           if (!(*__first1 == *__first2))
-             return false;
-         return true;
-       }
-#endif
     };
 
   template<>
@@ -823,17 +810,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          return !__builtin_memcmp(__first1, __first2, sizeof(_Tp)
                                   * (__last1 - __first1));
        }
-
-#if __cplusplus > 201103L
-      template<typename _Tp>
-        static bool
-        equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2,
-             const _Tp* __last2)
-        {
-         return !__builtin_memcmp(__first1, __first2, sizeof(_Tp)
-                                  * (__last1 - __first1));
-       }
-#endif
     };
 
   template<typename _II1, typename _II2>
@@ -851,66 +827,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return std::__equal<__simple>::equal(__first1, __last1, __first2);
     }
 
-#if __cplusplus > 201103L
-  template<bool _BoolType>
-    struct __equal2
-    {
-      template<typename _It>
-       using _IterCat = typename iterator_traits<_It>::iterator_category;
-      template<typename _It>
-       using _IsRA = is_same<_IterCat<_It>, random_access_iterator_tag>;
-
-      template<typename _II1, typename _II2>
-        static bool
-        equal(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
-        {
-         constexpr bool __ra_iters = _IsRA<_II1>() && _IsRA<_II2>();
-         if (__ra_iters)
-           {
-             auto __d1 = std::distance(__first1, __last1);
-             auto __d2 = std::distance(__first2, __last2);
-             if (__d1 != __d2)
-               return false;
-           }
-         for (; __first1 != __last1 && __first2 != __last2;
-              ++__first1, ++__first2)
-           if (!(*__first1 == *__first2))
-             return false;
-         return __ra_iters || (__first1 == __last1 && __first2 == __last2);
-       }
-    };
-
-  template<>
-    struct __equal2<true>
-    {
-      template<typename _Tp>
-        static bool
-        equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2,
-             const _Tp* __last2)
-        {
-         if ((__last1 - __first1) != (__last2 - __first2))
-           return false;
-         return !__builtin_memcmp(__first1, __first2, sizeof(_Tp)
-                                  * (__last1 - __first1));
-       }
-    };
-
-  template<typename _II1, typename _II2>
-    inline bool
-    __equal2_aux(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
-    {
-      typedef typename iterator_traits<_II1>::value_type _ValueType1;
-      typedef typename iterator_traits<_II2>::value_type _ValueType2;
-      const bool __simple = ((__is_integer<_ValueType1>::__value
-                             || __is_pointer<_ValueType1>::__value)
-                            && __is_pointer<_II1>::__value
-                            && __is_pointer<_II2>::__value
-                            && __are_same<_ValueType1, _ValueType2>::__value);
-
-      return __equal2<__simple>::equal(__first1, __last1, __first2, __last2);
-    }
-#endif
-
   template<typename, typename>
     struct __lc_rai
     {
@@ -1174,10 +1090,23 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
       __glibcxx_requires_valid_range(__first1, __last1);
       __glibcxx_requires_valid_range(__first2, __last2);
 
-      return std::__equal2_aux(std::__niter_base(__first1),
-                              std::__niter_base(__last1),
-                              std::__niter_base(__first2),
-                              std::__niter_base(__last2));
+      using _RATag = random_access_iterator_tag;
+      using _Cat1 = typename iterator_traits<_II1>::iterator_category;
+      using _Cat2 = typename iterator_traits<_II2>::iterator_category;
+      using _RAIters = __and_<is_same<_Cat1, _RATag>, is_same<_Cat2, _RATag>>;
+      if (_RAIters())
+       {
+         auto __d1 = std::distance(__first1, __last1);
+         auto __d2 = std::distance(__first2, __last2);
+         if (__d1 != __d2)
+           return false;
+         return std::equal(__first1, __last1, __first2);
+       }
+
+      for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+       if (!(*__first1 == *__first2))
+         return false;
+      return __first1 == __last1 && __first2 == __last2;
     }
 
   /**
@@ -1207,23 +1136,23 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
       __glibcxx_requires_valid_range(__first1, __last1);
       __glibcxx_requires_valid_range(__first2, __last2);
 
+      using _RATag = random_access_iterator_tag;
       using _Cat1 = typename iterator_traits<_IIter1>::iterator_category;
       using _Cat2 = typename iterator_traits<_IIter2>::iterator_category;
-      using _IIter1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
-      using _IIter2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
-      constexpr bool __ra_iters = _IIter1_is_RA() && _IIter1_is_RA();
-      if (__ra_iters)
+      using _RAIters = __and_<is_same<_Cat1, _RATag>, is_same<_Cat2, _RATag>>;
+      if (_RAIters())
        {
          auto __d1 = std::distance(__first1, __last1);
          auto __d2 = std::distance(__first2, __last2);
          if (__d1 != __d2)
            return false;
+         return std::equal(__first1, __last1, __first2, __binary_pred);
        }
 
       for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
        if (!bool(__binary_pred(*__first1, *__first2)))
          return false;
-      return __ra_iters || (__first1 == __last1 && __first2 == __last2);
+      return __first1 == __last1 && __first2 == __last2;
     }
 #endif