blob: d5a3d01961d97c19dedfbd29137ee213b2d580dd [file] [log] [blame]
Eric Fiselier257fd692016-05-07 01:04:55 +00001//===----------------------------------------------------------------------===//
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, class U>
17// bool operator==(
18// polymorphic_allocator<T> const &
19// , polymorphic_allocator<U> 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 // equal same type (different resource)
41 {
42 TestResource d1(1);
43 TestResource d2(1);
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 different type (different resource)
70 {
71 TestResource d1(42);
72 TestResource d2(42);
73 A1 const a1(&d1);
74 A2 const a2(&d2);
75
76 assert(a1 == a2);
77 assert(d1.checkIsEqualCalledEq(1));
78 assert(d2.checkIsEqualCalledEq(0));
79
80 assert(a2 == a1);
81 assert(d1.checkIsEqualCalledEq(1));
82 assert(d2.checkIsEqualCalledEq(1));
83
84 }
85 // equal different type (same resource)
86 {
87 TestResource d1(42);
88 A1 const a1(&d1);
89 A2 const a2(&d1);
90
91 assert(a1 == a2);
92 assert(d1.checkIsEqualCalledEq(0));
93
94 assert(a2 == a1);
95 assert(d1.checkIsEqualCalledEq(0));
96
97 }
98 // not equal same type
99 {
100 TestResource d1(1);
101 TestResource d2(2);
102 A1 const a1(&d1);
103 A1 const a2(&d2);
104
105 assert(!(a1 == a2));
106 assert(d1.checkIsEqualCalledEq(1));
107 assert(d2.checkIsEqualCalledEq(0));
108
109 d1.reset();
110
111 assert(!(a2 == a1));
112 assert(d1.checkIsEqualCalledEq(0));
113 assert(d2.checkIsEqualCalledEq(1));
114
115 }
116 // not equal different types
117 {
118 TestResource d1;
119 TestResource1 d2;
120 A1 const a1(&d1);
121 A2 const a2(&d2);
122
123 assert(!(a1 == a2));
124 assert(d1.checkIsEqualCalledEq(1));
125 assert(d2.checkIsEqualCalledEq(0));
126
127 d1.reset();
128
129 assert(!(a2 == a1));
130 assert(d1.checkIsEqualCalledEq(0));
131 assert(d2.checkIsEqualCalledEq(1));
132 }
133}