1*4d495c6eSApple OSS Distributions // 2*4d495c6eSApple OSS Distributions // Tests for 3*4d495c6eSApple OSS Distributions // safe_allocation& operator=(safe_allocation&& other); 4*4d495c6eSApple OSS Distributions // 5*4d495c6eSApple OSS Distributions 6*4d495c6eSApple OSS Distributions #include <libkern/c++/safe_allocation.h> 7*4d495c6eSApple OSS Distributions #include <darwintest.h> 8*4d495c6eSApple OSS Distributions #include "test_utils.h" 9*4d495c6eSApple OSS Distributions #include <utility> 10*4d495c6eSApple OSS Distributions 11*4d495c6eSApple OSS Distributions struct T { 12*4d495c6eSApple OSS Distributions int i; 13*4d495c6eSApple OSS Distributions }; 14*4d495c6eSApple OSS Distributions 15*4d495c6eSApple OSS Distributions template <typename T> 16*4d495c6eSApple OSS Distributions static void tests()17*4d495c6eSApple OSS Distributionstests() 18*4d495c6eSApple OSS Distributions { 19*4d495c6eSApple OSS Distributions // Move-assign non-null to non-null 20*4d495c6eSApple OSS Distributions { 21*4d495c6eSApple OSS Distributions { 22*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> from(10, libkern::allocate_memory); 23*4d495c6eSApple OSS Distributions T* memory = from.data(); 24*4d495c6eSApple OSS Distributions { 25*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> to(20, libkern::allocate_memory); 26*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 27*4d495c6eSApple OSS Distributions 28*4d495c6eSApple OSS Distributions tracked_safe_allocation<T>& ref = (to = std::move(from)); 29*4d495c6eSApple OSS Distributions CHECK(&ref == &to); 30*4d495c6eSApple OSS Distributions CHECK(to.data() == memory); 31*4d495c6eSApple OSS Distributions CHECK(to.size() == 10); 32*4d495c6eSApple OSS Distributions CHECK(from.data() == nullptr); 33*4d495c6eSApple OSS Distributions CHECK(from.size() == 0); 34*4d495c6eSApple OSS Distributions 35*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_allocate); 36*4d495c6eSApple OSS Distributions CHECK(tracking_allocator::deallocated_size == 20 * sizeof(T)); 37*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 38*4d495c6eSApple OSS Distributions } 39*4d495c6eSApple OSS Distributions CHECK(tracking_allocator::deallocated_size == 10 * sizeof(T)); 40*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 41*4d495c6eSApple OSS Distributions } 42*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 43*4d495c6eSApple OSS Distributions } 44*4d495c6eSApple OSS Distributions 45*4d495c6eSApple OSS Distributions // Move-assign null to non-null 46*4d495c6eSApple OSS Distributions { 47*4d495c6eSApple OSS Distributions { 48*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> from = nullptr; 49*4d495c6eSApple OSS Distributions { 50*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> to(20, libkern::allocate_memory); 51*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 52*4d495c6eSApple OSS Distributions 53*4d495c6eSApple OSS Distributions tracked_safe_allocation<T>& ref = (to = std::move(from)); 54*4d495c6eSApple OSS Distributions CHECK(&ref == &to); 55*4d495c6eSApple OSS Distributions CHECK(to.data() == nullptr); 56*4d495c6eSApple OSS Distributions CHECK(to.size() == 0); 57*4d495c6eSApple OSS Distributions CHECK(from.data() == nullptr); 58*4d495c6eSApple OSS Distributions CHECK(from.size() == 0); 59*4d495c6eSApple OSS Distributions 60*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_allocate); 61*4d495c6eSApple OSS Distributions CHECK(tracking_allocator::deallocated_size == 20 * sizeof(T)); 62*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 63*4d495c6eSApple OSS Distributions } 64*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 65*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 66*4d495c6eSApple OSS Distributions } 67*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 68*4d495c6eSApple OSS Distributions } 69*4d495c6eSApple OSS Distributions 70*4d495c6eSApple OSS Distributions // Move-assign non-null to null 71*4d495c6eSApple OSS Distributions { 72*4d495c6eSApple OSS Distributions { 73*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> from(10, libkern::allocate_memory); 74*4d495c6eSApple OSS Distributions T* memory = from.data(); 75*4d495c6eSApple OSS Distributions { 76*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> to = nullptr; 77*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 78*4d495c6eSApple OSS Distributions 79*4d495c6eSApple OSS Distributions tracked_safe_allocation<T>& ref = (to = std::move(from)); 80*4d495c6eSApple OSS Distributions CHECK(&ref == &to); 81*4d495c6eSApple OSS Distributions CHECK(to.data() == memory); 82*4d495c6eSApple OSS Distributions CHECK(to.size() == 10); 83*4d495c6eSApple OSS Distributions CHECK(from.data() == nullptr); 84*4d495c6eSApple OSS Distributions CHECK(from.size() == 0); 85*4d495c6eSApple OSS Distributions 86*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_allocate); 87*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 88*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 89*4d495c6eSApple OSS Distributions } 90*4d495c6eSApple OSS Distributions CHECK(tracking_allocator::deallocated_size == 10 * sizeof(T)); 91*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 92*4d495c6eSApple OSS Distributions } 93*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 94*4d495c6eSApple OSS Distributions } 95*4d495c6eSApple OSS Distributions 96*4d495c6eSApple OSS Distributions // Move-assign null to null 97*4d495c6eSApple OSS Distributions { 98*4d495c6eSApple OSS Distributions { 99*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> from = nullptr; 100*4d495c6eSApple OSS Distributions { 101*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> to = nullptr; 102*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 103*4d495c6eSApple OSS Distributions 104*4d495c6eSApple OSS Distributions tracked_safe_allocation<T>& ref = (to = std::move(from)); 105*4d495c6eSApple OSS Distributions CHECK(&ref == &to); 106*4d495c6eSApple OSS Distributions CHECK(to.data() == nullptr); 107*4d495c6eSApple OSS Distributions CHECK(to.size() == 0); 108*4d495c6eSApple OSS Distributions CHECK(from.data() == nullptr); 109*4d495c6eSApple OSS Distributions CHECK(from.size() == 0); 110*4d495c6eSApple OSS Distributions 111*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_allocate); 112*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 113*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 114*4d495c6eSApple OSS Distributions } 115*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 116*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 117*4d495c6eSApple OSS Distributions } 118*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 119*4d495c6eSApple OSS Distributions } 120*4d495c6eSApple OSS Distributions 121*4d495c6eSApple OSS Distributions // Move-assign to self 122*4d495c6eSApple OSS Distributions { 123*4d495c6eSApple OSS Distributions { 124*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> obj(10, libkern::allocate_memory); 125*4d495c6eSApple OSS Distributions T* memory = obj.data(); 126*4d495c6eSApple OSS Distributions 127*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 128*4d495c6eSApple OSS Distributions tracked_safe_allocation<T>& ref = (obj = std::move(obj)); 129*4d495c6eSApple OSS Distributions CHECK(&ref == &obj); 130*4d495c6eSApple OSS Distributions CHECK(obj.data() == memory); 131*4d495c6eSApple OSS Distributions CHECK(obj.size() == 10); 132*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_allocate); 133*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 134*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 135*4d495c6eSApple OSS Distributions } 136*4d495c6eSApple OSS Distributions CHECK(tracking_allocator::deallocated_size == 10 * sizeof(T)); 137*4d495c6eSApple OSS Distributions } 138*4d495c6eSApple OSS Distributions } 139*4d495c6eSApple OSS Distributions 140*4d495c6eSApple OSS Distributions T_DECL(assign_move, "safe_allocation.assign.move", T_META_TAG_VM_PREFERRED) { 141*4d495c6eSApple OSS Distributions tests<T>(); 142*4d495c6eSApple OSS Distributions tests<T const>(); 143*4d495c6eSApple OSS Distributions } 144