//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // template class tuple; // template // bool // operator<(const tuple& t, const tuple& u); // // template // bool // operator>(const tuple& t, const tuple& u); // // template // bool // operator<=(const tuple& t, const tuple& u); // // template // bool // operator>=(const tuple& t, const tuple& u); // UNSUPPORTED: c++03 #include #include #include "test_macros.h" #if TEST_STD_VER >= 23 # include # include # include #endif #if TEST_STD_VER >= 26 # include #endif TEST_CONSTEXPR_CXX14 bool test() { { typedef std::tuple<> T1; typedef std::tuple<> T2; const T1 t1; const T2 t2; assert(!(t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert((t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1); const T2 t2(1); assert(!(t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert((t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1); const T2 t2(0.9); assert(!(t1 < t2)); assert(!(t1 <= t2)); assert((t1 > t2)); assert((t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1); const T2 t2(1.1); assert((t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert(!(t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2); const T2 t2(1, 2); assert(!(t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert((t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2); const T2 t2(0.9, 2); assert(!(t1 < t2)); assert(!(t1 <= t2)); assert((t1 > t2)); assert((t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2); const T2 t2(1.1, 2); assert((t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert(!(t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2); const T2 t2(1, 1); assert(!(t1 < t2)); assert(!(t1 <= t2)); assert((t1 > t2)); assert((t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2); const T2 t2(1, 3); assert((t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert(!(t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2, 3); const T2 t2(1, 2, 3); assert(!(t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert((t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2, 3); const T2 t2(0.9, 2, 3); assert(!(t1 < t2)); assert(!(t1 <= t2)); assert((t1 > t2)); assert((t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2, 3); const T2 t2(1.1, 2, 3); assert((t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert(!(t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2, 3); const T2 t2(1, 1, 3); assert(!(t1 < t2)); assert(!(t1 <= t2)); assert((t1 > t2)); assert((t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2, 3); const T2 t2(1, 3, 3); assert((t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert(!(t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2, 3); const T2 t2(1, 2, 2); assert(!(t1 < t2)); assert(!(t1 <= t2)); assert((t1 > t2)); assert((t1 >= t2)); } { typedef std::tuple T1; typedef std::tuple T2; const T1 t1(1, 2, 3); const T2 t2(1, 2, 4); assert((t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert(!(t1 >= t2)); } #if TEST_STD_VER >= 14 { using T1 = std::tuple; using T2 = std::tuple; constexpr T1 t1(1, 2, 3); constexpr T2 t2(1, 2, 4); assert((t1 < t2)); assert((t1 <= t2)); assert(!(t1 > t2)); assert(!(t1 >= t2)); } #endif #if TEST_STD_VER >= 23 { using T1 = std::tuple; using T2 = std::pair; constexpr T1 t1{1, 2}; constexpr T2 t2{1.0, 2}; assert(!(t1 < t2)); assert(t1 <= t2); assert(!(t1 > t2)); assert(t1 >= t2); } { using T1 = std::tuple; using T2 = std::pair; constexpr T1 t1{1, 2}; constexpr T2 t2{1.0, 3}; assert(t1 < t2); assert(t1 <= t2); assert(!(t1 > t2)); assert(!(t1 >= t2)); } { using T1 = std::tuple; using T2 = std::array; constexpr T1 t1{1, 2}; constexpr T2 t2{1.0, 2.0}; assert(!(t1 < t2)); assert(t1 <= t2); assert(!(t1 > t2)); assert(t1 >= t2); } { using T1 = std::tuple; using T2 = std::array; constexpr T1 t1{1, 2}; constexpr T2 t2{1.1, 3.0}; assert(t1 < t2); assert(t1 <= t2); assert(!(t1 > t2)); assert(!(t1 >= t2)); } { using T1 = std::tuple; using T2 = std::ranges::subrange; int arr[1]{}; T1 t1{arr, arr + 1}; T2 t2{arr}; assert(!(t1 < t2)); assert(t1 <= t2); assert(!(t1 > t2)); assert(t1 >= t2); } { using T1 = std::tuple; using T2 = std::ranges::subrange; int arr[1]{}; T1 t1{arr + 1, arr + 1}; T2 t2{arr}; assert(!(t1 < t2)); assert(!(t1 <= t2)); assert(t1 > t2); assert(t1 >= t2); } { constexpr std::tuple<> t1{}; constexpr std::array t2{}; assert(!(t1 < t2)); assert(t1 <= t2); assert(!(t1 > t2)); assert(t1 >= t2); } { constexpr std::tuple<> t1{}; constexpr std::array t2{}; assert(!(t1 < t2)); assert(t1 <= t2); assert(!(t1 > t2)); assert(t1 >= t2); } #endif #if TEST_STD_VER >= 26 { using T1 = std::tuple; using T2 = std::complex; constexpr T1 t1{1, 2}; constexpr T2 t2{1.0, 2.0}; assert(!(t1 < t2)); assert(t1 <= t2); assert(!(t1 > t2)); assert(t1 >= t2); } { using T1 = std::tuple; using T2 = std::complex; constexpr T1 t1{1, 2}; constexpr T2 t2{1.1, 3.0}; assert(t1 < t2); assert(t1 <= t2); assert(!(t1 > t2)); assert(!(t1 >= t2)); } #endif return true; } int main(int, char**) { test(); #if TEST_STD_VER >= 14 static_assert(test(), ""); #endif return 0; }