1*a325d9c4SApple OSS Distributions //
2*a325d9c4SApple OSS Distributions // Tests for
3*a325d9c4SApple OSS Distributions // void swap(safe_allocation& a, safe_allocation& b);
4*a325d9c4SApple OSS Distributions //
5*a325d9c4SApple OSS Distributions
6*a325d9c4SApple OSS Distributions #include <libkern/c++/safe_allocation.h>
7*a325d9c4SApple OSS Distributions #include <darwintest.h>
8*a325d9c4SApple OSS Distributions #include "test_utils.h"
9*a325d9c4SApple OSS Distributions
10*a325d9c4SApple OSS Distributions struct T {
11*a325d9c4SApple OSS Distributions int i;
12*a325d9c4SApple OSS Distributions };
13*a325d9c4SApple OSS Distributions
14*a325d9c4SApple OSS Distributions template <typename T>
15*a325d9c4SApple OSS Distributions static void
tests()16*a325d9c4SApple OSS Distributions tests()
17*a325d9c4SApple OSS Distributions {
18*a325d9c4SApple OSS Distributions // Swap non-null with non-null
19*a325d9c4SApple OSS Distributions {
20*a325d9c4SApple OSS Distributions tracked_safe_allocation<T> a(10, libkern::allocate_memory);
21*a325d9c4SApple OSS Distributions tracked_safe_allocation<T> b(20, libkern::allocate_memory);
22*a325d9c4SApple OSS Distributions T* a_mem = a.data();
23*a325d9c4SApple OSS Distributions T* b_mem = b.data();
24*a325d9c4SApple OSS Distributions tracking_allocator::reset();
25*a325d9c4SApple OSS Distributions
26*a325d9c4SApple OSS Distributions swap(a, b); // ADL call
27*a325d9c4SApple OSS Distributions
28*a325d9c4SApple OSS Distributions CHECK(!tracking_allocator::did_allocate);
29*a325d9c4SApple OSS Distributions CHECK(!tracking_allocator::did_deallocate);
30*a325d9c4SApple OSS Distributions CHECK(a.data() == b_mem);
31*a325d9c4SApple OSS Distributions CHECK(b.data() == a_mem);
32*a325d9c4SApple OSS Distributions CHECK(a.size() == 20);
33*a325d9c4SApple OSS Distributions CHECK(b.size() == 10);
34*a325d9c4SApple OSS Distributions }
35*a325d9c4SApple OSS Distributions
36*a325d9c4SApple OSS Distributions // Swap non-null with null
37*a325d9c4SApple OSS Distributions {
38*a325d9c4SApple OSS Distributions tracked_safe_allocation<T> a(10, libkern::allocate_memory);
39*a325d9c4SApple OSS Distributions tracked_safe_allocation<T> b = nullptr;
40*a325d9c4SApple OSS Distributions T* a_mem = a.data();
41*a325d9c4SApple OSS Distributions tracking_allocator::reset();
42*a325d9c4SApple OSS Distributions
43*a325d9c4SApple OSS Distributions swap(a, b); // ADL call
44*a325d9c4SApple OSS Distributions
45*a325d9c4SApple OSS Distributions CHECK(!tracking_allocator::did_allocate);
46*a325d9c4SApple OSS Distributions CHECK(!tracking_allocator::did_deallocate);
47*a325d9c4SApple OSS Distributions CHECK(a.data() == nullptr);
48*a325d9c4SApple OSS Distributions CHECK(b.data() == a_mem);
49*a325d9c4SApple OSS Distributions CHECK(a.size() == 0);
50*a325d9c4SApple OSS Distributions CHECK(b.size() == 10);
51*a325d9c4SApple OSS Distributions }
52*a325d9c4SApple OSS Distributions
53*a325d9c4SApple OSS Distributions // Swap null with non-null
54*a325d9c4SApple OSS Distributions {
55*a325d9c4SApple OSS Distributions tracked_safe_allocation<T> a = nullptr;
56*a325d9c4SApple OSS Distributions tracked_safe_allocation<T> b(20, libkern::allocate_memory);
57*a325d9c4SApple OSS Distributions T* b_mem = b.data();
58*a325d9c4SApple OSS Distributions tracking_allocator::reset();
59*a325d9c4SApple OSS Distributions
60*a325d9c4SApple OSS Distributions swap(a, b); // ADL call
61*a325d9c4SApple OSS Distributions
62*a325d9c4SApple OSS Distributions CHECK(!tracking_allocator::did_allocate);
63*a325d9c4SApple OSS Distributions CHECK(!tracking_allocator::did_deallocate);
64*a325d9c4SApple OSS Distributions CHECK(a.data() == b_mem);
65*a325d9c4SApple OSS Distributions CHECK(b.data() == nullptr);
66*a325d9c4SApple OSS Distributions CHECK(a.size() == 20);
67*a325d9c4SApple OSS Distributions CHECK(b.size() == 0);
68*a325d9c4SApple OSS Distributions }
69*a325d9c4SApple OSS Distributions
70*a325d9c4SApple OSS Distributions // Swap null with null
71*a325d9c4SApple OSS Distributions {
72*a325d9c4SApple OSS Distributions tracked_safe_allocation<T> a = nullptr;
73*a325d9c4SApple OSS Distributions tracked_safe_allocation<T> b = nullptr;
74*a325d9c4SApple OSS Distributions tracking_allocator::reset();
75*a325d9c4SApple OSS Distributions
76*a325d9c4SApple OSS Distributions swap(a, b); // ADL call
77*a325d9c4SApple OSS Distributions
78*a325d9c4SApple OSS Distributions CHECK(!tracking_allocator::did_allocate);
79*a325d9c4SApple OSS Distributions CHECK(!tracking_allocator::did_deallocate);
80*a325d9c4SApple OSS Distributions CHECK(a.data() == nullptr);
81*a325d9c4SApple OSS Distributions CHECK(b.data() == nullptr);
82*a325d9c4SApple OSS Distributions CHECK(a.size() == 0);
83*a325d9c4SApple OSS Distributions CHECK(b.size() == 0);
84*a325d9c4SApple OSS Distributions }
85*a325d9c4SApple OSS Distributions
86*a325d9c4SApple OSS Distributions // Swap with self
87*a325d9c4SApple OSS Distributions {
88*a325d9c4SApple OSS Distributions tracked_safe_allocation<T> a(10, libkern::allocate_memory);
89*a325d9c4SApple OSS Distributions T* a_mem = a.data();
90*a325d9c4SApple OSS Distributions tracking_allocator::reset();
91*a325d9c4SApple OSS Distributions
92*a325d9c4SApple OSS Distributions swap(a, a); // ADL call
93*a325d9c4SApple OSS Distributions
94*a325d9c4SApple OSS Distributions CHECK(!tracking_allocator::did_allocate);
95*a325d9c4SApple OSS Distributions CHECK(!tracking_allocator::did_deallocate);
96*a325d9c4SApple OSS Distributions CHECK(a.data() == a_mem);
97*a325d9c4SApple OSS Distributions CHECK(a.size() == 10);
98*a325d9c4SApple OSS Distributions }
99*a325d9c4SApple OSS Distributions }
100*a325d9c4SApple OSS Distributions
101*a325d9c4SApple OSS Distributions T_DECL(swap, "safe_allocation.swap") {
102*a325d9c4SApple OSS Distributions tests<T>();
103*a325d9c4SApple OSS Distributions tests<T const>();
104*a325d9c4SApple OSS Distributions }
105