@@ -23,17 +23,25 @@ main()
2323 namespace dpl_ranges = oneapi::dpl::ranges;
2424
2525 auto copy_if_checker = [](std::ranges::random_access_range auto && r_in,
26- std::ranges::random_access_range auto && r_out, auto &&... args )
26+ std::ranges::random_access_range auto && r_out, auto pred, auto proj )
2727 {
28- auto res = std::ranges::copy_if (std::forward<decltype (r_in)>(r_in), std::ranges::begin (r_out),
29- std::forward<decltype (args)>(args)...);
30-
3128 using ret_type = std::ranges::copy_if_result<std::ranges::borrowed_iterator_t <decltype (r_in)>,
3229 std::ranges::borrowed_iterator_t <decltype (r_out)>>;
33- return ret_type{res.in , res.out };
30+
31+ auto it_in = std::ranges::begin (r_in);
32+ auto it_out = std::ranges::begin (r_out);
33+ for (; it_in != std::ranges::end (r_in) && it_out != std::ranges::end (r_out); ++it_in)
34+ {
35+ if (std::invoke (pred, std::invoke (proj, *it_in)))
36+ {
37+ *it_out = *it_in;
38+ ++it_out;
39+ }
40+ }
41+ return ret_type{it_in, it_out};
3442 };
3543
36- test_range_algo<0 , int , data_in_out>{big_sz}(dpl_ranges::copy_if, copy_if_checker, pred);
44+ test_range_algo<0 , int , data_in_out>{big_sz}(dpl_ranges::copy_if, copy_if_checker, pred, std::identity{} );
3745 test_range_algo<1 , int , data_in_out>{}(dpl_ranges::copy_if, copy_if_checker, pred, proj);
3846 test_range_algo<2 , P2, data_in_out>{}(dpl_ranges::copy_if, copy_if_checker, pred, &P2::x);
3947 test_range_algo<3 , P2, data_in_out>{}(dpl_ranges::copy_if, copy_if_checker, pred, &P2::proj);
0 commit comments