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