brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.5 KiB · ef50454 Raw
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