]>
Commit | Line | Data |
---|---|---|
0f3b4d38 PP |
1 | // { dg-do run { target c++23 } } |
2 | ||
3 | #include <ranges> | |
4 | #include <algorithm> | |
5 | #include <memory> | |
6 | #include <testsuite_hooks.h> | |
7 | #include <testsuite_iterators.h> | |
8 | ||
9 | #if __cpp_lib_ranges_enumerate != 202302L | |
10 | # error "Feature-test macro __cpp_lib_ranges_enumerate has wrong value in <ranges>" | |
11 | #endif | |
12 | ||
13 | namespace ranges = std::ranges; | |
14 | namespace views = std::views; | |
15 | ||
16 | using __gnu_test::test_input_range; | |
17 | using __gnu_test::test_forward_range; | |
18 | using __gnu_test::test_bidirectional_range; | |
19 | using __gnu_test::test_random_access_range; | |
20 | ||
21 | constexpr bool | |
22 | test01() | |
23 | { | |
24 | int x[] = {1, 2, 3}; | |
25 | auto v = x | views::enumerate; | |
26 | ||
27 | VERIFY( ranges::equal(v | views::keys, (int[]){0, 1, 2}) ); | |
28 | VERIFY( ranges::equal(v | views::values, (int[]){1, 2, 3}) ); | |
29 | ||
30 | auto it = v.begin(); | |
31 | VERIFY( it == it ); | |
32 | VERIFY( it != it + 1 ); | |
33 | VERIFY( it != v.end() ); | |
34 | ||
35 | VERIFY( it.index() == 0 ); | |
36 | VERIFY( (++it).index() == 1 ); | |
37 | VERIFY( (++it).index() == 2 ); | |
38 | ||
39 | return true; | |
40 | } | |
41 | ||
42 | template<template<class> class Container> | |
43 | void | |
44 | test02() | |
45 | { | |
46 | int x[] = {1, 2, 3}; | |
47 | Container<int> rx (x); | |
48 | auto v = rx | views::enumerate; | |
49 | ||
50 | int j = 0; | |
51 | for (auto [i, y] : v) | |
52 | { | |
53 | VERIFY (&y == &x[j]); | |
54 | VERIFY (j == i); | |
55 | ++j; | |
56 | } | |
57 | VERIFY (j == ranges::size(x)); | |
58 | ||
59 | if constexpr (ranges::bidirectional_range<decltype(rx)>) | |
60 | { | |
61 | static_assert(ranges::bidirectional_range<decltype(v)>); | |
62 | for (auto [i, y] : v | views::reverse) | |
63 | { | |
64 | --j; | |
65 | VERIFY (&y == &x[j]); | |
66 | VERIFY (j == i); | |
67 | } | |
68 | VERIFY (j == 0); | |
69 | } | |
70 | ||
71 | if constexpr (ranges::random_access_range<decltype(rx)>) | |
72 | { | |
73 | static_assert(ranges::random_access_range<decltype(v)>); | |
74 | for (j = 0; j < ranges::ssize(x); ++j) | |
75 | { | |
76 | VERIFY (std::get<0>(v[j]) == j); | |
77 | VERIFY (&std::get<1>(v[j]) == &x[j]); | |
78 | VERIFY (*(v.begin() + j) == v[j]); | |
79 | VERIFY (*(v.begin() + (ranges::size(x) - 1) - j) == v[ranges::size(x) - 1 - j]); | |
80 | VERIFY (v.begin() + j + 1 > v.begin() + j ); | |
81 | VERIFY (v.begin() + j < v.begin() + j + 1 ); | |
82 | VERIFY (v.begin() + j >= v.begin() ); | |
83 | VERIFY (v.begin() <= v.begin() + j ); | |
84 | VERIFY( v.begin() + j != v.end() ); | |
85 | VERIFY( v.begin() + j - v.begin() == j ); | |
86 | VERIFY( v.end() - (v.begin() + j) == ranges::ssize(x) - j ); | |
87 | } | |
88 | VERIFY( v.begin() + j == v.end() ); | |
89 | } | |
90 | } | |
91 | ||
92 | int | |
93 | main() | |
94 | { | |
95 | static_assert(test01()); | |
96 | ||
97 | test02<test_input_range>(); | |
98 | test02<test_forward_range>(); | |
99 | test02<test_bidirectional_range>(); | |
100 | test02<test_random_access_range>(); | |
101 | } |