xref: /xnu-12377.81.4/tests/cxx_safe_buffers_src/unsafe_forge_span.cpp (revision 043036a2b3718f7f0be807e2870f8f47d3fa0796) !
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()19 tests()
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