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