brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · c6f70f6 Raw
179 lines · cpp
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10// UNSUPPORTED: c++03, c++11, c++1411// REQUIRES: c++experimental12 13// <experimental/memory>14 15// observer_ptr16//17// template <class W1, class W2>18// bool operator==(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);19//20// template <class W1, class W2>21// bool operator!=(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);22//23// template <class W>24// bool operator==(const observer_ptr<W>& p, std::nullptr_t) noexcept;25//26// template <class W>27// bool operator==(std::nullptr_t, const observer_ptr<W>& p) noexcept;28//29// template <class W>30// bool operator!=(const observer_ptr<W>& p, std::nullptr_t) noexcept;31//32// template <class W>33// bool operator!=(std::nullptr_t, const observer_ptr<W>& p) noexcept;34//35// template <class W1, class W2>36// bool operator<(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);37//38// template <class W1, class W2>39// bool operator>(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);40//41// template <class W1, class W2>42// bool operator<=(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);43//44// template <class W1, class W2>45// bool operator>=(const observer_ptr<W1>& p1, const observer_ptr<W2>& p2);46 47#include <experimental/memory>48#include <cassert>49 50void test() {51  using T       = int;52  using Ptr     = std::experimental::observer_ptr<T>;53  using VoidPtr = std::experimental::observer_ptr<void>;54 55  // operator==(observer_ptr, observer_ptr)56  {57    T obj1, obj2;58    Ptr ptr1(&obj1), ptr1_x(&obj1);59    Ptr ptr2(&obj2);60    VoidPtr ptr3(&obj1);61 62    assert(!(ptr1 == ptr2));63    assert(ptr1 == ptr1_x);64 65    assert(ptr1 == ptr3);66  }67 68  // operator!=(observer_ptr, observer_ptr)69  {70    T obj1, obj2;71    Ptr ptr1(&obj1), ptr1_x(&obj1);72    Ptr ptr2(&obj2);73    VoidPtr ptr3(&obj1);74 75    assert(ptr1 != ptr2);76    assert(!(ptr1 != ptr1_x));77 78    assert(ptr2 != ptr3);79  }80 81  // operator==(observer_ptr, nullptr_t)82  {83    T obj1;84    Ptr ptr1(&obj1);85    Ptr ptr2(nullptr);86 87    assert(!(ptr1 == nullptr));88    assert(ptr2 == nullptr);89  }90 91  // operator==(nullptr_t, observer_ptr)92  {93    T obj1;94    Ptr ptr1(&obj1);95    Ptr ptr2(nullptr);96 97    assert(!(nullptr == ptr1));98    assert(nullptr == ptr2);99  }100 101  // operator!=(observer_ptr, nullptr_t)102  {103    T obj1;104    Ptr ptr1(&obj1);105    Ptr ptr2(nullptr);106 107    assert(ptr1 != nullptr);108    assert(!(ptr2 != nullptr));109  }110 111  // operator!=(nullptr_t, observer_ptr)112  {113    T obj1;114    Ptr ptr1(&obj1);115    Ptr ptr2(nullptr);116 117    assert(nullptr != ptr1);118    assert(!(nullptr != ptr2));119  }120 121  // operator<(observer_ptr, observer_ptr)122  {123    T obj1, obj2;124    Ptr ptr1(&obj1);125    Ptr ptr2(&obj2);126    VoidPtr ptr3(&obj1);127 128    assert(!(ptr1 < ptr1));129    assert((ptr1 < ptr2) == (&obj1 < &obj2));130 131    assert(!(ptr1 < ptr3));132  }133 134  // operator>(observer_ptr, observer_ptr)135  {136    T obj1, obj2;137    Ptr ptr1(&obj1);138    Ptr ptr2(&obj2);139    VoidPtr ptr3(&obj1);140 141    assert(!(ptr1 > ptr1));142    assert((ptr1 > ptr2) == (&obj1 > &obj2));143 144    assert(!(ptr1 > ptr3));145  }146 147  // operator<=(observer_ptr, observer_ptr)148  {149    T obj1, obj2;150    Ptr ptr1(&obj1);151    Ptr ptr2(&obj2);152    VoidPtr ptr3(&obj1);153 154    assert(ptr1 <= ptr1);155    assert((ptr1 <= ptr2) == (&obj1 <= &obj2));156 157    assert(ptr1 <= ptr3);158  }159 160  // operator>=(observer_ptr, observer_ptr)161  {162    T obj1, obj2;163    Ptr ptr1(&obj1);164    Ptr ptr2(&obj2);165    VoidPtr ptr3(&obj1);166 167    assert(ptr1 >= ptr1);168    assert((ptr1 >= ptr2) == (&obj1 >= &obj2));169 170    assert(ptr1 >= ptr3);171  }172}173 174int main(int, char**) {175  // Note: this is not constexpr in the spec176  test();177 178  return 0;179}