13b62047bSLouis Dionne // -*- C++ -*- 23b62047bSLouis Dionne //===-- mismatch.pass.cpp -------------------------------------------------===// 33b62047bSLouis Dionne // 43b62047bSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 53b62047bSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 63b62047bSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73b62047bSLouis Dionne // 83b62047bSLouis Dionne //===----------------------------------------------------------------------===// 93b62047bSLouis Dionne 10*6ab35c9dSLouis Dionne // UNSUPPORTED: c++98, c++03, c++11, c++14 11*6ab35c9dSLouis Dionne 123b62047bSLouis Dionne #include "support/pstl_test_config.h" 133b62047bSLouis Dionne 143b62047bSLouis Dionne #include <execution> 153b62047bSLouis Dionne #include <algorithm> 163b62047bSLouis Dionne 173b62047bSLouis Dionne #include "support/utils.h" 183b62047bSLouis Dionne 193b62047bSLouis Dionne using namespace TestUtils; 203b62047bSLouis Dionne 213b62047bSLouis Dionne struct test_mismatch 223b62047bSLouis Dionne { 233b62047bSLouis Dionne template <typename Policy, typename Iterator1, typename Iterator2> 243b62047bSLouis Dionne void 253b62047bSLouis Dionne operator()(Policy&& exec, Iterator1 first1, Iterator1 last1, Iterator2 first2) 263b62047bSLouis Dionne { 273b62047bSLouis Dionne using namespace std; 283b62047bSLouis Dionne typedef typename iterator_traits<Iterator1>::value_type T; 293b62047bSLouis Dionne { 303b62047bSLouis Dionne const auto expected = std::mismatch(first1, last1, first2, std::equal_to<T>()); 313b62047bSLouis Dionne const auto res3 = mismatch(exec, first1, last1, first2, std::equal_to<T>()); 323b62047bSLouis Dionne EXPECT_TRUE(expected == res3, "wrong return result from mismatch"); 333b62047bSLouis Dionne const auto res4 = mismatch(exec, first1, last1, first2); 343b62047bSLouis Dionne EXPECT_TRUE(expected == res4, "wrong return result from mismatch"); 353b62047bSLouis Dionne } 363b62047bSLouis Dionne } 373b62047bSLouis Dionne template <typename Policy, typename Iterator1, typename Iterator2> 383b62047bSLouis Dionne void 393b62047bSLouis Dionne operator()(Policy&& exec, Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) 403b62047bSLouis Dionne { 413b62047bSLouis Dionne using namespace std; 423b62047bSLouis Dionne typedef typename iterator_traits<Iterator1>::value_type T; 433b62047bSLouis Dionne { 449d54063cSLouis Dionne const auto expected = mismatch(std::execution::seq, first1, last1, first2, last2, std::equal_to<T>()); 453b62047bSLouis Dionne const auto res1 = mismatch(exec, first1, last1, first2, last2, std::equal_to<T>()); 463b62047bSLouis Dionne EXPECT_TRUE(expected == res1, "wrong return result from mismatch"); 473b62047bSLouis Dionne const auto res2 = mismatch(exec, first1, last1, first2, last2); 483b62047bSLouis Dionne EXPECT_TRUE(expected == res2, "wrong return result from mismatch"); 493b62047bSLouis Dionne } 503b62047bSLouis Dionne } 513b62047bSLouis Dionne }; 523b62047bSLouis Dionne 533b62047bSLouis Dionne template <typename T> 543b62047bSLouis Dionne void 553b62047bSLouis Dionne test_mismatch_by_type() 563b62047bSLouis Dionne { 573b62047bSLouis Dionne using namespace std; 583b62047bSLouis Dionne for (size_t size = 0; size <= 100000; size = size <= 16 ? size + 1 : size_t(3.1415 * size)) 593b62047bSLouis Dionne { 603b62047bSLouis Dionne const T val = T(-1); 613b62047bSLouis Dionne Sequence<T> in(size, [](size_t v) -> T { return T(v % 100); }); 623b62047bSLouis Dionne { 633b62047bSLouis Dionne Sequence<T> in2(in); 643b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in.begin(), in.end(), in2.begin(), in2.end()); 653b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in.begin(), in.end(), in2.begin()); 663b62047bSLouis Dionne 673b62047bSLouis Dionne const size_t min_size = 3; 683b62047bSLouis Dionne if (size > min_size) 693b62047bSLouis Dionne { 703b62047bSLouis Dionne const size_t idx_for_1 = size / min_size; 713b62047bSLouis Dionne in[idx_for_1] = val, in[idx_for_1 + 1] = val, in[idx_for_1 + 2] = val; 723b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in.begin(), in.end(), in2.begin(), in2.end()); 733b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in.begin(), in.end(), in2.begin()); 743b62047bSLouis Dionne } 753b62047bSLouis Dionne 763b62047bSLouis Dionne const size_t idx_for_2 = 500; 773b62047bSLouis Dionne if (size >= idx_for_2 - 1) 783b62047bSLouis Dionne { 793b62047bSLouis Dionne in2[size / idx_for_2] = val; 803b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin(), in2.cend()); 813b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin()); 823b62047bSLouis Dionne } 833b62047bSLouis Dionne } 843b62047bSLouis Dionne { 853b62047bSLouis Dionne Sequence<T> in2(100, [](size_t v) -> T { return T(v); }); 863b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in2.begin(), in2.end(), in.begin(), in.end()); 873b62047bSLouis Dionne // We can't call std::mismatch with semantic below when size of second sequence less than size of first sequence 883b62047bSLouis Dionne if (in2.size() <= in.size()) 893b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in2.begin(), in2.end(), in.begin()); 903b62047bSLouis Dionne 913b62047bSLouis Dionne const size_t idx = 97; 923b62047bSLouis Dionne in2[idx] = val; 933b62047bSLouis Dionne in2[idx + 1] = val; 943b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin(), in2.cend()); 953b62047bSLouis Dionne if (in.size() <= in2.size()) 963b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin()); 973b62047bSLouis Dionne } 983b62047bSLouis Dionne { 993b62047bSLouis Dionne Sequence<T> in2({}); 1003b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in2.begin(), in2.end(), in.begin(), in.end()); 1013b62047bSLouis Dionne 1023b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin(), in2.cend()); 1033b62047bSLouis Dionne if (in.size() == 0) 1043b62047bSLouis Dionne invoke_on_all_policies(test_mismatch(), in.cbegin(), in.cend(), in2.cbegin()); 1053b62047bSLouis Dionne } 1063b62047bSLouis Dionne } 1073b62047bSLouis Dionne } 1083b62047bSLouis Dionne 1093b62047bSLouis Dionne template <typename T> 1103b62047bSLouis Dionne struct test_non_const 1113b62047bSLouis Dionne { 1123b62047bSLouis Dionne template <typename Policy, typename FirstIterator, typename SecondInterator> 1133b62047bSLouis Dionne void 1143b62047bSLouis Dionne operator()(Policy&& exec, FirstIterator first_iter, SecondInterator second_iter) 1153b62047bSLouis Dionne { 1163b62047bSLouis Dionne mismatch(exec, first_iter, first_iter, second_iter, second_iter, non_const(std::less<T>())); 1173b62047bSLouis Dionne } 1183b62047bSLouis Dionne }; 1193b62047bSLouis Dionne 1203b62047bSLouis Dionne int32_t 1213b62047bSLouis Dionne main() 1223b62047bSLouis Dionne { 1233b62047bSLouis Dionne 1243b62047bSLouis Dionne test_mismatch_by_type<int32_t>(); 1253b62047bSLouis Dionne test_mismatch_by_type<float64_t>(); 1263b62047bSLouis Dionne test_mismatch_by_type<Wrapper<int32_t>>(); 1273b62047bSLouis Dionne 1283b62047bSLouis Dionne test_algo_basic_double<int32_t>(run_for_rnd_fw<test_non_const<int32_t>>()); 1293b62047bSLouis Dionne 1303b62047bSLouis Dionne std::cout << done() << std::endl; 1313b62047bSLouis Dionne return 0; 1323b62047bSLouis Dionne } 133