1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/SmallPointerArray.h"
9 #define PTR1 (void*)0x4
10 #define PTR2 (void*)0x5
11 #define PTR3 (void*)0x6
13 // We explicitly test sizes up to 3 here, as that is when SmallPointerArray<>
14 // switches to the storage method used for larger arrays.
15 void TestArrayManipulation() {
16 using namespace mozilla
;
17 SmallPointerArray
<void> testArray
;
19 MOZ_RELEASE_ASSERT(testArray
.Length() == 0);
20 MOZ_RELEASE_ASSERT(sizeof(testArray
) == 2 * sizeof(void*));
21 MOZ_RELEASE_ASSERT(!testArray
.Contains(PTR1
));
23 testArray
.AppendElement(PTR1
);
25 MOZ_RELEASE_ASSERT(testArray
.Length() == 1);
26 MOZ_RELEASE_ASSERT(testArray
[0] == PTR1
);
27 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR1
);
28 MOZ_RELEASE_ASSERT(testArray
.Contains(PTR1
));
30 testArray
.AppendElement(PTR2
);
32 MOZ_RELEASE_ASSERT(testArray
.Length() == 2);
33 MOZ_RELEASE_ASSERT(testArray
[0] == PTR1
);
34 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR1
);
35 MOZ_RELEASE_ASSERT(testArray
[1] == PTR2
);
36 MOZ_RELEASE_ASSERT(testArray
.ElementAt(1) == PTR2
);
37 MOZ_RELEASE_ASSERT(testArray
.Contains(PTR2
));
39 MOZ_RELEASE_ASSERT(testArray
.RemoveElement(PTR1
));
40 MOZ_RELEASE_ASSERT(!testArray
.RemoveElement(PTR1
));
42 MOZ_RELEASE_ASSERT(testArray
.Length() == 1);
43 MOZ_RELEASE_ASSERT(testArray
[0] == PTR2
);
44 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR2
);
45 MOZ_RELEASE_ASSERT(!testArray
.Contains(PTR1
));
47 testArray
.AppendElement(PTR1
);
49 MOZ_RELEASE_ASSERT(testArray
.Length() == 2);
50 MOZ_RELEASE_ASSERT(testArray
[0] == PTR2
);
51 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR2
);
52 MOZ_RELEASE_ASSERT(testArray
[1] == PTR1
);
53 MOZ_RELEASE_ASSERT(testArray
.ElementAt(1) == PTR1
);
54 MOZ_RELEASE_ASSERT(testArray
.Contains(PTR1
));
56 testArray
.AppendElement(PTR3
);
58 MOZ_RELEASE_ASSERT(testArray
.Length() == 3);
59 MOZ_RELEASE_ASSERT(testArray
[0] == PTR2
);
60 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR2
);
61 MOZ_RELEASE_ASSERT(testArray
[1] == PTR1
);
62 MOZ_RELEASE_ASSERT(testArray
.ElementAt(1) == PTR1
);
63 MOZ_RELEASE_ASSERT(testArray
[2] == PTR3
);
64 MOZ_RELEASE_ASSERT(testArray
.ElementAt(2) == PTR3
);
65 MOZ_RELEASE_ASSERT(testArray
.Contains(PTR3
));
67 MOZ_RELEASE_ASSERT(testArray
.RemoveElement(PTR1
));
69 MOZ_RELEASE_ASSERT(testArray
.Length() == 2);
70 MOZ_RELEASE_ASSERT(testArray
[0] == PTR2
);
71 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR2
);
72 MOZ_RELEASE_ASSERT(testArray
[1] == PTR3
);
73 MOZ_RELEASE_ASSERT(testArray
.ElementAt(1) == PTR3
);
75 MOZ_RELEASE_ASSERT(testArray
.RemoveElement(PTR2
));
77 MOZ_RELEASE_ASSERT(testArray
.Length() == 1);
78 MOZ_RELEASE_ASSERT(testArray
[0] == PTR3
);
79 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR3
);
81 MOZ_RELEASE_ASSERT(testArray
.RemoveElement(PTR3
));
83 MOZ_RELEASE_ASSERT(testArray
.Length() == 0);
87 MOZ_RELEASE_ASSERT(testArray
.Length() == 0);
89 testArray
.AppendElement(PTR1
);
91 MOZ_RELEASE_ASSERT(testArray
.Length() == 1);
92 MOZ_RELEASE_ASSERT(testArray
[0] == PTR1
);
93 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR1
);
95 testArray
.AppendElement(PTR2
);
97 MOZ_RELEASE_ASSERT(testArray
.Length() == 2);
98 MOZ_RELEASE_ASSERT(testArray
[0] == PTR1
);
99 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR1
);
100 MOZ_RELEASE_ASSERT(testArray
[1] == PTR2
);
101 MOZ_RELEASE_ASSERT(testArray
.ElementAt(1) == PTR2
);
103 MOZ_RELEASE_ASSERT(testArray
.RemoveElement(PTR2
));
105 MOZ_RELEASE_ASSERT(testArray
.Length() == 1);
106 MOZ_RELEASE_ASSERT(testArray
[0] == PTR1
);
107 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR1
);
109 MOZ_RELEASE_ASSERT(!testArray
.RemoveElement(PTR3
));
111 MOZ_RELEASE_ASSERT(testArray
.Length() == 1);
112 MOZ_RELEASE_ASSERT(testArray
[0] == PTR1
);
113 MOZ_RELEASE_ASSERT(testArray
.ElementAt(0) == PTR1
);
116 void TestRangeBasedLoops() {
117 using namespace mozilla
;
118 SmallPointerArray
<void> testArray
;
119 void* verification
[3];
120 uint32_t entries
= 0;
122 for (void* test
: testArray
) {
123 verification
[entries
++] = test
;
126 MOZ_RELEASE_ASSERT(entries
== 0);
128 testArray
.AppendElement(PTR1
);
130 for (void* test
: testArray
) {
131 verification
[entries
++] = test
;
134 MOZ_RELEASE_ASSERT(entries
== 1);
135 MOZ_RELEASE_ASSERT(verification
[0] == PTR1
);
139 testArray
.AppendElement(PTR2
);
141 for (void* test
: testArray
) {
142 verification
[entries
++] = test
;
145 MOZ_RELEASE_ASSERT(entries
== 2);
146 MOZ_RELEASE_ASSERT(verification
[0] == PTR1
);
147 MOZ_RELEASE_ASSERT(verification
[1] == PTR2
);
151 testArray
.RemoveElement(PTR1
);
153 for (void* test
: testArray
) {
154 verification
[entries
++] = test
;
157 MOZ_RELEASE_ASSERT(entries
== 1);
158 MOZ_RELEASE_ASSERT(verification
[0] == PTR2
);
162 testArray
.AppendElement(PTR1
);
163 testArray
.AppendElement(PTR3
);
165 for (void* test
: testArray
) {
166 verification
[entries
++] = test
;
169 MOZ_RELEASE_ASSERT(entries
== 3);
170 MOZ_RELEASE_ASSERT(verification
[0] == PTR2
);
171 MOZ_RELEASE_ASSERT(verification
[1] == PTR1
);
172 MOZ_RELEASE_ASSERT(verification
[2] == PTR3
);
176 testArray
.RemoveElement(PTR1
);
177 testArray
.RemoveElement(PTR2
);
178 testArray
.RemoveElement(PTR3
);
180 for (void* test
: testArray
) {
181 verification
[entries
++] = test
;
184 MOZ_RELEASE_ASSERT(entries
== 0);
188 for (void* test
: testArray
) {
189 verification
[entries
++] = test
;
192 MOZ_RELEASE_ASSERT(entries
== 0);
196 using namespace mozilla
;
198 SmallPointerArray
<void> testArray
;
199 testArray
.AppendElement(PTR1
);
200 testArray
.AppendElement(PTR2
);
202 SmallPointerArray
<void> moved
= std::move(testArray
);
204 MOZ_RELEASE_ASSERT(testArray
.IsEmpty());
205 MOZ_RELEASE_ASSERT(moved
.Length() == 2);
206 MOZ_RELEASE_ASSERT(moved
[0] == PTR1
);
207 MOZ_RELEASE_ASSERT(moved
[1] == PTR2
);
210 moved
.AppendElement(PTR3
);
212 SmallPointerArray
<void> another
= std::move(moved
);
214 MOZ_RELEASE_ASSERT(testArray
.IsEmpty());
215 MOZ_RELEASE_ASSERT(moved
.IsEmpty());
216 MOZ_RELEASE_ASSERT(another
.Length() == 3);
217 MOZ_RELEASE_ASSERT(another
[0] == PTR1
);
218 MOZ_RELEASE_ASSERT(another
[1] == PTR2
);
219 MOZ_RELEASE_ASSERT(another
[2] == PTR3
);
222 testArray
= std::move(another
);
224 MOZ_RELEASE_ASSERT(moved
.IsEmpty());
225 MOZ_RELEASE_ASSERT(another
.IsEmpty());
226 MOZ_RELEASE_ASSERT(testArray
.Length() == 3);
227 MOZ_RELEASE_ASSERT(testArray
[0] == PTR1
);
228 MOZ_RELEASE_ASSERT(testArray
[1] == PTR2
);
229 MOZ_RELEASE_ASSERT(testArray
[2] == PTR3
);
233 TestArrayManipulation();
234 TestRangeBasedLoops();