]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/std/ranges/adaptors/enumerate/1.cc
libstdc++: Remove dg-options "-std=gnu++23" from remaining tests
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / std / ranges / adaptors / enumerate / 1.cc
CommitLineData
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
13namespace ranges = std::ranges;
14namespace views = std::views;
15
16using __gnu_test::test_input_range;
17using __gnu_test::test_forward_range;
18using __gnu_test::test_bidirectional_range;
19using __gnu_test::test_random_access_range;
20
21constexpr bool
22test01()
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
42template<template<class> class Container>
43void
44test02()
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
92int
93main()
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}