xref: /xnu-10063.101.15/tests/intrusive_shared_ptr_src/test_policy.h (revision 94d3b452840153a99b38a3a9659680b2a006908e)
1*94d3b452SApple OSS Distributions #ifndef TESTS_INTRUSIVE_SHARED_PTR_TEST_POLICY_H
2*94d3b452SApple OSS Distributions #define TESTS_INTRUSIVE_SHARED_PTR_TEST_POLICY_H
3*94d3b452SApple OSS Distributions 
4*94d3b452SApple OSS Distributions #include <libkern/c++/intrusive_shared_ptr.h>
5*94d3b452SApple OSS Distributions #include <darwintest_utils.h>
6*94d3b452SApple OSS Distributions 
7*94d3b452SApple OSS Distributions struct test_policy {
8*94d3b452SApple OSS Distributions 	static inline int retain_count = 0;
9*94d3b452SApple OSS Distributions 
10*94d3b452SApple OSS Distributions 	template <typename T>
11*94d3b452SApple OSS Distributions 	static void
retaintest_policy12*94d3b452SApple OSS Distributions 	retain(T&)
13*94d3b452SApple OSS Distributions 	{
14*94d3b452SApple OSS Distributions 		++retain_count;
15*94d3b452SApple OSS Distributions 	}
16*94d3b452SApple OSS Distributions 	template <typename T>
17*94d3b452SApple OSS Distributions 	static void
releasetest_policy18*94d3b452SApple OSS Distributions 	release(T&)
19*94d3b452SApple OSS Distributions 	{
20*94d3b452SApple OSS Distributions 		--retain_count;
21*94d3b452SApple OSS Distributions 	}
22*94d3b452SApple OSS Distributions };
23*94d3b452SApple OSS Distributions 
24*94d3b452SApple OSS Distributions struct tracking_policy {
25*94d3b452SApple OSS Distributions 	static inline int retains = 0;
26*94d3b452SApple OSS Distributions 	static inline int releases = 0;
27*94d3b452SApple OSS Distributions 	static inline int refcount = 0;
28*94d3b452SApple OSS Distributions 	static inline bool hit_zero = false;
29*94d3b452SApple OSS Distributions 
30*94d3b452SApple OSS Distributions 	static void
resettracking_policy31*94d3b452SApple OSS Distributions 	reset()
32*94d3b452SApple OSS Distributions 	{
33*94d3b452SApple OSS Distributions 		retains = 0;
34*94d3b452SApple OSS Distributions 		releases = 0;
35*94d3b452SApple OSS Distributions 		refcount = 0;
36*94d3b452SApple OSS Distributions 		hit_zero = false;
37*94d3b452SApple OSS Distributions 	}
38*94d3b452SApple OSS Distributions 
39*94d3b452SApple OSS Distributions 	template <typename T>
40*94d3b452SApple OSS Distributions 	static void
retaintracking_policy41*94d3b452SApple OSS Distributions 	retain(T&)
42*94d3b452SApple OSS Distributions 	{
43*94d3b452SApple OSS Distributions 		++retains;
44*94d3b452SApple OSS Distributions 		++refcount;
45*94d3b452SApple OSS Distributions 	}
46*94d3b452SApple OSS Distributions 	template <typename T>
47*94d3b452SApple OSS Distributions 	static void
releasetracking_policy48*94d3b452SApple OSS Distributions 	release(T&)
49*94d3b452SApple OSS Distributions 	{
50*94d3b452SApple OSS Distributions 		++releases;
51*94d3b452SApple OSS Distributions 		--refcount;
52*94d3b452SApple OSS Distributions 		if (refcount == 0) {
53*94d3b452SApple OSS Distributions 			hit_zero = true;
54*94d3b452SApple OSS Distributions 		}
55*94d3b452SApple OSS Distributions 	}
56*94d3b452SApple OSS Distributions };
57*94d3b452SApple OSS Distributions 
58*94d3b452SApple OSS Distributions template <int>
59*94d3b452SApple OSS Distributions struct dummy_policy {
60*94d3b452SApple OSS Distributions 	template <typename T>
61*94d3b452SApple OSS Distributions 	static void
retaindummy_policy62*94d3b452SApple OSS Distributions 	retain(T&)
63*94d3b452SApple OSS Distributions 	{
64*94d3b452SApple OSS Distributions 	}
65*94d3b452SApple OSS Distributions 	template <typename T>
66*94d3b452SApple OSS Distributions 	static void
releasedummy_policy67*94d3b452SApple OSS Distributions 	release(T&)
68*94d3b452SApple OSS Distributions 	{
69*94d3b452SApple OSS Distributions 	}
70*94d3b452SApple OSS Distributions };
71*94d3b452SApple OSS Distributions 
72*94d3b452SApple OSS Distributions template <typename T>
73*94d3b452SApple OSS Distributions using tracked_shared_ptr = libkern::intrusive_shared_ptr<T, tracking_policy>;
74*94d3b452SApple OSS Distributions 
75*94d3b452SApple OSS Distributions template <typename T>
76*94d3b452SApple OSS Distributions using test_shared_ptr = libkern::intrusive_shared_ptr<T, test_policy>;
77*94d3b452SApple OSS Distributions 
78*94d3b452SApple OSS Distributions #define CHECK(...) T_ASSERT_TRUE((__VA_ARGS__), # __VA_ARGS__)
79*94d3b452SApple OSS Distributions 
80*94d3b452SApple OSS Distributions #endif // !TESTS_INTRUSIVE_SHARED_PTR_TEST_POLICY_H
81