// -*- C++ -*- //===-- mismatch.pass.cpp -------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11, c++14 #include "support/pstl_test_config.h" #include <execution> #include <algorithm> #include "support/utils.h" using namespace TestUtils; struct test_mismatch { template <typename Policy, typename Iterator1, typename Iterator2> void operator()(Policy&& exec, Iterator1 first1, Iterator1 last1, Iterator2 first2) { using namespace std; typedef typename iterator_traits<Iterator1>::value_type T; { const auto expected = std::mismatch(first1, last1, first2, std::equal_to<T>()); const auto res3 = mismatch(exec, first1, last1, first2, std::equal_to<T>()); EXPECT_TRUE(expected == res3, "wrong return result from mismatch"); const auto res4 = mismatch(exec, first1, last1, first2); EXPECT_TRUE(expected == res4, "wrong return result from mismatch"); } } template <typename Policy, typename Iterator1, typename Iterator2> void operator()(Policy&& exec, Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) { using namespace std; typedef typename iterator_traits<Iterator1>::value_type T; { const auto expected = mismatch(std::execution::seq, first1, last1, first2, last2, std::equal_to<T>()); const auto res1 = mismatch(exec, first1, last1, first2, last2, std::equal_to<T>()); EXPECT_TRUE(expected == res1, "wrong return result from mismatch"); const auto res2 = mismatch(exec, first1, last1, first2, last2); EXPECT_TRUE(expected == res2, "wrong return result from mismatch"); } } }; template <typename T> void test_mismatch_by_type() { using namespace std; for (size_t size = 0; size <= 100000; size = size <= 16 ? size + 1 : size_t(3.1415 * size)) { const T val = T(-1); Sequence<T> in(size, [](size_t v) -> T { return T(v % 100); }); { Sequence<T> in2(in); invoke_on_all_policies(test_mismatch(), in.begin(), in.end(), in2.begin(), in2.end()); invoke_on_all_policies(test_mismatch(), in.begin(), in.end(), in2.begin()); const size_t min_size = 3; if (size > min_size) { const size_t idx_for_1 = size / min_size; in[idx_for_1] = val, in[idx_for_1 + 1] = val, in[idx_for_1 + 2] = val; invoke_on_all_policies(test_mismatch(), in.begin(), in.end(), in2.begin(), in2.end()); invoke_on_all_policies(test_mismatch(), in.begin(), in.end(), in2.begin()); } const size_t idx_for_2 = 500; if (size >= idx_for_2 - 1) { in2[size / idx_for_2] = val; invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin(), in2.cend()); invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin()); } } { Sequence<T> in2(100, [](size_t v) -> T { return T(v); }); invoke_on_all_policies(test_mismatch(), in2.begin(), in2.end(), in.begin(), in.end()); // We can't call std::mismatch with semantic below when size of second sequence less than size of first sequence if (in2.size() <= in.size()) invoke_on_all_policies(test_mismatch(), in2.begin(), in2.end(), in.begin()); const size_t idx = 97; in2[idx] = val; in2[idx + 1] = val; invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin(), in2.cend()); if (in.size() <= in2.size()) invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin()); } { Sequence<T> in2({}); invoke_on_all_policies(test_mismatch(), in2.begin(), in2.end(), in.begin(), in.end()); invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin(), in2.cend()); if (in.size() == 0) invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin()); } } } template <typename T> struct test_non_const { template <typename Policy, typename FirstIterator, typename SecondInterator> void operator()(Policy&& exec, FirstIterator first_iter, SecondInterator second_iter) { mismatch(exec, first_iter, first_iter, second_iter, second_iter, non_const(std::less<T>())); } }; int main() { test_mismatch_by_type<int32_t>(); test_mismatch_by_type<float64_t>(); test_mismatch_by_type<Wrapper<int32_t>>(); test_algo_basic_double<int32_t>(run_for_rnd_fw<test_non_const<int32_t>>()); std::cout << done() << std::endl; return 0; }