333 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <tuple>10 11// template <class... Types> class tuple;12 13// template<class... TTypes, class... UTypes>14// bool15// operator<(const tuple<TTypes...>& t, const tuple<UTypes...>& u);16//17// template<class... TTypes, class... UTypes>18// bool19// operator>(const tuple<TTypes...>& t, const tuple<UTypes...>& u);20//21// template<class... TTypes, class... UTypes>22// bool23// operator<=(const tuple<TTypes...>& t, const tuple<UTypes...>& u);24//25// template<class... TTypes, class... UTypes>26// bool27// operator>=(const tuple<TTypes...>& t, const tuple<UTypes...>& u);28 29// UNSUPPORTED: c++0330 31#include <cassert>32#include <tuple>33 34#include "test_macros.h"35 36#if TEST_STD_VER >= 2337# include <array>38# include <ranges>39# include <utility>40#endif41#if TEST_STD_VER >= 2642# include <complex>43#endif44 45TEST_CONSTEXPR_CXX14 bool test() {46 {47 typedef std::tuple<> T1;48 typedef std::tuple<> T2;49 const T1 t1;50 const T2 t2;51 assert(!(t1 < t2));52 assert((t1 <= t2));53 assert(!(t1 > t2));54 assert((t1 >= t2));55 }56 {57 typedef std::tuple<long> T1;58 typedef std::tuple<double> T2;59 const T1 t1(1);60 const T2 t2(1);61 assert(!(t1 < t2));62 assert((t1 <= t2));63 assert(!(t1 > t2));64 assert((t1 >= t2));65 }66 {67 typedef std::tuple<long> T1;68 typedef std::tuple<double> T2;69 const T1 t1(1);70 const T2 t2(0.9);71 assert(!(t1 < t2));72 assert(!(t1 <= t2));73 assert((t1 > t2));74 assert((t1 >= t2));75 }76 {77 typedef std::tuple<long> T1;78 typedef std::tuple<double> T2;79 const T1 t1(1);80 const T2 t2(1.1);81 assert((t1 < t2));82 assert((t1 <= t2));83 assert(!(t1 > t2));84 assert(!(t1 >= t2));85 }86 {87 typedef std::tuple<long, int> T1;88 typedef std::tuple<double, long> T2;89 const T1 t1(1, 2);90 const T2 t2(1, 2);91 assert(!(t1 < t2));92 assert((t1 <= t2));93 assert(!(t1 > t2));94 assert((t1 >= t2));95 }96 {97 typedef std::tuple<long, int> T1;98 typedef std::tuple<double, long> T2;99 const T1 t1(1, 2);100 const T2 t2(0.9, 2);101 assert(!(t1 < t2));102 assert(!(t1 <= t2));103 assert((t1 > t2));104 assert((t1 >= t2));105 }106 {107 typedef std::tuple<long, int> T1;108 typedef std::tuple<double, long> T2;109 const T1 t1(1, 2);110 const T2 t2(1.1, 2);111 assert((t1 < t2));112 assert((t1 <= t2));113 assert(!(t1 > t2));114 assert(!(t1 >= t2));115 }116 {117 typedef std::tuple<long, int> T1;118 typedef std::tuple<double, long> T2;119 const T1 t1(1, 2);120 const T2 t2(1, 1);121 assert(!(t1 < t2));122 assert(!(t1 <= t2));123 assert((t1 > t2));124 assert((t1 >= t2));125 }126 {127 typedef std::tuple<long, int> T1;128 typedef std::tuple<double, long> T2;129 const T1 t1(1, 2);130 const T2 t2(1, 3);131 assert((t1 < t2));132 assert((t1 <= t2));133 assert(!(t1 > t2));134 assert(!(t1 >= t2));135 }136 {137 typedef std::tuple<long, int, double> T1;138 typedef std::tuple<double, long, int> T2;139 const T1 t1(1, 2, 3);140 const T2 t2(1, 2, 3);141 assert(!(t1 < t2));142 assert((t1 <= t2));143 assert(!(t1 > t2));144 assert((t1 >= t2));145 }146 {147 typedef std::tuple<long, int, double> T1;148 typedef std::tuple<double, long, int> T2;149 const T1 t1(1, 2, 3);150 const T2 t2(0.9, 2, 3);151 assert(!(t1 < t2));152 assert(!(t1 <= t2));153 assert((t1 > t2));154 assert((t1 >= t2));155 }156 {157 typedef std::tuple<long, int, double> T1;158 typedef std::tuple<double, long, int> T2;159 const T1 t1(1, 2, 3);160 const T2 t2(1.1, 2, 3);161 assert((t1 < t2));162 assert((t1 <= t2));163 assert(!(t1 > t2));164 assert(!(t1 >= t2));165 }166 {167 typedef std::tuple<long, int, double> T1;168 typedef std::tuple<double, long, int> T2;169 const T1 t1(1, 2, 3);170 const T2 t2(1, 1, 3);171 assert(!(t1 < t2));172 assert(!(t1 <= t2));173 assert((t1 > t2));174 assert((t1 >= t2));175 }176 {177 typedef std::tuple<long, int, double> T1;178 typedef std::tuple<double, long, int> T2;179 const T1 t1(1, 2, 3);180 const T2 t2(1, 3, 3);181 assert((t1 < t2));182 assert((t1 <= t2));183 assert(!(t1 > t2));184 assert(!(t1 >= t2));185 }186 {187 typedef std::tuple<long, int, double> T1;188 typedef std::tuple<double, long, int> T2;189 const T1 t1(1, 2, 3);190 const T2 t2(1, 2, 2);191 assert(!(t1 < t2));192 assert(!(t1 <= t2));193 assert((t1 > t2));194 assert((t1 >= t2));195 }196 {197 typedef std::tuple<long, int, double> T1;198 typedef std::tuple<double, long, int> T2;199 const T1 t1(1, 2, 3);200 const T2 t2(1, 2, 4);201 assert((t1 < t2));202 assert((t1 <= t2));203 assert(!(t1 > t2));204 assert(!(t1 >= t2));205 }206#if TEST_STD_VER >= 14207 {208 using T1 = std::tuple<long, int, double>;209 using T2 = std::tuple<double, long, int>;210 constexpr T1 t1(1, 2, 3);211 constexpr T2 t2(1, 2, 4);212 assert((t1 < t2));213 assert((t1 <= t2));214 assert(!(t1 > t2));215 assert(!(t1 >= t2));216 }217#endif218#if TEST_STD_VER >= 23219 {220 using T1 = std::tuple<long, int>;221 using T2 = std::pair<double, long>;222 constexpr T1 t1{1, 2};223 constexpr T2 t2{1.0, 2};224 assert(!(t1 < t2));225 assert(t1 <= t2);226 assert(!(t1 > t2));227 assert(t1 >= t2);228 }229 {230 using T1 = std::tuple<long, int>;231 using T2 = std::pair<double, long>;232 constexpr T1 t1{1, 2};233 constexpr T2 t2{1.0, 3};234 assert(t1 < t2);235 assert(t1 <= t2);236 assert(!(t1 > t2));237 assert(!(t1 >= t2));238 }239 {240 using T1 = std::tuple<long, int>;241 using T2 = std::array<double, 2>;242 constexpr T1 t1{1, 2};243 constexpr T2 t2{1.0, 2.0};244 assert(!(t1 < t2));245 assert(t1 <= t2);246 assert(!(t1 > t2));247 assert(t1 >= t2);248 }249 {250 using T1 = std::tuple<long, int>;251 using T2 = std::array<double, 2>;252 constexpr T1 t1{1, 2};253 constexpr T2 t2{1.1, 3.0};254 assert(t1 < t2);255 assert(t1 <= t2);256 assert(!(t1 > t2));257 assert(!(t1 >= t2));258 }259 {260 using T1 = std::tuple<const int*, const int*>;261 using T2 = std::ranges::subrange<const int*>;262 263 int arr[1]{};264 T1 t1{arr, arr + 1};265 T2 t2{arr};266 assert(!(t1 < t2));267 assert(t1 <= t2);268 assert(!(t1 > t2));269 assert(t1 >= t2);270 }271 {272 using T1 = std::tuple<const int*, const int*>;273 using T2 = std::ranges::subrange<const int*>;274 275 int arr[1]{};276 T1 t1{arr + 1, arr + 1};277 T2 t2{arr};278 assert(!(t1 < t2));279 assert(!(t1 <= t2));280 assert(t1 > t2);281 assert(t1 >= t2);282 }283 {284 constexpr std::tuple<> t1{};285 constexpr std::array<int*, 0> t2{};286 assert(!(t1 < t2));287 assert(t1 <= t2);288 assert(!(t1 > t2));289 assert(t1 >= t2);290 }291 {292 constexpr std::tuple<> t1{};293 constexpr std::array<double, 0> t2{};294 assert(!(t1 < t2));295 assert(t1 <= t2);296 assert(!(t1 > t2));297 assert(t1 >= t2);298 }299#endif300#if TEST_STD_VER >= 26301 {302 using T1 = std::tuple<long, int>;303 using T2 = std::complex<double>;304 constexpr T1 t1{1, 2};305 constexpr T2 t2{1.0, 2.0};306 assert(!(t1 < t2));307 assert(t1 <= t2);308 assert(!(t1 > t2));309 assert(t1 >= t2);310 }311 {312 using T1 = std::tuple<long, int>;313 using T2 = std::complex<double>;314 constexpr T1 t1{1, 2};315 constexpr T2 t2{1.1, 3.0};316 assert(t1 < t2);317 assert(t1 <= t2);318 assert(!(t1 > t2));319 assert(!(t1 >= t2));320 }321#endif322 323 return true;324}325 326int main(int, char**) {327 test();328#if TEST_STD_VER >= 14329 static_assert(test(), "");330#endif331 return 0;332}333