1*4d495c6eSApple OSS Distributions // 2*4d495c6eSApple OSS Distributions // Tests for 3*4d495c6eSApple OSS Distributions // __unsafe_forge_span functions 4*4d495c6eSApple OSS Distributions // 5*4d495c6eSApple OSS Distributions 6*4d495c6eSApple OSS Distributions #include <span> 7*4d495c6eSApple OSS Distributions #include <vector> 8*4d495c6eSApple OSS Distributions #include <os/cxx_safe_buffers.h> 9*4d495c6eSApple OSS Distributions #include <darwintest.h> 10*4d495c6eSApple OSS Distributions 11*4d495c6eSApple OSS Distributions #define CHECK(...) T_ASSERT_TRUE((__VA_ARGS__), # __VA_ARGS__) 12*4d495c6eSApple OSS Distributions 13*4d495c6eSApple OSS Distributions struct S { 14*4d495c6eSApple OSS Distributions int i; 15*4d495c6eSApple OSS Distributions }; 16*4d495c6eSApple OSS Distributions 17*4d495c6eSApple OSS Distributions template <typename T> 18*4d495c6eSApple OSS Distributions static void tests()19*4d495c6eSApple OSS Distributionstests() 20*4d495c6eSApple OSS Distributions { 21*4d495c6eSApple OSS Distributions { 22*4d495c6eSApple OSS Distributions T * p = new T[10]; 23*4d495c6eSApple OSS Distributions std::span<T> span = os::span::__unsafe_forge_span(p, 10); 24*4d495c6eSApple OSS Distributions 25*4d495c6eSApple OSS Distributions CHECK(span.data() == p && span.size() == 10); 26*4d495c6eSApple OSS Distributions delete[] p; 27*4d495c6eSApple OSS Distributions } 28*4d495c6eSApple OSS Distributions { 29*4d495c6eSApple OSS Distributions const T * p = new T[10]; 30*4d495c6eSApple OSS Distributions std::span<const T> span = os::span::__unsafe_forge_span(p, 10); 31*4d495c6eSApple OSS Distributions 32*4d495c6eSApple OSS Distributions CHECK(span.data() == p && span.size() == 10); 33*4d495c6eSApple OSS Distributions delete[] p; 34*4d495c6eSApple OSS Distributions } 35*4d495c6eSApple OSS Distributions { 36*4d495c6eSApple OSS Distributions std::vector<T> v; 37*4d495c6eSApple OSS Distributions std::span<T> span = os::span::__unsafe_forge_span(v.begin(), v.end()); 38*4d495c6eSApple OSS Distributions 39*4d495c6eSApple OSS Distributions CHECK(span.data() == v.data() && span.size() == 0); 40*4d495c6eSApple OSS Distributions } 41*4d495c6eSApple OSS Distributions { 42*4d495c6eSApple OSS Distributions T * p = new T[10]; 43*4d495c6eSApple OSS Distributions std::span<T> span = os::unsafe_forge_span(p, 10); 44*4d495c6eSApple OSS Distributions std::span<T, 10> span2 = os::unsafe_forge_span<T, 10>(p); 45*4d495c6eSApple OSS Distributions 46*4d495c6eSApple OSS Distributions CHECK(span.data() == p && span.size() == 10); 47*4d495c6eSApple OSS Distributions CHECK(span2.data() == p && span2.size() == 10); 48*4d495c6eSApple OSS Distributions delete[] p; 49*4d495c6eSApple OSS Distributions } 50*4d495c6eSApple OSS Distributions { 51*4d495c6eSApple OSS Distributions std::vector<T> v; 52*4d495c6eSApple OSS Distributions std::span<T> span = os::unsafe_forge_span(v.begin(), v.end()); 53*4d495c6eSApple OSS Distributions 54*4d495c6eSApple OSS Distributions CHECK(span.data() == v.data() && span.size() == 0); 55*4d495c6eSApple OSS Distributions } 56*4d495c6eSApple OSS Distributions } 57*4d495c6eSApple OSS Distributions 58*4d495c6eSApple OSS Distributions T_DECL(unsafe_forge_span, "cxx_safe_buffers.unsafe_forge_span") 59*4d495c6eSApple OSS Distributions { 60*4d495c6eSApple OSS Distributions tests<S>(); 61*4d495c6eSApple OSS Distributions } 62