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// REQUIRES: c++experimental
11// UNSUPPORTED: c++98, c++03
12
13// <experimental/memory_resource>
14
15//-----------------------------------------------------------------------------
16// TESTING memory_resource * get_default_resource() noexcept;
17//         memory_resource * set_default_resource(memory_resource*) noexcept;
18//
19// Concerns:
20//  A) 'get_default_resource()' returns a non-null memory_resource pointer.
21//  B) 'get_default_resource()' returns the value set by the last call to
22//     'set_default_resource(...)' and 'new_delete_resource()' if no call
23//     to 'set_default_resource(...)' has occurred.
24//  C) 'set_default_resource(...)' returns the previous value of the default
25//     resource.
26//  D) 'set_default_resource(T* p)' for a non-null 'p' sets the default resource
27//     to be 'p'.
28//  E) 'set_default_resource(null)' sets the default resource to
29//     'new_delete_resource()'.
30//  F) 'get_default_resource' and 'set_default_resource' are noexcept.
31
32
33#include <experimental/memory_resource>
34#include <cassert>
35
36#include "test_memory_resource.hpp"
37
38using namespace std::experimental::pmr;
39
40int main() {
41    TestResource R;
42    { // Test (A) and (B)
43        memory_resource* p = get_default_resource();
44        assert(p != nullptr);
45        assert(p == new_delete_resource());
46        assert(p == get_default_resource());
47    }
48    { // Test (C) and (D)
49        memory_resource *expect = &R;
50        memory_resource *old = set_default_resource(expect);
51        assert(old != nullptr);
52        assert(old == new_delete_resource());
53
54        memory_resource *p = get_default_resource();
55        assert(p != nullptr);
56        assert(p == expect);
57        assert(p == get_default_resource());
58    }
59    { // Test (E)
60        memory_resource* old = set_default_resource(nullptr);
61        assert(old == &R);
62        memory_resource* p = get_default_resource();
63        assert(p != nullptr);
64        assert(p == new_delete_resource());
65        assert(p == get_default_resource());
66    }
67    { // Test (F)
68        static_assert(noexcept(get_default_resource()),
69                      "get_default_resource() must be noexcept");
70
71        static_assert(noexcept(set_default_resource(nullptr)),
72                      "set_default_resource() must be noexcept");
73    }
74}
75