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