@@ -1082,6 +1082,60 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
10821082 return true ;
10831083 }
10841084
1085+ #if __cplusplus >= 201103L
1086+ // 4-iterator version of std::equal<It1, It2> for use in C++11.
1087+ template <typename _II1, typename _II2>
1088+ inline bool
1089+ __equal4 (_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
1090+ {
1091+ using _RATag = random_access_iterator_tag;
1092+ using _Cat1 = typename iterator_traits<_II1>::iterator_category;
1093+ using _Cat2 = typename iterator_traits<_II2>::iterator_category;
1094+ using _RAIters = __and_<is_same<_Cat1, _RATag>, is_same<_Cat2, _RATag>>;
1095+ if (_RAIters ())
1096+ {
1097+ auto __d1 = std::distance (__first1, __last1);
1098+ auto __d2 = std::distance (__first2, __last2);
1099+ if (__d1 != __d2)
1100+ return false ;
1101+ return _GLIBCXX_STD_A::equal (__first1, __last1, __first2);
1102+ }
1103+
1104+ for (; __first1 != __last1 && __first2 != __last2;
1105+ ++__first1, (void )++__first2)
1106+ if (!(*__first1 == *__first2))
1107+ return false ;
1108+ return __first1 == __last1 && __first2 == __last2;
1109+ }
1110+
1111+ // 4-iterator version of std::equal<It1, It2, BinaryPred> for use in C++11.
1112+ template <typename _II1, typename _II2, typename _BinaryPredicate>
1113+ inline bool
1114+ __equal4 (_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2,
1115+ _BinaryPredicate __binary_pred)
1116+ {
1117+ using _RATag = random_access_iterator_tag;
1118+ using _Cat1 = typename iterator_traits<_II1>::iterator_category;
1119+ using _Cat2 = typename iterator_traits<_II2>::iterator_category;
1120+ using _RAIters = __and_<is_same<_Cat1, _RATag>, is_same<_Cat2, _RATag>>;
1121+ if (_RAIters ())
1122+ {
1123+ auto __d1 = std::distance (__first1, __last1);
1124+ auto __d2 = std::distance (__first2, __last2);
1125+ if (__d1 != __d2)
1126+ return false ;
1127+ return _GLIBCXX_STD_A::equal (__first1, __last1, __first2,
1128+ __binary_pred);
1129+ }
1130+
1131+ for (; __first1 != __last1 && __first2 != __last2;
1132+ ++__first1, (void )++__first2)
1133+ if (!bool (__binary_pred (*__first1, *__first2)))
1134+ return false ;
1135+ return __first1 == __last1 && __first2 == __last2;
1136+ }
1137+ #endif // C++11
1138+
10851139#if __cplusplus > 201103L
10861140
10871141#define __cpp_lib_robust_nonmodifying_seq_ops 201304
@@ -1112,24 +1166,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
11121166 __glibcxx_requires_valid_range (__first1, __last1);
11131167 __glibcxx_requires_valid_range (__first2, __last2);
11141168
1115- using _RATag = random_access_iterator_tag;
1116- using _Cat1 = typename iterator_traits<_II1>::iterator_category;
1117- using _Cat2 = typename iterator_traits<_II2>::iterator_category;
1118- using _RAIters = __and_<is_same<_Cat1, _RATag>, is_same<_Cat2, _RATag>>;
1119- if (_RAIters ())
1120- {
1121- auto __d1 = std::distance (__first1, __last1);
1122- auto __d2 = std::distance (__first2, __last2);
1123- if (__d1 != __d2)
1124- return false ;
1125- return _GLIBCXX_STD_A::equal (__first1, __last1, __first2);
1126- }
1127-
1128- for (; __first1 != __last1 && __first2 != __last2;
1129- ++__first1, (void )++__first2)
1130- if (!(*__first1 == *__first2))
1131- return false ;
1132- return __first1 == __last1 && __first2 == __last2;
1169+ return _GLIBCXX_STD_A::__equal4 (__first1, __last1, __first2, __last2);
11331170 }
11341171
11351172 /* *
@@ -1159,27 +1196,10 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
11591196 __glibcxx_requires_valid_range (__first1, __last1);
11601197 __glibcxx_requires_valid_range (__first2, __last2);
11611198
1162- using _RATag = random_access_iterator_tag;
1163- using _Cat1 = typename iterator_traits<_IIter1>::iterator_category;
1164- using _Cat2 = typename iterator_traits<_IIter2>::iterator_category;
1165- using _RAIters = __and_<is_same<_Cat1, _RATag>, is_same<_Cat2, _RATag>>;
1166- if (_RAIters ())
1167- {
1168- auto __d1 = std::distance (__first1, __last1);
1169- auto __d2 = std::distance (__first2, __last2);
1170- if (__d1 != __d2)
1171- return false ;
1172- return _GLIBCXX_STD_A::equal (__first1, __last1, __first2,
1173- __binary_pred);
1174- }
1175-
1176- for (; __first1 != __last1 && __first2 != __last2;
1177- ++__first1, (void )++__first2)
1178- if (!bool (__binary_pred (*__first1, *__first2)))
1179- return false ;
1180- return __first1 == __last1 && __first2 == __last2;
1199+ return _GLIBCXX_STD_A::__equal4 (__first1, __last1, __first2, __last2,
1200+ __binary_pred);
11811201 }
1182- #endif
1202+ #endif // C++14
11831203
11841204 /* *
11851205 * @brief Performs @b dictionary comparison on ranges.
0 commit comments