1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// UNSUPPORTED: c++98, c++03
11
12// <experimental/memory_resource>
13
14// template <class T> class polymorphic_allocator;
15
16// template <class T>
17// bool operator!=(
18//      polymorphic_allocator<T> const &
19//    , polymorphic_allocator<T> const &) noexcept
20
21#include <experimental/memory_resource>
22#include <type_traits>
23#include <cassert>
24
25#include "test_memory_resource.hpp"
26
27namespace ex = std::experimental::pmr;
28
29int main()
30{
31    typedef ex::polymorphic_allocator<void> A1;
32    typedef ex::polymorphic_allocator<int> A2;
33    // check return types
34    {
35        A1 const a1;
36        A2 const a2;
37        static_assert(std::is_same<decltype(a1 != a2), bool>::value, "");
38        static_assert(noexcept(a1 != a2), "");
39    }
40    // not equal same type (different resource)
41    {
42        TestResource d1(1);
43        TestResource d2(2);
44        A1 const a1(&d1);
45        A1 const a2(&d2);
46
47        assert(a1 != a2);
48        assert(d1.checkIsEqualCalledEq(1));
49        assert(d2.checkIsEqualCalledEq(0));
50
51        d1.reset();
52
53        assert(a2 != a1);
54        assert(d1.checkIsEqualCalledEq(0));
55        assert(d2.checkIsEqualCalledEq(1));
56    }
57    // equal same type (same resource)
58    {
59        TestResource d1;
60        A1 const a1(&d1);
61        A1 const a2(&d1);
62
63        assert(!(a1 != a2));
64        assert(d1.checkIsEqualCalledEq(0));
65
66        assert(!(a2 != a1));
67        assert(d1.checkIsEqualCalledEq(0));
68    }
69    // equal same type
70    {
71        TestResource d1(1);
72        TestResource d2(1);
73        A1 const a1(&d1);
74        A1 const a2(&d2);
75
76        assert(!(a1 != a2));
77        assert(d1.checkIsEqualCalledEq(1));
78        assert(d2.checkIsEqualCalledEq(0));
79
80        d1.reset();
81
82        assert(!(a2 != a1));
83        assert(d1.checkIsEqualCalledEq(0));
84        assert(d2.checkIsEqualCalledEq(1));
85
86    }
87    // not equal different types
88    {
89        TestResource  d1;
90        TestResource1 d2;
91        A1 const a1(&d1);
92        A2 const a2(&d2);
93
94        assert(a1 != a2);
95        assert(d1.checkIsEqualCalledEq(1));
96        assert(d2.checkIsEqualCalledEq(0));
97
98        d1.reset();
99
100        assert(a2 != a1);
101        assert(d1.checkIsEqualCalledEq(0));
102        assert(d2.checkIsEqualCalledEq(1));
103    }
104}
105