1*bbb1b6f9SApple OSS Distributions //
2*bbb1b6f9SApple OSS Distributions // Tests for
3*bbb1b6f9SApple OSS Distributions // bounded_ptr& operator++();
4*bbb1b6f9SApple OSS Distributions // bounded_ptr operator++(int);
5*bbb1b6f9SApple OSS Distributions // bounded_ptr& operator--();
6*bbb1b6f9SApple OSS Distributions // bounded_ptr operator--(int);
7*bbb1b6f9SApple OSS Distributions //
8*bbb1b6f9SApple OSS Distributions
9*bbb1b6f9SApple OSS Distributions #include <libkern/c++/bounded_ptr.h>
10*bbb1b6f9SApple OSS Distributions #include <array>
11*bbb1b6f9SApple OSS Distributions #include <darwintest.h>
12*bbb1b6f9SApple OSS Distributions #include <darwintest_utils.h>
13*bbb1b6f9SApple OSS Distributions #include "test_utils.h"
14*bbb1b6f9SApple OSS Distributions
15*bbb1b6f9SApple OSS Distributions #define _assert(...) T_ASSERT_TRUE((__VA_ARGS__), # __VA_ARGS__)
16*bbb1b6f9SApple OSS Distributions
17*bbb1b6f9SApple OSS Distributions struct T {
18*bbb1b6f9SApple OSS Distributions int i;
19*bbb1b6f9SApple OSS Distributions };
20*bbb1b6f9SApple OSS Distributions
21*bbb1b6f9SApple OSS Distributions template <typename T, typename QualT>
22*bbb1b6f9SApple OSS Distributions static void
tests()23*bbb1b6f9SApple OSS Distributions tests()
24*bbb1b6f9SApple OSS Distributions {
25*bbb1b6f9SApple OSS Distributions std::array<T, 5> array = {T{0}, T{1}, T{2}, T{3}, T{4}};
26*bbb1b6f9SApple OSS Distributions
27*bbb1b6f9SApple OSS Distributions {
28*bbb1b6f9SApple OSS Distributions // Test pre-increment and pre-decrement
29*bbb1b6f9SApple OSS Distributions test_bounded_ptr<QualT> ptr(array.begin(), array.begin(), array.end());
30*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[0]);
31*bbb1b6f9SApple OSS Distributions
32*bbb1b6f9SApple OSS Distributions {
33*bbb1b6f9SApple OSS Distributions auto& ref = ++ptr;
34*bbb1b6f9SApple OSS Distributions _assert(&ref == &ptr);
35*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[1]);
36*bbb1b6f9SApple OSS Distributions }
37*bbb1b6f9SApple OSS Distributions
38*bbb1b6f9SApple OSS Distributions {
39*bbb1b6f9SApple OSS Distributions auto& ref = ++ptr;
40*bbb1b6f9SApple OSS Distributions _assert(&ref == &ptr);
41*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[2]);
42*bbb1b6f9SApple OSS Distributions }
43*bbb1b6f9SApple OSS Distributions {
44*bbb1b6f9SApple OSS Distributions auto& ref = ++ptr;
45*bbb1b6f9SApple OSS Distributions _assert(&ref == &ptr);
46*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[3]);
47*bbb1b6f9SApple OSS Distributions }
48*bbb1b6f9SApple OSS Distributions {
49*bbb1b6f9SApple OSS Distributions auto& ref = ++ptr;
50*bbb1b6f9SApple OSS Distributions _assert(&ref == &ptr);
51*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[4]);
52*bbb1b6f9SApple OSS Distributions }
53*bbb1b6f9SApple OSS Distributions {
54*bbb1b6f9SApple OSS Distributions auto& ref = ++ptr;
55*bbb1b6f9SApple OSS Distributions _assert(&ref == &ptr);
56*bbb1b6f9SApple OSS Distributions // ptr is now one-past-last
57*bbb1b6f9SApple OSS Distributions }
58*bbb1b6f9SApple OSS Distributions {
59*bbb1b6f9SApple OSS Distributions auto& ref = --ptr;
60*bbb1b6f9SApple OSS Distributions _assert(&ref == &ptr);
61*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[4]);
62*bbb1b6f9SApple OSS Distributions }
63*bbb1b6f9SApple OSS Distributions {
64*bbb1b6f9SApple OSS Distributions auto& ref = --ptr;
65*bbb1b6f9SApple OSS Distributions _assert(&ref == &ptr);
66*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[3]);
67*bbb1b6f9SApple OSS Distributions }
68*bbb1b6f9SApple OSS Distributions {
69*bbb1b6f9SApple OSS Distributions auto& ref = --ptr;
70*bbb1b6f9SApple OSS Distributions _assert(&ref == &ptr);
71*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[2]);
72*bbb1b6f9SApple OSS Distributions }
73*bbb1b6f9SApple OSS Distributions {
74*bbb1b6f9SApple OSS Distributions auto& ref = --ptr;
75*bbb1b6f9SApple OSS Distributions _assert(&ref == &ptr);
76*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[1]);
77*bbb1b6f9SApple OSS Distributions }
78*bbb1b6f9SApple OSS Distributions {
79*bbb1b6f9SApple OSS Distributions auto& ref = --ptr;
80*bbb1b6f9SApple OSS Distributions _assert(&ref == &ptr);
81*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[0]);
82*bbb1b6f9SApple OSS Distributions }
83*bbb1b6f9SApple OSS Distributions }
84*bbb1b6f9SApple OSS Distributions {
85*bbb1b6f9SApple OSS Distributions // Test post-increment and post-decrement
86*bbb1b6f9SApple OSS Distributions test_bounded_ptr<QualT> ptr(array.begin(), array.begin(), array.end());
87*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[0]);
88*bbb1b6f9SApple OSS Distributions
89*bbb1b6f9SApple OSS Distributions {
90*bbb1b6f9SApple OSS Distributions auto prev = ptr++;
91*bbb1b6f9SApple OSS Distributions _assert(&*prev == &array[0]);
92*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[1]);
93*bbb1b6f9SApple OSS Distributions }
94*bbb1b6f9SApple OSS Distributions {
95*bbb1b6f9SApple OSS Distributions auto prev = ptr++;
96*bbb1b6f9SApple OSS Distributions _assert(&*prev == &array[1]);
97*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[2]);
98*bbb1b6f9SApple OSS Distributions }
99*bbb1b6f9SApple OSS Distributions {
100*bbb1b6f9SApple OSS Distributions auto prev = ptr++;
101*bbb1b6f9SApple OSS Distributions _assert(&*prev == &array[2]);
102*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[3]);
103*bbb1b6f9SApple OSS Distributions }
104*bbb1b6f9SApple OSS Distributions {
105*bbb1b6f9SApple OSS Distributions auto prev = ptr++;
106*bbb1b6f9SApple OSS Distributions _assert(&*prev == &array[3]);
107*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[4]);
108*bbb1b6f9SApple OSS Distributions }
109*bbb1b6f9SApple OSS Distributions {
110*bbb1b6f9SApple OSS Distributions auto prev = ptr++;
111*bbb1b6f9SApple OSS Distributions _assert(&*prev == &array[4]);
112*bbb1b6f9SApple OSS Distributions _assert(ptr == array.end());
113*bbb1b6f9SApple OSS Distributions }
114*bbb1b6f9SApple OSS Distributions {
115*bbb1b6f9SApple OSS Distributions auto prev = ptr--;
116*bbb1b6f9SApple OSS Distributions _assert(prev == array.end());
117*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[4]);
118*bbb1b6f9SApple OSS Distributions }
119*bbb1b6f9SApple OSS Distributions {
120*bbb1b6f9SApple OSS Distributions auto prev = ptr--;
121*bbb1b6f9SApple OSS Distributions _assert(&*prev == &array[4]);
122*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[3]);
123*bbb1b6f9SApple OSS Distributions }
124*bbb1b6f9SApple OSS Distributions {
125*bbb1b6f9SApple OSS Distributions auto prev = ptr--;
126*bbb1b6f9SApple OSS Distributions _assert(&*prev == &array[3]);
127*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[2]);
128*bbb1b6f9SApple OSS Distributions }
129*bbb1b6f9SApple OSS Distributions {
130*bbb1b6f9SApple OSS Distributions auto prev = ptr--;
131*bbb1b6f9SApple OSS Distributions _assert(&*prev == &array[2]);
132*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[1]);
133*bbb1b6f9SApple OSS Distributions }
134*bbb1b6f9SApple OSS Distributions {
135*bbb1b6f9SApple OSS Distributions auto prev = ptr--;
136*bbb1b6f9SApple OSS Distributions _assert(&*prev == &array[1]);
137*bbb1b6f9SApple OSS Distributions _assert(&*ptr == &array[0]);
138*bbb1b6f9SApple OSS Distributions }
139*bbb1b6f9SApple OSS Distributions }
140*bbb1b6f9SApple OSS Distributions }
141*bbb1b6f9SApple OSS Distributions
142*bbb1b6f9SApple OSS Distributions T_DECL(arith_inc_dec, "bounded_ptr.arith.inc_dec", T_META_TAG_VM_PREFERRED) {
143*bbb1b6f9SApple OSS Distributions tests<T, T>();
144*bbb1b6f9SApple OSS Distributions tests<T, T const>();
145*bbb1b6f9SApple OSS Distributions tests<T, T volatile>();
146*bbb1b6f9SApple OSS Distributions tests<T, T const volatile>();
147*bbb1b6f9SApple OSS Distributions }
148