diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm index 39191db97768..f7e26cfeaa34 100644 --- a/libcxx/include/algorithm +++ b/libcxx/include/algorithm @@ -87,30 +87,63 @@ template pair mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); +template + pair + mismatch(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2); // **C++14** + template pair mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred); +template + pair + mismatch(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, + BinaryPredicate pred); // **C++14** + template bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); +template + bool + equal(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2); // **C++14** + template bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred); +template + bool + equal(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, + BinaryPredicate pred); // **C++14** + template bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); +template + bool + is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2, ForwardIterator2 last2); // **C++14** + template bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, BinaryPredicate pred); +template + bool + is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2, ForwardIterator2 last2, + BinaryPredicate pred); // **C++14** + template ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, @@ -1087,6 +1120,32 @@ mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __fi return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>()); } +#if _LIBCPP_STD_VER > 11 +template +inline _LIBCPP_INLINE_VISIBILITY +pair<_InputIterator1, _InputIterator2> +mismatch(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _BinaryPredicate __pred) +{ + for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2) + if (!__pred(*__first1, *__first2)) + break; + return pair<_InputIterator1, _InputIterator2>(__first1, __first2); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +pair<_InputIterator1, _InputIterator2> +mismatch(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2) +{ + typedef typename iterator_traits<_InputIterator1>::value_type __v1; + typedef typename iterator_traits<_InputIterator2>::value_type __v2; + return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>()); +} +#endif + // equal template @@ -1110,6 +1169,60 @@ equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>()); } +#if _LIBCPP_STD_VER > 11 +template +inline _LIBCPP_INLINE_VISIBILITY +bool +__equal(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred, + input_iterator_tag, input_iterator_tag ) +{ + for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2) + if (!__pred(*__first1, *__first2)) + return false; + return __first1 == __last1 && __first2 == __last2; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, + _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred, + random_access_iterator_tag, random_access_iterator_tag ) +{ + if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2)) + return false; + return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2, + typename add_lvalue_reference<_BinaryPredicate>::type> + (__first1, __last1, __first2, __pred ); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +equal(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred ) +{ + return _VSTD::__equal::type> + (__first1, __last1, __first2, __last2, __pred, + typename iterator_traits<_InputIterator1>::iterator_category(), + typename iterator_traits<_InputIterator2>::iterator_category()); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +equal(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2) +{ + typedef typename iterator_traits<_InputIterator1>::value_type __v1; + typedef typename iterator_traits<_InputIterator2>::value_type __v2; + return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(), + typename iterator_traits<_InputIterator1>::iterator_category(), + typename iterator_traits<_InputIterator2>::iterator_category()); +} +#endif + // is_permutation template @@ -1169,6 +1282,100 @@ is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>()); } +#if _LIBCPP_STD_VER > 11 +template +bool +__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + _BinaryPredicate __pred, + forward_iterator_tag, forward_iterator_tag ) +{ + // shorten sequences as much as possible by lopping of any equal parts + for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2) + if (!__pred(*__first1, *__first2)) + goto __not_done; + return __first1 == __last1 && __first2 == __last2; +__not_done: + // __first1 != __last1 && __first2 != __last2 && *__first1 != *__first2 + typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1; + _D1 __l1 = _VSTD::distance(__first1, __last1); + + typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2; + _D1 __l2 = _VSTD::distance(__first2, __last2); + if (__l1 != __l2) + return false; + + // For each element in [f1, l1) see if there are the same number of + // equal elements in [f2, l2) + for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i) + { + // Have we already counted the number of *__i in [f1, l1)? + for (_ForwardIterator1 __j = __first1; __j != __i; ++__j) + if (__pred(*__j, *__i)) + goto __next_iter; + { + // Count number of *__i in [f2, l2) + _D1 __c2 = 0; + for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j) + if (__pred(*__i, *__j)) + ++__c2; + if (__c2 == 0) + return false; + // Count number of *__i in [__i, l1) (we can start with 1) + _D1 __c1 = 1; + for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j) + if (__pred(*__i, *__j)) + ++__c1; + if (__c1 != __c2) + return false; + } +__next_iter:; + } + return true; +} + +template +bool +__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1, + _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2, + _BinaryPredicate __pred, + random_access_iterator_tag, random_access_iterator_tag ) +{ + if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2)) + return false; + return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2, + typename add_lvalue_reference<_BinaryPredicate>::type> + (__first1, __last1, __first2, __pred ); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + _BinaryPredicate __pred ) +{ + return _VSTD::__is_permutation::type> + (__first1, __last1, __first2, __last2, __pred, + typename iterator_traits<_ForwardIterator1>::iterator_category(), + typename iterator_traits<_ForwardIterator2>::iterator_category()); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2) +{ + typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; + typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; + return _VSTD::__is_permutation(__first1, __last1, __first2, __last2, + __equal_to<__v1, __v2>(), + typename iterator_traits<_ForwardIterator1>::iterator_category(), + typename iterator_traits<_ForwardIterator2>::iterator_category()); +} +#endif + // search template diff --git a/libcxx/test/algorithms/alg.nonmodifying/alg.equal/equal.pass.cpp b/libcxx/test/algorithms/alg.nonmodifying/alg.equal/equal.pass.cpp index 1b1a2ad420fb..6ecd4919f074 100644 --- a/libcxx/test/algorithms/alg.nonmodifying/alg.equal/equal.pass.cpp +++ b/libcxx/test/algorithms/alg.nonmodifying/alg.equal/equal.pass.cpp @@ -19,6 +19,10 @@ #include "test_iterators.h" +#if _LIBCPP_STD_VER > 11 +#define HAS_FOUR_ITERATOR_VERSION +#endif + int main() { int ia[] = {0, 1, 2, 3, 4, 5}; @@ -27,7 +31,36 @@ int main() assert(std::equal(input_iterator(ia), input_iterator(ia+s), input_iterator(ia))); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::equal(input_iterator(ia), + input_iterator(ia+s), + input_iterator(ia), + input_iterator(ia+s))); + assert(std::equal(random_access_iterator(ia), + random_access_iterator(ia+s), + random_access_iterator(ia), + random_access_iterator(ia+s))); +#endif assert(!std::equal(input_iterator(ia), input_iterator(ia+s), input_iterator(ib))); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(!std::equal(input_iterator(ia), + input_iterator(ia+s), + input_iterator(ib), + input_iterator(ib+s))); + assert(!std::equal(random_access_iterator(ia), + random_access_iterator(ia+s), + random_access_iterator(ib), + random_access_iterator(ib+s))); + assert(!std::equal(input_iterator(ia), + input_iterator(ia+s), + input_iterator(ia), + input_iterator(ia+s-1))); + assert(!std::equal(random_access_iterator(ia), + random_access_iterator(ia+s), + random_access_iterator(ia), + random_access_iterator(ia+s-1))); + +#endif } diff --git a/libcxx/test/algorithms/alg.nonmodifying/alg.equal/equal_pred.pass.cpp b/libcxx/test/algorithms/alg.nonmodifying/alg.equal/equal_pred.pass.cpp index b21d38b6ae59..b898220565f8 100644 --- a/libcxx/test/algorithms/alg.nonmodifying/alg.equal/equal_pred.pass.cpp +++ b/libcxx/test/algorithms/alg.nonmodifying/alg.equal/equal_pred.pass.cpp @@ -21,6 +21,17 @@ #include "test_iterators.h" +#if _LIBCPP_STD_VER > 11 +#define HAS_FOUR_ITERATOR_VERSION +#endif + +int comparison_count = 0; +template +bool counting_equals ( const T &a, const T &b ) { + ++comparison_count; + return a == b; + } + int main() { int ia[] = {0, 1, 2, 3, 4, 5}; @@ -30,8 +41,47 @@ int main() input_iterator(ia+s), input_iterator(ia), std::equal_to())); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::equal(input_iterator(ia), + input_iterator(ia+s), + input_iterator(ia), + input_iterator(ia+s), + std::equal_to())); + assert(std::equal(random_access_iterator(ia), + random_access_iterator(ia+s), + random_access_iterator(ia), + random_access_iterator(ia+s), + std::equal_to())); + + comparison_count = 0; + assert(!std::equal(input_iterator(ia), + input_iterator(ia+s), + input_iterator(ia), + input_iterator(ia+s-1), + counting_equals)); + assert(comparison_count > 0); + comparison_count = 0; + assert(!std::equal(random_access_iterator(ia), + random_access_iterator(ia+s), + random_access_iterator(ia), + random_access_iterator(ia+s-1), + counting_equals)); + assert(comparison_count == 0); +#endif assert(!std::equal(input_iterator(ia), input_iterator(ia+s), input_iterator(ib), std::equal_to())); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(!std::equal(input_iterator(ia), + input_iterator(ia+s), + input_iterator(ib), + input_iterator(ib+s), + std::equal_to())); + assert(!std::equal(random_access_iterator(ia), + random_access_iterator(ia+s), + random_access_iterator(ib), + random_access_iterator(ib+s), + std::equal_to())); +#endif } diff --git a/libcxx/test/algorithms/alg.nonmodifying/alg.is_permutation/is_permutation.pass.cpp b/libcxx/test/algorithms/alg.nonmodifying/alg.is_permutation/is_permutation.pass.cpp index f68ccedbbd62..8b5ba60826e4 100644 --- a/libcxx/test/algorithms/alg.nonmodifying/alg.is_permutation/is_permutation.pass.cpp +++ b/libcxx/test/algorithms/alg.nonmodifying/alg.is_permutation/is_permutation.pass.cpp @@ -19,6 +19,10 @@ #include "test_iterators.h" +#if _LIBCPP_STD_VER > 11 +#define HAS_FOUR_ITERATOR_VERSION +#endif + int main() { { @@ -28,9 +32,25 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + 0), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + 0), + forward_iterator(ib), + forward_iterator(ib + 0)) == true); +#endif assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1)) == false); +#endif } { const int ia[] = {0}; @@ -39,6 +59,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { @@ -48,6 +74,16 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1)) == false); +#endif } { const int ia[] = {0, 0}; @@ -56,6 +92,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0}; @@ -64,6 +106,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0}; @@ -72,6 +120,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 1}; @@ -80,6 +134,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 1}; @@ -88,6 +148,16 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1)) == false); +#endif } { const int ia[] = {0, 1}; @@ -96,6 +166,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); +#endif } { const int ia[] = {0, 1}; @@ -104,6 +180,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {1, 0}; @@ -112,6 +194,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {1, 0}; @@ -120,6 +208,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); +#endif } { const int ia[] = {1, 0}; @@ -128,6 +222,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); +#endif } { const int ia[] = {1, 0}; @@ -136,6 +236,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {1, 1}; @@ -144,6 +250,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {1, 1}; @@ -152,6 +264,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {1, 1}; @@ -160,6 +278,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {1, 1}; @@ -168,6 +292,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); +#endif } { @@ -177,6 +307,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -185,6 +321,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -193,6 +335,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -201,6 +349,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -209,6 +363,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -217,6 +377,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -225,6 +391,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -233,6 +405,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -241,6 +419,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0, 1}; @@ -249,6 +433,16 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1)) == false); +#endif } { const int ia[] = {0, 0, 1}; @@ -257,6 +451,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 1, 2}; @@ -265,6 +465,16 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1)) == false); +#endif } { const int ia[] = {0, 1, 2}; @@ -273,6 +483,16 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1)) == false); +#endif } { const int ia[] = {0, 1, 2}; @@ -281,6 +501,16 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1)) == false); +#endif } { const int ia[] = {0, 1, 2}; @@ -289,6 +519,16 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1)) == false); +#endif } { const int ia[] = {0, 0, 1}; @@ -297,6 +537,12 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } { const int ia[] = {0, 0, 1}; @@ -305,6 +551,20 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib + 1), + forward_iterator(ib + sa)) == false); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1)) == false); +#endif } { const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4}; @@ -313,6 +573,20 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib + 1 ), + forward_iterator(ib + sa)) == false); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1)) == false); +#endif } { const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4}; @@ -321,5 +595,11 @@ int main() assert(std::is_permutation(forward_iterator(ia), forward_iterator(ia + sa), forward_iterator(ib)) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa)) == false); +#endif } } diff --git a/libcxx/test/algorithms/alg.nonmodifying/alg.is_permutation/is_permutation_pred.pass.cpp b/libcxx/test/algorithms/alg.nonmodifying/alg.is_permutation/is_permutation_pred.pass.cpp index 2a3174f511cb..ceb897da5148 100644 --- a/libcxx/test/algorithms/alg.nonmodifying/alg.is_permutation/is_permutation_pred.pass.cpp +++ b/libcxx/test/algorithms/alg.nonmodifying/alg.is_permutation/is_permutation_pred.pass.cpp @@ -20,6 +20,18 @@ #include "test_iterators.h" +#if _LIBCPP_STD_VER > 11 +#define HAS_FOUR_ITERATOR_VERSION +#endif + +int comparison_count = 0; +template +bool counting_equals ( const T &a, const T &b ) { + ++comparison_count; + return a == b; + } + + int main() { { @@ -34,6 +46,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {0}; @@ -43,6 +67,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { @@ -53,6 +84,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0}; @@ -62,6 +105,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0}; @@ -71,6 +121,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0}; @@ -80,6 +137,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 1}; @@ -89,6 +153,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 1}; @@ -98,6 +169,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 1}; @@ -107,6 +190,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 1}; @@ -116,6 +211,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {1, 0}; @@ -125,6 +227,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {1, 0}; @@ -134,6 +243,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {1, 0}; @@ -143,6 +264,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {1, 0}; @@ -152,6 +285,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {1, 1}; @@ -161,6 +301,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {1, 1}; @@ -170,6 +317,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {1, 1}; @@ -179,6 +333,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {1, 1}; @@ -188,6 +349,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { @@ -198,6 +371,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -207,6 +387,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -216,6 +403,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -225,6 +419,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -234,6 +435,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -243,6 +451,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -252,6 +467,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -261,6 +483,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 0}; @@ -270,6 +499,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 1}; @@ -279,6 +515,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 1}; @@ -288,6 +536,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 1, 2}; @@ -297,6 +552,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 1, 2}; @@ -306,6 +573,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 1, 2}; @@ -315,6 +594,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 1, 2}; @@ -324,6 +615,18 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 1}; @@ -333,6 +636,13 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 0, 1}; @@ -342,6 +652,23 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib + 1), + forward_iterator(ib + sa), + std::equal_to()) == false); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); +#endif } { const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4}; @@ -351,6 +678,37 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == true); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == true); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib + 1), + forward_iterator(ib + sa), + std::equal_to()) == false); + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + std::equal_to()) == false); + comparison_count = 0; + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa - 1), + counting_equals) == false); + assert ( comparison_count > 0 ); + comparison_count = 0; + assert(std::is_permutation(random_access_iterator(ia), + random_access_iterator(ia + sa), + random_access_iterator(ib), + random_access_iterator(ib + sa - 1), + counting_equals) == false); + assert ( comparison_count == 0 ); +#endif } { const int ia[] = {0, 1, 2, 3, 0, 5, 6, 2, 4, 4}; @@ -360,5 +718,12 @@ int main() forward_iterator(ia + sa), forward_iterator(ib), std::equal_to()) == false); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::is_permutation(forward_iterator(ia), + forward_iterator(ia + sa), + forward_iterator(ib), + forward_iterator(ib + sa), + std::equal_to()) == false); +#endif } } diff --git a/libcxx/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp b/libcxx/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp index 9dfebacf57cd..fe6785413826 100644 --- a/libcxx/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp +++ b/libcxx/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp @@ -19,6 +19,10 @@ #include "test_iterators.h" +#if _LIBCPP_STD_VER > 11 +#define HAS_FOUR_ITERATOR_VERSION +#endif + int main() { int ia[] = {0, 1, 2, 2, 0, 1, 2, 3}; @@ -31,4 +35,24 @@ int main() input_iterator >( input_iterator(ia+3), input_iterator(ib+3)))); + +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::mismatch(input_iterator(ia), + input_iterator(ia + sa), + input_iterator(ib), + input_iterator(ib + sa)) == + (std::pair, + input_iterator >( + input_iterator(ia+3), + input_iterator(ib+3)))); + + assert(std::mismatch(input_iterator(ia), + input_iterator(ia + sa), + input_iterator(ib), + input_iterator(ib + 2)) == + (std::pair, + input_iterator >( + input_iterator(ia+2), + input_iterator(ib+2)))); +#endif } diff --git a/libcxx/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp b/libcxx/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp index 0258479b08f2..202a1b7bcb67 100644 --- a/libcxx/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp +++ b/libcxx/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp @@ -21,6 +21,11 @@ #include "test_iterators.h" +#if _LIBCPP_STD_VER > 11 +#define HAS_FOUR_ITERATOR_VERSION +#endif + + int main() { int ia[] = {0, 1, 2, 2, 0, 1, 2, 3}; @@ -34,6 +39,24 @@ int main() input_iterator >( input_iterator(ia+3), input_iterator(ib+3)))); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::mismatch(input_iterator(ia), + input_iterator(ia + sa), + input_iterator(ib), + input_iterator(ib + sa), + std::equal_to()) == + (std::pair, + input_iterator >( + input_iterator(ia+3), + input_iterator(ib+3)))); +#endif + assert(std::mismatch(ia, ia + sa, ib, std::equal_to()) == (std::pair(ia+3,ib+3))); +#ifdef HAS_FOUR_ITERATOR_VERSION + assert(std::mismatch(ia, ia + sa, ib, ib + sa, std::equal_to()) == + (std::pair(ia+3,ib+3))); + assert(std::mismatch(ia, ia + sa, ib, ib + 2, std::equal_to()) == + (std::pair(ia+2,ib+2))); +#endif }