// -*- C++ -*- //===-- test_includes.cpp -------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // Tests for partial_sort #include #include "pstl/execution" #include "pstl/algorithm" #include "utils.h" using namespace TestUtils; template struct Num { T val; explicit Num(const T& v) : val(v) {} //for "includes" checks template bool operator<(const Num& v1) const { return val < v1.val; } //The types Type1 and Type2 must be such that an object of type InputIt can be dereferenced and then implicitly converted to both of them template operator Num() const { return Num((T1)val); } }; struct test_one_policy { template typename std::enable_if::value, void>::type operator()(Policy&& exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp) { auto expect_res = std::includes(first1, last1, first2, last2, comp); auto res = std::includes(exec, first1, last1, first2, last2, comp); EXPECT_TRUE(expect_res == res, "wrong result for includes"); } template typename std::enable_if::value, void>::type operator()(Policy&& exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp) { } }; template void test_includes(Compare compare) { const std::size_t n_max = 1000000; // The rand()%(2*n+1) encourages generation of some duplicates. std::srand(42); for (std::size_t n = 0; n < n_max; n = n <= 16 ? n + 1 : size_t(3.1415 * n)) { for (std::size_t m = 0; m < n_max; m = m <= 16 ? m + 1 : size_t(2.71828 * m)) { //prepare the input ranges Sequence in1(n, [n](std::size_t k) { return rand() % (2 * k + 1); }); Sequence in2(m, [m](std::size_t k) { return rand() % (k + 1); }); std::sort(in1.begin(), in1.end(), compare); std::sort(in2.begin(), in2.end(), compare); invoke_on_all_policies(test_one_policy(), in1.begin(), in1.end(), in2.cbegin(), in2.cend(), compare); //test w/ non constant predicate if (n < 5 && m < 5) invoke_on_all_policies(test_one_policy(), in1.begin(), in1.end(), in2.cbegin(), in2.cend(), non_const(compare)); } } } int32_t main() { test_includes(__pstl::internal::pstl_less()); test_includes, Num>([](const Num& x, const Num& y) { return x < y; }); std::cout << done() << std::endl; return 0; }