annotate libstdc++-v3/testsuite/20_util/tuple/comparison_operators/three_way.cc @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 // { dg-options "-std=gnu++2a" }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2 // { dg-do run { target c++2a } }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4 // Copyright (C) 2020 Free Software Foundation, Inc.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 //
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6 // This file is part of the GNU ISO C++ Library. This library is free
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7 // software; you can redistribute it and/or modify it under the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 // terms of the GNU General Public License as published by the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9 // Free Software Foundation; either version 3, or (at your option)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 // any later version.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 // This library is distributed in the hope that it will be useful,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 // GNU General Public License for more details.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 // You should have received a copy of the GNU General Public License along
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 // with this library; see the file COPYING3. If not see
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19 // <http://www.gnu.org/licenses/>.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21 // Tuple
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23 #include <tuple>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24 #include <testsuite_hooks.h>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26 using namespace std;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28 template<typename T>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29 bool self_consistent(const T& x)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31 return std::is_eq(x <=> x) && x == x && !(x != x) && x <= x && !(x < x);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
33
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
34 void
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
35 test01()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
36 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
37 int i=0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
38 int j=0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
39 int k=2;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
40 tuple<int, int, int> a(0, 0, 0);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
41 tuple<int, int, int> b(0, 0, 1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
42 tuple<int& , int& , int&> c(i,j,k);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
43 tuple<const int&, const int&, const int&> d(c);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
44 VERIFY( self_consistent(a) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
45 VERIFY( self_consistent(b) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
46 VERIFY( self_consistent(c) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
47 VERIFY( self_consistent(d) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
48 VERIFY( !(a > a) && !(b > b) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
49 VERIFY( a >= a && b >= b );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
50 VERIFY( a < b && !(b < a) && a <= b && !(b <= a) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
51 VERIFY( b > a && !(a > b) && b >= a && !(a >= b) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
52
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
53 VERIFY( std::is_lt(a <=> b) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
54 VERIFY( std::is_gt(b <=> a) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
55 VERIFY( std::is_gt(c <=> a) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
56 VERIFY( std::is_eq(c <=> d) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
57
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
58 static_assert( std::is_same_v<decltype(a <=> d), std::strong_ordering> );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
59 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
60
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
61 template<typename T, typename U, typename C>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
62 constexpr bool
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
63 check_compare(T&& t, U&& u, C c)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
64 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
65 using R = std::compare_three_way_result_t<T, U>;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
66 static_assert( std::same_as<C, R> );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
67 return (t <=> u) == c;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
68 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
69
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
70 void
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
71 test02()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
72 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
73 using std::strong_ordering;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
74 using std::weak_ordering;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
75 using std::partial_ordering;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
76
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
77 using T0 = std::tuple<>;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
78 static_assert( check_compare(T0(), T0(), strong_ordering::equal) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
79
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
80 using Ti = std::tuple<int>;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
81 using Tu = std::tuple<unsigned>;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
82 static_assert( check_compare(Ti(1), Tu(1u), weak_ordering::equivalent) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
83 static_assert( check_compare(Ti(1), Tu(2u), weak_ordering::less) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
84 static_assert( check_compare(Ti(-1), Tu(1u), weak_ordering::greater) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
85
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
86 using Tii = std::tuple<int, int>;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
87 using Tlu = std::tuple<long, unsigned>;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
88 static_assert( check_compare(Tii(1, 2), Tlu(2l, 1u), weak_ordering::less) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
89
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
90 using Tid = std::tuple<int, double>;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
91 static_assert( check_compare(Tii(3, 4), Tid(2, 0.9), partial_ordering::greater) );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
92
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
93 static_assert( !std::three_way_comparable_with<T0, Ti> );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
94 static_assert( !std::three_way_comparable_with<Ti, Tii> );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
95 static_assert( !std::three_way_comparable_with<Ti, Tid> );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
96 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
97
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
98 int main()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
99 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
100 test01();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
101 test02();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
102 }