xref: /xnu-8019.80.24/tests/safe_allocation_src/swap.cpp (revision a325d9c4a84054e40bbe985afedcb50ab80993ea)
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