]> git.saurik.com Git - apple/xnu.git/blob - tests/bounded_array_ref_src/ctor.raw_ptr.cpp
xnu-7195.101.1.tar.gz
[apple/xnu.git] / tests / bounded_array_ref_src / ctor.raw_ptr.cpp
1 //
2 // Tests for
3 // explicit bounded_array_ref(T* data, size_t n);
4 //
5
6 #include <libkern/c++/bounded_array_ref.h>
7 #include "test_policy.h"
8 #include <cstddef>
9 #include <darwintest.h>
10 #include <darwintest_utils.h>
11
12 struct T { int i; };
13 inline bool
14 operator==(T const& a, T const& b)
15 {
16 return a.i == b.i;
17 };
18
19 template <typename T>
20 static void
21 tests()
22 {
23 T array[5] = {T{0}, T{1}, T{2}, T{3}, T{4}};
24
25 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
26 // ^
27 // |
28 // ptr
29 //
30 // ^------------------- view -----------------------^
31 {
32 T* ptr = &array[0];
33 test_bounded_array_ref<T> view(ptr, 5);
34 CHECK(view.data() == &array[0]);
35 CHECK(view.size() == 5);
36 CHECK(view[0] == T{0});
37 CHECK(view[1] == T{1});
38 CHECK(view[2] == T{2});
39 CHECK(view[3] == T{3});
40 CHECK(view[4] == T{4});
41 }
42 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
43 // ^
44 // |
45 // ptr
46 //
47 // ^----- view -----^
48 {
49 T* ptr = &array[0];
50 test_bounded_array_ref<T> view(ptr, 3);
51 CHECK(view.data() == &array[0]);
52 CHECK(view.size() == 3);
53 CHECK(view[0] == T{0});
54 CHECK(view[1] == T{1});
55 CHECK(view[2] == T{2});
56 }
57 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
58 // ^
59 // |
60 // ptr
61 //
62 // ^------- view --------^
63 {
64 T* ptr = &array[3];
65 test_bounded_array_ref<T> view(ptr, 2);
66 CHECK(view.data() == &array[3]);
67 CHECK(view.size() == 2);
68 CHECK(view[0] == T{3});
69 CHECK(view[1] == T{4});
70 }
71 // Check with a valid pointer and a size of 0.
72 {
73 T* ptr = &array[0];
74 test_bounded_array_ref<T> view(ptr, static_cast<std::size_t>(0));
75 CHECK(view.size() == 0);
76 }
77 // Check with a null pointer and a size of 0.
78 {
79 T* ptr = nullptr;
80 test_bounded_array_ref<T> view(ptr, static_cast<std::size_t>(0));
81 CHECK(view.size() == 0);
82 }
83 // Check with a non-null but invalid pointer and a size of 0.
84 {
85 T* ptr = &array[5];
86 test_bounded_array_ref<T> view(ptr, static_cast<std::size_t>(0));
87 CHECK(view.size() == 0);
88 }
89 // Make sure there's no ambiguity between constructors.
90 {
91 T* ptr = &array[0];
92 std::ptrdiff_t size = 5;
93 test_bounded_array_ref<T> view(ptr, size);
94 CHECK(view.data() == &array[0]);
95 CHECK(view.size() == 5);
96 }
97
98 // Make sure we can create nested bounded_array_refs
99 {
100 int array1[] = {1, 2, 3, 4, 5};
101 int array2[] = {6, 7, 8};
102 int array3[] = {9, 10, 11, 12, 13, 14};
103 test_bounded_array_ref<int> views[] = {
104 test_bounded_array_ref<int>(array1, 5),
105 test_bounded_array_ref<int>(array2, 3),
106 test_bounded_array_ref<int>(array3, 6)
107 };
108
109 test_bounded_array_ref<test_bounded_array_ref<int> > two_dim(views, 3);
110 CHECK(two_dim.size() == 3);
111 CHECK(two_dim.data() == &views[0]);
112 CHECK(&two_dim[0] == &views[0]);
113 CHECK(&two_dim[1] == &views[1]);
114 CHECK(&two_dim[2] == &views[2]);
115 }
116 }
117
118 T_DECL(ctor_raw_ptr, "bounded_array_ref.ctor.raw_ptr") {
119 tests<T>();
120 tests<T const>();
121 }