1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <tuple> 10 11 // template <class... Types> class tuple; 12 13 // template<class... TTypes, class... UTypes> 14 // bool 15 // operator<(const tuple<TTypes...>& t, const tuple<UTypes...>& u); 16 // 17 // template<class... TTypes, class... UTypes> 18 // bool 19 // operator>(const tuple<TTypes...>& t, const tuple<UTypes...>& u); 20 // 21 // template<class... TTypes, class... UTypes> 22 // bool 23 // operator<=(const tuple<TTypes...>& t, const tuple<UTypes...>& u); 24 // 25 // template<class... TTypes, class... UTypes> 26 // bool 27 // operator>=(const tuple<TTypes...>& t, const tuple<UTypes...>& u); 28 29 // UNSUPPORTED: c++98, c++03 30 31 #include <tuple> 32 #include <string> 33 #include <cassert> 34 35 #include "test_macros.h" 36 37 int main(int, char**) 38 { 39 { 40 typedef std::tuple<> T1; 41 typedef std::tuple<> T2; 42 const T1 t1; 43 const T2 t2; 44 assert(!(t1 < t2)); 45 assert( (t1 <= t2)); 46 assert(!(t1 > t2)); 47 assert( (t1 >= t2)); 48 } 49 { 50 typedef std::tuple<long> T1; 51 typedef std::tuple<double> T2; 52 const T1 t1(1); 53 const T2 t2(1); 54 assert(!(t1 < t2)); 55 assert( (t1 <= t2)); 56 assert(!(t1 > t2)); 57 assert( (t1 >= t2)); 58 } 59 { 60 typedef std::tuple<long> T1; 61 typedef std::tuple<double> T2; 62 const T1 t1(1); 63 const T2 t2(0.9); 64 assert(!(t1 < t2)); 65 assert(!(t1 <= t2)); 66 assert( (t1 > t2)); 67 assert( (t1 >= t2)); 68 } 69 { 70 typedef std::tuple<long> T1; 71 typedef std::tuple<double> T2; 72 const T1 t1(1); 73 const T2 t2(1.1); 74 assert( (t1 < t2)); 75 assert( (t1 <= t2)); 76 assert(!(t1 > t2)); 77 assert(!(t1 >= t2)); 78 } 79 { 80 typedef std::tuple<long, int> T1; 81 typedef std::tuple<double, long> T2; 82 const T1 t1(1, 2); 83 const T2 t2(1, 2); 84 assert(!(t1 < t2)); 85 assert( (t1 <= t2)); 86 assert(!(t1 > t2)); 87 assert( (t1 >= t2)); 88 } 89 { 90 typedef std::tuple<long, int> T1; 91 typedef std::tuple<double, long> T2; 92 const T1 t1(1, 2); 93 const T2 t2(0.9, 2); 94 assert(!(t1 < t2)); 95 assert(!(t1 <= t2)); 96 assert( (t1 > t2)); 97 assert( (t1 >= t2)); 98 } 99 { 100 typedef std::tuple<long, int> T1; 101 typedef std::tuple<double, long> T2; 102 const T1 t1(1, 2); 103 const T2 t2(1.1, 2); 104 assert( (t1 < t2)); 105 assert( (t1 <= t2)); 106 assert(!(t1 > t2)); 107 assert(!(t1 >= t2)); 108 } 109 { 110 typedef std::tuple<long, int> T1; 111 typedef std::tuple<double, long> T2; 112 const T1 t1(1, 2); 113 const T2 t2(1, 1); 114 assert(!(t1 < t2)); 115 assert(!(t1 <= t2)); 116 assert( (t1 > t2)); 117 assert( (t1 >= t2)); 118 } 119 { 120 typedef std::tuple<long, int> T1; 121 typedef std::tuple<double, long> T2; 122 const T1 t1(1, 2); 123 const T2 t2(1, 3); 124 assert( (t1 < t2)); 125 assert( (t1 <= t2)); 126 assert(!(t1 > t2)); 127 assert(!(t1 >= t2)); 128 } 129 { 130 typedef std::tuple<long, int, double> T1; 131 typedef std::tuple<double, long, int> T2; 132 const T1 t1(1, 2, 3); 133 const T2 t2(1, 2, 3); 134 assert(!(t1 < t2)); 135 assert( (t1 <= t2)); 136 assert(!(t1 > t2)); 137 assert( (t1 >= t2)); 138 } 139 { 140 typedef std::tuple<long, int, double> T1; 141 typedef std::tuple<double, long, int> T2; 142 const T1 t1(1, 2, 3); 143 const T2 t2(0.9, 2, 3); 144 assert(!(t1 < t2)); 145 assert(!(t1 <= t2)); 146 assert( (t1 > t2)); 147 assert( (t1 >= t2)); 148 } 149 { 150 typedef std::tuple<long, int, double> T1; 151 typedef std::tuple<double, long, int> T2; 152 const T1 t1(1, 2, 3); 153 const T2 t2(1.1, 2, 3); 154 assert( (t1 < t2)); 155 assert( (t1 <= t2)); 156 assert(!(t1 > t2)); 157 assert(!(t1 >= t2)); 158 } 159 { 160 typedef std::tuple<long, int, double> T1; 161 typedef std::tuple<double, long, int> T2; 162 const T1 t1(1, 2, 3); 163 const T2 t2(1, 1, 3); 164 assert(!(t1 < t2)); 165 assert(!(t1 <= t2)); 166 assert( (t1 > t2)); 167 assert( (t1 >= t2)); 168 } 169 { 170 typedef std::tuple<long, int, double> T1; 171 typedef std::tuple<double, long, int> T2; 172 const T1 t1(1, 2, 3); 173 const T2 t2(1, 3, 3); 174 assert( (t1 < t2)); 175 assert( (t1 <= t2)); 176 assert(!(t1 > t2)); 177 assert(!(t1 >= t2)); 178 } 179 { 180 typedef std::tuple<long, int, double> T1; 181 typedef std::tuple<double, long, int> T2; 182 const T1 t1(1, 2, 3); 183 const T2 t2(1, 2, 2); 184 assert(!(t1 < t2)); 185 assert(!(t1 <= t2)); 186 assert( (t1 > t2)); 187 assert( (t1 >= t2)); 188 } 189 { 190 typedef std::tuple<long, int, double> T1; 191 typedef std::tuple<double, long, int> T2; 192 const T1 t1(1, 2, 3); 193 const T2 t2(1, 2, 4); 194 assert( (t1 < t2)); 195 assert( (t1 <= t2)); 196 assert(!(t1 > t2)); 197 assert(!(t1 >= t2)); 198 } 199 #if TEST_STD_VER > 11 200 { 201 typedef std::tuple<long, int, double> T1; 202 typedef std::tuple<double, long, int> T2; 203 constexpr T1 t1(1, 2, 3); 204 constexpr T2 t2(1, 2, 4); 205 static_assert( (t1 < t2), ""); 206 static_assert( (t1 <= t2), ""); 207 static_assert(!(t1 > t2), ""); 208 static_assert(!(t1 >= t2), ""); 209 } 210 #endif 211 212 return 0; 213 } 214