| /* { dg-additional-options -std=c++23 } */ | |
| /* std::views stuff. Also tests std::tuple with std::views::zip. */ | |
| #include <algorithm> | |
| #include <ranges> | |
| #include <span> | |
| //TODO PR120454 "C++ constexpr vs. OpenMP implicit mapping" | |
| #pragma omp declare target(std::ranges::all_of, std::ranges::equal, std::ranges::fold_left, std::views::reverse, std::views::zip) | |
| #include "target-flex-common.h" | |
| namespace stdr = std::ranges; | |
| namespace stdv = std::views; | |
| bool f() | |
| { | |
| const int arr_fwd[8] = {0, 1, 2, 3, 4, 5, 6, 7}; | |
| const int arr_rev[8] = {7, 6, 5, 4, 3, 2, 1, 0}; | |
| bool ok; | |
| #pragma omp target defaultmap(none) map(from: ok) map(to: arr_fwd[ :8], arr_rev[ :8]) | |
| { | |
| std::span<const int> fwd = {arr_fwd, 8}; | |
| std::span<const int> rev = {arr_rev, 8}; | |
| bool inner_ok = true; | |
| { | |
| VERIFY(stdr::equal(fwd, rev | stdv::reverse)); | |
| VERIFY(stdr::equal(fwd | stdv::drop(4) | stdv::reverse, | |
| rev | stdv::take(4))); | |
| for (auto [first, second] : stdv::zip(fwd, rev)) | |
| VERIFY(first + second == 7); | |
| auto plus = [](int a, int b){ return a + b; }; | |
| auto is_even = [](int v){ return v % 2 == 0; }; | |
| VERIFY(stdr::fold_left(fwd | stdv::filter(is_even), 0, plus) | |
| == 12); | |
| VERIFY(stdr::all_of(fwd | stdv::transform([](int v){ return v * 2; }), | |
| is_even)); | |
| } | |
| end: | |
| ok = inner_ok; | |
| } | |
| return ok; | |
| } | |
| int main() | |
| { | |
| return f() ? 0 : 1; | |
| } |