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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++03
10 
11 // test_memory_resource requires RTTI for dynamic_cast
12 // UNSUPPORTED: no-rtti
13 
14 // <experimental/memory_resource>
15 
16 //------------------------------------------------------------------------------
17 // TESTING virtual bool is_equal(memory_resource const &) const noexcept
18 //
19 // Concerns:
20 //   A) 'memory_resource' provides a function 'is_equal' with the required
21 //      signature.
22 //   B) 'is_equal' is noexcept.
23 //   C) 'do_is_equal' is called using the same arguments passed to 'is_equal'
24 //      and the resulting value is returned.
25 //   D) 'do_is_equal' is called on the LHS object and not the RHS object.
26 
27 #include <experimental/memory_resource>
28 #include <type_traits>
29 #include <cassert>
30 #include "test_memory_resource.h"
31 
32 #include "test_macros.h"
33 
34 using std::experimental::pmr::memory_resource;
35 
main(int,char **)36 int main(int, char**)
37 {
38     {
39         memory_resource const* r1 = nullptr;
40         memory_resource const* r2 = nullptr;
41         static_assert(
42             noexcept(r1->is_equal(*r2))
43           , "is_equal must be noexcept"
44           );
45     }
46     {
47         TestResource1 R1(1);
48         auto& P1 = R1.getController();
49         memory_resource const& M1 = R1;
50 
51         TestResource2 R2(1);
52         auto& P2 = R2.getController();
53         memory_resource const& M2 = R2;
54 
55         assert(M1.is_equal(M2) == false);
56         assert(P1.checkIsEqualCalledEq(1));
57         assert(P2.checkIsEqualCalledEq(0));
58 
59         assert(M2.is_equal(M1) == false);
60         assert(P2.checkIsEqualCalledEq(1));
61         assert(P1.checkIsEqualCalledEq(1));
62     }
63     {
64         TestResource1 R1(1);
65         auto& P1 = R1.getController();
66         memory_resource const& M1 = R1;
67 
68         TestResource1 R2(2);
69         auto& P2 = R2.getController();
70         memory_resource const& M2 = R2;
71 
72         assert(M1.is_equal(M2) == false);
73         assert(P1.checkIsEqualCalledEq(1));
74         assert(P2.checkIsEqualCalledEq(0));
75 
76         assert(M2.is_equal(M1) == false);
77         assert(P2.checkIsEqualCalledEq(1));
78         assert(P1.checkIsEqualCalledEq(1));
79     }
80     {
81         TestResource1 R1(1);
82         auto& P1 = R1.getController();
83         memory_resource const& M1 = R1;
84 
85         TestResource1 R2(1);
86         auto& P2 = R2.getController();
87         memory_resource const& M2 = R2;
88 
89         assert(M1.is_equal(M2) == true);
90         assert(P1.checkIsEqualCalledEq(1));
91         assert(P2.checkIsEqualCalledEq(0));
92 
93         assert(M2.is_equal(M1) == true);
94         assert(P2.checkIsEqualCalledEq(1));
95         assert(P1.checkIsEqualCalledEq(1));
96     }
97 
98   return 0;
99 }
100