1*4d495c6eSApple OSS Distributions // 2*4d495c6eSApple OSS Distributions // Tests for 3*4d495c6eSApple OSS Distributions // safe_allocation(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-construct from a non-null allocation (with different syntaxes) 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 tracking_allocator::reset(); 24*4d495c6eSApple OSS Distributions 25*4d495c6eSApple OSS Distributions T* memory = from.data(); 26*4d495c6eSApple OSS Distributions 27*4d495c6eSApple OSS Distributions { 28*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> to(std::move(from)); 29*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_allocate); 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_deallocate); 36*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 37*4d495c6eSApple OSS Distributions } 38*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 39*4d495c6eSApple OSS Distributions } 40*4d495c6eSApple OSS Distributions { 41*4d495c6eSApple OSS Distributions { 42*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> from(10, libkern::allocate_memory); 43*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 44*4d495c6eSApple OSS Distributions 45*4d495c6eSApple OSS Distributions T* memory = from.data(); 46*4d495c6eSApple OSS Distributions 47*4d495c6eSApple OSS Distributions { 48*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> to{std::move(from)}; 49*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_allocate); 50*4d495c6eSApple OSS Distributions CHECK(to.data() == memory); 51*4d495c6eSApple OSS Distributions CHECK(to.size() == 10); 52*4d495c6eSApple OSS Distributions CHECK(from.data() == nullptr); 53*4d495c6eSApple OSS Distributions CHECK(from.size() == 0); 54*4d495c6eSApple OSS Distributions } 55*4d495c6eSApple OSS Distributions CHECK(tracking_allocator::did_deallocate); 56*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 57*4d495c6eSApple OSS Distributions } 58*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 59*4d495c6eSApple OSS Distributions } 60*4d495c6eSApple OSS Distributions { 61*4d495c6eSApple OSS Distributions { 62*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> from(10, libkern::allocate_memory); 63*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 64*4d495c6eSApple OSS Distributions 65*4d495c6eSApple OSS Distributions T* memory = from.data(); 66*4d495c6eSApple OSS Distributions 67*4d495c6eSApple OSS Distributions { 68*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> to = std::move(from); 69*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_allocate); 70*4d495c6eSApple OSS Distributions CHECK(to.data() == memory); 71*4d495c6eSApple OSS Distributions CHECK(to.size() == 10); 72*4d495c6eSApple OSS Distributions CHECK(from.data() == nullptr); 73*4d495c6eSApple OSS Distributions CHECK(from.size() == 0); 74*4d495c6eSApple OSS Distributions } 75*4d495c6eSApple OSS Distributions CHECK(tracking_allocator::did_deallocate); 76*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 77*4d495c6eSApple OSS Distributions } 78*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 79*4d495c6eSApple OSS Distributions } 80*4d495c6eSApple OSS Distributions 81*4d495c6eSApple OSS Distributions // Move-construct from a null allocation 82*4d495c6eSApple OSS Distributions { 83*4d495c6eSApple OSS Distributions { 84*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> from = nullptr; 85*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 86*4d495c6eSApple OSS Distributions 87*4d495c6eSApple OSS Distributions { 88*4d495c6eSApple OSS Distributions tracked_safe_allocation<T> to(std::move(from)); 89*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_allocate); 90*4d495c6eSApple OSS Distributions CHECK(to.data() == nullptr); 91*4d495c6eSApple OSS Distributions CHECK(to.size() == 0); 92*4d495c6eSApple OSS Distributions CHECK(from.data() == nullptr); 93*4d495c6eSApple OSS Distributions CHECK(from.size() == 0); 94*4d495c6eSApple OSS Distributions } 95*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 96*4d495c6eSApple OSS Distributions tracking_allocator::reset(); 97*4d495c6eSApple OSS Distributions } 98*4d495c6eSApple OSS Distributions CHECK(!tracking_allocator::did_deallocate); 99*4d495c6eSApple OSS Distributions } 100*4d495c6eSApple OSS Distributions } 101*4d495c6eSApple OSS Distributions 102*4d495c6eSApple OSS Distributions T_DECL(ctor_move, "safe_allocation.ctor.move", T_META_TAG_VM_PREFERRED) { 103*4d495c6eSApple OSS Distributions tests<T>(); 104*4d495c6eSApple OSS Distributions tests<T const>(); 105*4d495c6eSApple OSS Distributions } 106