brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · 38e289b Raw
167 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// <memory>10 11// unique_ptr12 13// template <class T1, class D1, class T2, class D2>14//   bool15//   operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);16 17// template <class T1, class D1, class T2, class D2>18//   bool19//   operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);20 21// template <class T1, class D1, class T2, class D2>22//   bool23//   operator< (const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);24 25// template <class T1, class D1, class T2, class D2>26//   bool27//   operator> (const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);28 29// template <class T1, class D1, class T2, class D2>30//   bool31//   operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);32 33// template <class T1, class D1, class T2, class D2>34//   bool35//   operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);36 37// template<class T1, class D1, class T2, class D2>38//   requires three_way_comparable_with<typename unique_ptr<T1, D1>::pointer,39//                                      typename unique_ptr<T2, D2>::pointer>40//   compare_three_way_result_t<typename unique_ptr<T1, D1>::pointer,41//                              typename unique_ptr<T2, D2>::pointer>42//     operator<=>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);43 44#include <memory>45#include <cassert>46 47#include "test_macros.h"48#include "deleter_types.h"49#include "test_comparisons.h"50#include "unique_ptr_test_helper.h"51 52TEST_CONSTEXPR_CXX23 bool test() {53  AssertComparisonsReturnBool<std::unique_ptr<int> >();54#if TEST_STD_VER > 1755  AssertOrderReturn<std::strong_ordering, std::unique_ptr<int>>();56#endif57 58  // Pointers of same type59  {60    A* ptr1 = new A;61    A* ptr2 = new A;62    const std::unique_ptr<A, Deleter<A> > p1(ptr1);63    const std::unique_ptr<A, Deleter<A> > p2(ptr2);64 65    assert(!(p1 == p2));66    assert(p1 != p2);67    if (!TEST_IS_CONSTANT_EVALUATED) {68      assert((p1 < p2) == (ptr1 < ptr2));69      assert((p1 <= p2) == (ptr1 <= ptr2));70      assert((p1 > p2) == (ptr1 > ptr2));71      assert((p1 >= p2) == (ptr1 >= ptr2));72#if TEST_STD_VER > 1773      assert((p1 <=> p2) != std::strong_ordering::equal);74      assert((p1 <=> p2) == (ptr1 <=> ptr2));75#endif76    }77  }78  // Pointers of different type79  {80    A* ptr1 = new A;81    B* ptr2 = new B;82    const std::unique_ptr<A, Deleter<A> > p1(ptr1);83    const std::unique_ptr<B, Deleter<B> > p2(ptr2);84    assert(!(p1 == p2));85    assert(p1 != p2);86    if (!TEST_IS_CONSTANT_EVALUATED) {87      assert((p1 < p2) == (ptr1 < ptr2));88      assert((p1 <= p2) == (ptr1 <= ptr2));89      assert((p1 > p2) == (ptr1 > ptr2));90      assert((p1 >= p2) == (ptr1 >= ptr2));91#if TEST_STD_VER > 1792    assert((p1 <=> p2) != std::strong_ordering::equal);93    assert((p1 <=> p2) == (ptr1 <=> ptr2));94#endif95    }96  }97  // Pointers of same array type98  {99    A* ptr1 = new A[3];100    A* ptr2 = new A[3];101    const std::unique_ptr<A[], Deleter<A[]> > p1(ptr1);102    const std::unique_ptr<A[], Deleter<A[]> > p2(ptr2);103    assert(!(p1 == p2));104    assert(p1 != p2);105    if (!TEST_IS_CONSTANT_EVALUATED) {106      assert((p1 < p2) == (ptr1 < ptr2));107      assert((p1 <= p2) == (ptr1 <= ptr2));108      assert((p1 > p2) == (ptr1 > ptr2));109      assert((p1 >= p2) == (ptr1 >= ptr2));110#if TEST_STD_VER > 17111    assert((p1 <=> p2) != std::strong_ordering::equal);112    assert((p1 <=> p2) == (ptr1 <=> ptr2));113#endif114    }115  }116  // Pointers of different array types117  {118    A* ptr1 = new A[3];119    B* ptr2 = new B[3];120    const std::unique_ptr<A[], Deleter<A[]> > p1(ptr1);121    const std::unique_ptr<B[], Deleter<B[]> > p2(ptr2);122    assert(!(p1 == p2));123    assert(p1 != p2);124    if (!TEST_IS_CONSTANT_EVALUATED) {125      assert((p1 < p2) == (ptr1 < ptr2));126      assert((p1 <= p2) == (ptr1 <= ptr2));127      assert((p1 > p2) == (ptr1 > ptr2));128      assert((p1 >= p2) == (ptr1 >= ptr2));129#if TEST_STD_VER > 17130    assert((p1 <=> p2) != std::strong_ordering::equal);131    assert((p1 <=> p2) == (ptr1 <=> ptr2));132#endif133    }134  }135  // Default-constructed pointers of same type136  {137    const std::unique_ptr<A, Deleter<A> > p1;138    const std::unique_ptr<A, Deleter<A> > p2;139    assert(p1 == p2);140#if TEST_STD_VER > 17141    if (!TEST_IS_CONSTANT_EVALUATED)142      assert((p1 <=> p2) == std::strong_ordering::equal);143#endif144  }145  // Default-constructed pointers of different type146  {147    const std::unique_ptr<A, Deleter<A> > p1;148    const std::unique_ptr<B, Deleter<B> > p2;149    assert(p1 == p2);150#if TEST_STD_VER > 17151    if (!TEST_IS_CONSTANT_EVALUATED)152      assert((p1 <=> p2) == std::strong_ordering::equal);153#endif154  }155 156  return true;157}158 159int main(int, char**) {160  test();161#if TEST_STD_VER >= 23162  static_assert(test());163#endif164 165  return 0;166}167