Initial PSTL commit
[lldb.git] / pstl / test / test_reverse.cpp
1 // -*- C++ -*-
2 //===-- test_reverse.cpp --------------------------------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #include "pstl_test_config.h"
12
13 #include <iterator>
14
15 #include "pstl/execution"
16 #include "pstl/algorithm"
17 #include "utils.h"
18
19 using namespace TestUtils;
20
21 struct test_one_policy
22 {
23 #if __PSTL_ICC_18_VC141_TEST_SIMD_LAMBDA_RELEASE_BROKEN || __PSTL_ICC_17_VC141_TEST_SIMD_LAMBDA_DEBUG_32_BROKEN ||     \
24     __PSTL_ICC_16_VC14_TEST_SIMD_LAMBDA_DEBUG_32_BROKEN // dummy specialization by policy type, in case of broken configuration
25     template <typename Iterator1, typename Iterator2>
26     typename std::enable_if<is_same_iterator_category<Iterator1, std::random_access_iterator_tag>::value, void>::type
27     operator()(pstl::execution::unsequenced_policy, Iterator1 data_b, Iterator1 data_e, Iterator2 actual_b,
28                Iterator2 actual_e)
29     {
30     }
31     template <typename Iterator1, typename Iterator2>
32     typename std::enable_if<is_same_iterator_category<Iterator1, std::random_access_iterator_tag>::value, void>::type
33     operator()(pstl::execution::parallel_unsequenced_policy, Iterator1 data_b, Iterator1 data_e, Iterator2 actual_b,
34                Iterator2 actual_e)
35     {
36     }
37 #endif
38
39     template <typename ExecutionPolicy, typename Iterator1, typename Iterator2>
40     typename std::enable_if<!is_same_iterator_category<Iterator1, std::forward_iterator_tag>::value>::type
41     operator()(ExecutionPolicy&& exec, Iterator1 data_b, Iterator1 data_e, Iterator2 actual_b, Iterator2 actual_e)
42     {
43         using namespace std;
44
45         copy(data_b, data_e, actual_b);
46
47         reverse(exec, actual_b, actual_e);
48
49         bool check = equal(data_b, data_e, reverse_iterator<Iterator2>(actual_e));
50
51         EXPECT_TRUE(check, "wrong result of reverse");
52     }
53
54     template <typename ExecutionPolicy, typename Iterator1, typename Iterator2>
55     typename std::enable_if<is_same_iterator_category<Iterator1, std::forward_iterator_tag>::value>::type
56     operator()(ExecutionPolicy&& exec, Iterator1 data_b, Iterator1 data_e, Iterator2 actual_b, Iterator2 actual_e)
57     {
58     }
59 };
60
61 template <typename T>
62 void
63 test()
64 {
65     const std::size_t max_len = 100000;
66
67     Sequence<T> actual(max_len);
68
69     Sequence<T> data(max_len, [](std::size_t i) { return T(i); });
70
71     for (std::size_t len = 0; len < max_len; len = len <= 16 ? len + 1 : std::size_t(3.1415 * len))
72     {
73         invoke_on_all_policies(test_one_policy(), data.begin(), data.begin() + len, actual.begin(),
74                                actual.begin() + len);
75     }
76 }
77
78 template <typename T>
79 struct wrapper
80 {
81     T t;
82     wrapper() {}
83     explicit wrapper(T t_) : t(t_) {}
84     bool
85     operator==(const wrapper<T>& a) const
86     {
87         return t == a.t;
88     }
89 };
90
91 int32_t
92 main()
93 {
94     test<int32_t>();
95     test<uint16_t>();
96     test<float64_t>();
97 #if !__PSTL_ICC_17_TEST_MAC_RELEASE_32_BROKEN
98     test<wrapper<float64_t>>();
99 #endif
100
101     std::cout << done() << std::endl;
102     return 0;
103 }