]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / std / ranges / adaptors / elements.cc
CommitLineData
83ffe9cd 1// Copyright (C) 2020-2023 Free Software Foundation, Inc.
cba9ef06
PP
2//
3// This file is part of the GNU ISO C++ Library. This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 3, or (at your option)
7// any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License along
15// with this library; see the file COPYING3. If not see
16// <http://www.gnu.org/licenses/>.
17
18// { dg-options "-std=gnu++2a" }
19// { dg-do run { target c++2a } }
20
21#include <algorithm>
22#include <ranges>
ac73c944
JW
23#include <tuple>
24#include <vector>
cba9ef06
PP
25#include <testsuite_hooks.h>
26#include <testsuite_iterators.h>
cba9ef06
PP
27
28namespace ranges = std::ranges;
29namespace views = ranges::views;
30
31void
32test01()
33{
34 std::tuple<int, int> x[] = {{1,2},{3,4},{5,6}};
35 auto v0 = x | views::elements<0>;
36 VERIFY( ranges::equal(v0, (int[]){1,3,5}) );
37 VERIFY( ranges::equal(v0, x | views::keys) );
38 VERIFY( ranges::size(v0) == 3 );
39
40 using R0 = decltype(v0);
41 static_assert(ranges::random_access_range<R0>);
42 static_assert(ranges::sized_range<R0>);
43
44 auto v1 = x | views::reverse | views::elements<1> | views::reverse;
45 VERIFY( ranges::equal(v1, (int[]){2,4,6}) );
46 VERIFY( ranges::equal(v1, x | views::values) );
47}
48
4be16d1c
PP
49struct S
50{
51 friend bool
52 operator==(std::input_iterator auto const& i, S)
53 { return std::get<1>(*i) == 0; }
54};
55
56void
57test02()
58{
59 // This verifies that P1994R1 (and LWG3406) is implemented.
60 std::pair<std::pair<char, int>, long> x[]
61 = {{{1,2},3l}, {{1,0},2l}, {{1,2},0l}};
62 ranges::subrange r{ranges::begin(x), S{}};
63
64 auto v = r | views::keys;
65 VERIFY( ranges::equal(v, (std::pair<char, int>[]){{1,2},{1,0}}) );
66 ranges::subrange v2{ranges::begin(v), S{}};
67 VERIFY( ranges::equal(v2, (std::pair<char, int>[]){{1,2}}) );
68}
69
2ec58cfc
JW
70struct X
71{
72 using Iter = __gnu_test::forward_iterator_wrapper<std::pair<int, X>>;
73
74 friend auto operator-(Iter l, Iter r) { return l.ptr - r.ptr; }
75};
76
77void
78test03()
79{
a49a045b
JW
80 using ranges::next;
81 using ranges::begin;
82
2ec58cfc
JW
83 // LWG 3483
84 std::pair<int, X> x[3];
85 __gnu_test::test_forward_range<std::pair<int, X>> r(x);
86 auto v = views::elements<1>(r);
87 auto b = begin(v);
88 static_assert( !ranges::random_access_range<decltype(r)> );
89 static_assert( std::sized_sentinel_for<decltype(b), decltype(b)> );
90 VERIFY( (next(b, 1) - b) == 1 );
91 const auto v_const = v;
92 auto b_const = begin(v_const);
93 VERIFY( (next(b_const, 2) - b_const) == 2 );
94}
95
a25321ca
PP
96template<auto elements = views::elements<0>>
97void
98test04()
99{
100 // Verify SFINAE behavior.
101 static_assert(!requires { elements(); });
102 static_assert(!requires { elements(0, 0); });
103 static_assert(!requires { elements(0); });
104 static_assert(!requires { 0 | elements; });
105}
106
c7fe68f3
PP
107void
108test05()
109{
110 // LWG 3502
111 std::vector<int> vec = {42};
112 auto r1 = vec
113 | views::transform([](auto c) { return std::make_tuple(c, c); })
114 | views::keys;
115 VERIFY( ranges::equal(r1, (int[]){42}) );
116
117 std::tuple<int, int> a[] = {{1,2},{3,4}};
118 auto r2 = a | views::keys;
119 VERIFY( r2[0] == 1 && r2[1] == 3 );
120}
121
2e2eef80
PP
122void
123test06()
124{
125 // PR libstdc++/100631
126 auto r = views::iota(0)
127 | views::filter([](int){ return true; })
128 | views::take(42)
129 | views::reverse
130 | views::transform([](int) { return std::make_pair(42, "hello"); })
131 | views::take(42)
132 | views::keys;
133 auto b = r.begin();
134 auto e = r.end();
38751c4d
PP
135 VERIFY( e - b == 42 );
136 VERIFY( b - e == -42 );
2e2eef80
PP
137}
138
139void
140test07()
141{
142 // PR libstdc++/100631 comment #2
143 auto r = views::iota(0)
144 | views::transform([](int) { return std::make_pair(42, "hello"); })
145 | views::keys;
146 auto b = ranges::cbegin(r);
147 auto e = ranges::end(r);
148 b.base() == e.base();
149 b == e;
150}
151
cba9ef06
PP
152int
153main()
154{
155 test01();
4be16d1c 156 test02();
2ec58cfc 157 test03();
a25321ca 158 test04();
c7fe68f3 159 test05();
2e2eef80
PP
160 test06();
161 test07();
cba9ef06 162}