1 //
2 // Tests for
3 //  iterator begin();
4 //  const_iterator begin() const;
5 //
6 //  iterator end();
7 //  const_iterator end() const;
8 //
9 
10 #include <libkern/c++/bounded_array.h>
11 #include "test_policy.h"
12 #include <darwintest.h>
13 #include <type_traits>
14 
15 struct T { int i; };
16 
17 template <typename T>
18 static void
19 tests()
20 {
21 	// Check begin()/end() for a non-empty array
22 	{
23 		test_bounded_array<T, 5> array = {T{0}, T{1}, T{2}, T{3}, T{4}};
24 		test_bounded_ptr<T> begin = array.begin();
25 		test_bounded_ptr<T> end = array.end();
26 		CHECK(begin.discard_bounds() == array.data());
27 		CHECK(end.unsafe_discard_bounds() == array.data() + 5);
28 	}
29 	{
30 		test_bounded_array<T, 5> const array = {T{0}, T{1}, T{2}, T{3}, T{4}};
31 		test_bounded_ptr<T const> begin = array.begin();
32 		test_bounded_ptr<T const> end = array.end();
33 		CHECK(begin.discard_bounds() == array.data());
34 		CHECK(end.unsafe_discard_bounds() == array.data() + 5);
35 	}
36 
37 	// Check begin()/end() for an empty array
38 	{
39 		test_bounded_array<T, 0> array = {};
40 		test_bounded_ptr<T> begin = array.begin();
41 		test_bounded_ptr<T> end = array.end();
42 		CHECK(begin.unsafe_discard_bounds() == array.data());
43 		CHECK(end.unsafe_discard_bounds() == array.data());
44 	}
45 	{
46 		test_bounded_array<T, 0> const array = {};
47 		test_bounded_ptr<T const> begin = array.begin();
48 		test_bounded_ptr<T const> end = array.end();
49 		CHECK(begin.unsafe_discard_bounds() == array.data());
50 		CHECK(end.unsafe_discard_bounds() == array.data());
51 	}
52 
53 	// Check associated types
54 	{
55 		using A = test_bounded_array<T, 10>;
56 		static_assert(std::is_same_v<typename A::iterator, test_bounded_ptr<T> >);
57 		static_assert(std::is_same_v<typename A::const_iterator, test_bounded_ptr<T const> >);
58 	}
59 }
60 
61 T_DECL(begin_end, "bounded_array.begin_end") {
62 	tests<T>();
63 }
64