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