xref: /xnu-8796.121.2/tests/safe_allocation_src/begin_end.cpp (revision c54f35ca767986246321eb901baf8f5ff7923f6a)
1*c54f35caSApple OSS Distributions //
2*c54f35caSApple OSS Distributions // Tests for
3*c54f35caSApple OSS Distributions //  iterator begin();
4*c54f35caSApple OSS Distributions //  const_iterator begin() const;
5*c54f35caSApple OSS Distributions //
6*c54f35caSApple OSS Distributions //  iterator end();
7*c54f35caSApple OSS Distributions //  const_iterator end() const;
8*c54f35caSApple OSS Distributions //
9*c54f35caSApple OSS Distributions 
10*c54f35caSApple OSS Distributions #include <libkern/c++/safe_allocation.h>
11*c54f35caSApple OSS Distributions #include <darwintest.h>
12*c54f35caSApple OSS Distributions #include "test_utils.h"
13*c54f35caSApple OSS Distributions #include <type_traits>
14*c54f35caSApple OSS Distributions 
15*c54f35caSApple OSS Distributions struct T {
16*c54f35caSApple OSS Distributions 	int i;
17*c54f35caSApple OSS Distributions };
18*c54f35caSApple OSS Distributions 
19*c54f35caSApple OSS Distributions template <typename T>
20*c54f35caSApple OSS Distributions static void
tests()21*c54f35caSApple OSS Distributions tests()
22*c54f35caSApple OSS Distributions {
23*c54f35caSApple OSS Distributions 	using A = test_safe_allocation<T>;
24*c54f35caSApple OSS Distributions 
25*c54f35caSApple OSS Distributions 	// Check begin()/end() for a non-null allocation
26*c54f35caSApple OSS Distributions 	{
27*c54f35caSApple OSS Distributions 		A array(10, libkern::allocate_memory);
28*c54f35caSApple OSS Distributions 		T* data = array.data();
29*c54f35caSApple OSS Distributions 		test_bounded_ptr<T> begin = array.begin();
30*c54f35caSApple OSS Distributions 		test_bounded_ptr<T> end = array.end();
31*c54f35caSApple OSS Distributions 		CHECK(begin.discard_bounds() == data);
32*c54f35caSApple OSS Distributions 		CHECK(end.unsafe_discard_bounds() == data + 10);
33*c54f35caSApple OSS Distributions 	}
34*c54f35caSApple OSS Distributions 	{
35*c54f35caSApple OSS Distributions 		A const array(10, libkern::allocate_memory);
36*c54f35caSApple OSS Distributions 		T const* data = array.data();
37*c54f35caSApple OSS Distributions 		test_bounded_ptr<T const> begin = array.begin();
38*c54f35caSApple OSS Distributions 		test_bounded_ptr<T const> end = array.end();
39*c54f35caSApple OSS Distributions 		CHECK(begin.discard_bounds() == data);
40*c54f35caSApple OSS Distributions 		CHECK(end.unsafe_discard_bounds() == data + 10);
41*c54f35caSApple OSS Distributions 	}
42*c54f35caSApple OSS Distributions 
43*c54f35caSApple OSS Distributions 	// Check begin()/end() for a null allocation
44*c54f35caSApple OSS Distributions 	{
45*c54f35caSApple OSS Distributions 		A array = nullptr;
46*c54f35caSApple OSS Distributions 		test_bounded_ptr<T> begin = array.begin();
47*c54f35caSApple OSS Distributions 		test_bounded_ptr<T> end = array.end();
48*c54f35caSApple OSS Distributions 		CHECK(begin.unsafe_discard_bounds() == nullptr);
49*c54f35caSApple OSS Distributions 		CHECK(end.unsafe_discard_bounds() == nullptr);
50*c54f35caSApple OSS Distributions 		CHECK(begin == end);
51*c54f35caSApple OSS Distributions 	}
52*c54f35caSApple OSS Distributions 	{
53*c54f35caSApple OSS Distributions 		A const array = nullptr;
54*c54f35caSApple OSS Distributions 		test_bounded_ptr<T const> begin = array.begin();
55*c54f35caSApple OSS Distributions 		test_bounded_ptr<T const> end = array.end();
56*c54f35caSApple OSS Distributions 		CHECK(begin.unsafe_discard_bounds() == nullptr);
57*c54f35caSApple OSS Distributions 		CHECK(end.unsafe_discard_bounds() == nullptr);
58*c54f35caSApple OSS Distributions 		CHECK(begin == end);
59*c54f35caSApple OSS Distributions 	}
60*c54f35caSApple OSS Distributions 
61*c54f35caSApple OSS Distributions 	// Check associated types
62*c54f35caSApple OSS Distributions 	{
63*c54f35caSApple OSS Distributions 		static_assert(std::is_same_v<typename A::iterator, test_bounded_ptr<T> >);
64*c54f35caSApple OSS Distributions 		static_assert(std::is_same_v<typename A::const_iterator, test_bounded_ptr<T const> >);
65*c54f35caSApple OSS Distributions 	}
66*c54f35caSApple OSS Distributions }
67*c54f35caSApple OSS Distributions 
68*c54f35caSApple OSS Distributions T_DECL(begin_end, "safe_allocation.begin_end") {
69*c54f35caSApple OSS Distributions 	tests<T>();
70*c54f35caSApple OSS Distributions 	tests<T const>();
71*c54f35caSApple OSS Distributions }
72