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/BitSet.h"
8 #include "mozilla/EnumSet.h"
9 #include "mozilla/Vector.h"
11 #include <type_traits>
13 using namespace mozilla
;
40 enum class SmallEnum
: uint8_t {
45 enum class BigEnum
: uint64_t {
50 template <typename Storage
= typename
std::make_unsigned
<
51 typename
std::underlying_type
<SeaBird
>::type
>::type
>
54 using EnumSetSeaBird
= EnumSet
<SeaBird
, Storage
>;
58 mDiomedeidae(ALBATROSS
),
59 mPetrelProcellariidae(GADFLY_PETREL
, TRUE_PETREL
),
60 mNonPetrelProcellariidae(FULMAR
, PRION
, SHEARWATER
),
61 mPetrels(GADFLY_PETREL
, TRUE_PETREL
, DIVING_PETREL
, STORM_PETREL
) {}
79 testInitializerListConstuctor();
84 void testEnumSetLayout() {
86 static_assert(sizeof(EnumSet
<SmallEnum
>) == sizeof(SmallEnum
),
87 "EnumSet should be no bigger than the enum by default");
88 static_assert(sizeof(EnumSet
<SmallEnum
, uint32_t>) == sizeof(uint32_t),
89 "EnumSet should be able to have its size overriden.");
90 static_assert(std::is_trivially_copyable_v
<EnumSet
<SmallEnum
>>,
91 "EnumSet should be lightweight outside of debug.");
96 MOZ_RELEASE_ASSERT(mAlcidae
.size() == 0);
97 MOZ_RELEASE_ASSERT(mDiomedeidae
.size() == 1);
98 MOZ_RELEASE_ASSERT(mPetrelProcellariidae
.size() == 2);
99 MOZ_RELEASE_ASSERT(mNonPetrelProcellariidae
.size() == 3);
100 MOZ_RELEASE_ASSERT(mPetrels
.size() == 4);
103 void testContains() {
104 MOZ_RELEASE_ASSERT(!mPetrels
.contains(PENGUIN
));
105 MOZ_RELEASE_ASSERT(!mPetrels
.contains(ALBATROSS
));
106 MOZ_RELEASE_ASSERT(!mPetrels
.contains(FULMAR
));
107 MOZ_RELEASE_ASSERT(!mPetrels
.contains(PRION
));
108 MOZ_RELEASE_ASSERT(!mPetrels
.contains(SHEARWATER
));
109 MOZ_RELEASE_ASSERT(mPetrels
.contains(GADFLY_PETREL
));
110 MOZ_RELEASE_ASSERT(mPetrels
.contains(TRUE_PETREL
));
111 MOZ_RELEASE_ASSERT(mPetrels
.contains(DIVING_PETREL
));
112 MOZ_RELEASE_ASSERT(mPetrels
.contains(STORM_PETREL
));
113 MOZ_RELEASE_ASSERT(!mPetrels
.contains(PELICAN
));
114 MOZ_RELEASE_ASSERT(!mPetrels
.contains(GANNET
));
115 MOZ_RELEASE_ASSERT(!mPetrels
.contains(BOOBY
));
116 MOZ_RELEASE_ASSERT(!mPetrels
.contains(CORMORANT
));
117 MOZ_RELEASE_ASSERT(!mPetrels
.contains(FRIGATEBIRD
));
118 MOZ_RELEASE_ASSERT(!mPetrels
.contains(TROPICBIRD
));
119 MOZ_RELEASE_ASSERT(!mPetrels
.contains(SKUA
));
120 MOZ_RELEASE_ASSERT(!mPetrels
.contains(GULL
));
121 MOZ_RELEASE_ASSERT(!mPetrels
.contains(TERN
));
122 MOZ_RELEASE_ASSERT(!mPetrels
.contains(SKIMMER
));
123 MOZ_RELEASE_ASSERT(!mPetrels
.contains(AUK
));
127 EnumSetSeaBird likes
= mPetrels
;
128 likes
-= TRUE_PETREL
;
129 MOZ_RELEASE_ASSERT(mPetrels
.size() == 4);
130 MOZ_RELEASE_ASSERT(mPetrels
.contains(TRUE_PETREL
));
132 MOZ_RELEASE_ASSERT(likes
.size() == 3);
133 MOZ_RELEASE_ASSERT(likes
.contains(GADFLY_PETREL
));
134 MOZ_RELEASE_ASSERT(likes
.contains(DIVING_PETREL
));
135 MOZ_RELEASE_ASSERT(likes
.contains(STORM_PETREL
));
139 EnumSetSeaBird seen
= mPetrels
;
142 MOZ_RELEASE_ASSERT(mPetrels
.size() == 4);
143 MOZ_RELEASE_ASSERT(!mPetrels
.contains(CORMORANT
));
144 MOZ_RELEASE_ASSERT(seen
.size() == 5);
145 MOZ_RELEASE_ASSERT(seen
.contains(GADFLY_PETREL
));
146 MOZ_RELEASE_ASSERT(seen
.contains(TRUE_PETREL
));
147 MOZ_RELEASE_ASSERT(seen
.contains(DIVING_PETREL
));
148 MOZ_RELEASE_ASSERT(seen
.contains(STORM_PETREL
));
149 MOZ_RELEASE_ASSERT(seen
.contains(CORMORANT
));
153 EnumSetSeaBird seen
= mPetrels
+ CORMORANT
+ STORM_PETREL
;
154 MOZ_RELEASE_ASSERT(mPetrels
.size() == 4);
155 MOZ_RELEASE_ASSERT(!mPetrels
.contains(CORMORANT
));
156 MOZ_RELEASE_ASSERT(seen
.size() == 5);
157 MOZ_RELEASE_ASSERT(seen
.contains(GADFLY_PETREL
));
158 MOZ_RELEASE_ASSERT(seen
.contains(TRUE_PETREL
));
159 MOZ_RELEASE_ASSERT(seen
.contains(DIVING_PETREL
));
160 MOZ_RELEASE_ASSERT(seen
.contains(STORM_PETREL
));
161 MOZ_RELEASE_ASSERT(seen
.contains(CORMORANT
));
165 EnumSetSeaBird procellariidae
;
166 procellariidae
+= mPetrelProcellariidae
;
167 procellariidae
+= mNonPetrelProcellariidae
;
168 MOZ_RELEASE_ASSERT(procellariidae
.size() == 5);
170 // Both procellariidae and mPetrels include GADFLY_PERTEL and TRUE_PETREL
171 EnumSetSeaBird procellariiformes
;
172 procellariiformes
+= mDiomedeidae
;
173 procellariiformes
+= procellariidae
;
174 procellariiformes
+= mPetrels
;
175 MOZ_RELEASE_ASSERT(procellariiformes
.size() == 8);
179 EnumSetSeaBird procellariidae
=
180 mPetrelProcellariidae
+ mNonPetrelProcellariidae
;
181 MOZ_RELEASE_ASSERT(procellariidae
.size() == 5);
183 // Both procellariidae and mPetrels include GADFLY_PETREL and TRUE_PETREL
184 EnumSetSeaBird procellariiformes
= mDiomedeidae
+ procellariidae
+ mPetrels
;
185 MOZ_RELEASE_ASSERT(procellariiformes
.size() == 8);
188 void testRemoveFrom() {
189 EnumSetSeaBird likes
= mPetrels
;
190 likes
-= TRUE_PETREL
;
191 likes
-= DIVING_PETREL
;
192 MOZ_RELEASE_ASSERT(likes
.size() == 2);
193 MOZ_RELEASE_ASSERT(likes
.contains(GADFLY_PETREL
));
194 MOZ_RELEASE_ASSERT(likes
.contains(STORM_PETREL
));
198 EnumSetSeaBird likes
= mPetrels
- TRUE_PETREL
- DIVING_PETREL
;
199 MOZ_RELEASE_ASSERT(likes
.size() == 2);
200 MOZ_RELEASE_ASSERT(likes
.contains(GADFLY_PETREL
));
201 MOZ_RELEASE_ASSERT(likes
.contains(STORM_PETREL
));
204 void testRemoveAllFrom() {
205 EnumSetSeaBird likes
= mPetrels
;
206 likes
-= mPetrelProcellariidae
;
207 MOZ_RELEASE_ASSERT(likes
.size() == 2);
208 MOZ_RELEASE_ASSERT(likes
.contains(DIVING_PETREL
));
209 MOZ_RELEASE_ASSERT(likes
.contains(STORM_PETREL
));
212 void testRemoveAll() {
213 EnumSetSeaBird likes
= mPetrels
- mPetrelProcellariidae
;
214 MOZ_RELEASE_ASSERT(likes
.size() == 2);
215 MOZ_RELEASE_ASSERT(likes
.contains(DIVING_PETREL
));
216 MOZ_RELEASE_ASSERT(likes
.contains(STORM_PETREL
));
219 void testIntersect() {
220 EnumSetSeaBird likes
= mPetrels
;
221 likes
&= mPetrelProcellariidae
;
222 MOZ_RELEASE_ASSERT(likes
.size() == 2);
223 MOZ_RELEASE_ASSERT(likes
.contains(GADFLY_PETREL
));
224 MOZ_RELEASE_ASSERT(likes
.contains(TRUE_PETREL
));
227 void testInsersection() {
228 EnumSetSeaBird likes
= mPetrels
& mPetrelProcellariidae
;
229 MOZ_RELEASE_ASSERT(likes
.size() == 2);
230 MOZ_RELEASE_ASSERT(likes
.contains(GADFLY_PETREL
));
231 MOZ_RELEASE_ASSERT(likes
.contains(TRUE_PETREL
));
234 void testEquality() {
235 EnumSetSeaBird likes
= mPetrels
& mPetrelProcellariidae
;
236 MOZ_RELEASE_ASSERT(likes
== EnumSetSeaBird(GADFLY_PETREL
, TRUE_PETREL
));
239 void testDuplicates() {
240 EnumSetSeaBird likes
= mPetrels
;
241 likes
+= GADFLY_PETREL
;
242 likes
+= TRUE_PETREL
;
243 likes
+= DIVING_PETREL
;
244 likes
+= STORM_PETREL
;
245 MOZ_RELEASE_ASSERT(likes
.size() == 4);
246 MOZ_RELEASE_ASSERT(likes
== mPetrels
);
249 void testIteration() {
250 EnumSetSeaBird birds
;
253 for (auto bird
: birds
) {
254 MOZ_RELEASE_ASSERT(vec
.append(bird
));
256 MOZ_RELEASE_ASSERT(vec
.length() == 0);
258 birds
+= DIVING_PETREL
;
259 birds
+= GADFLY_PETREL
;
260 birds
+= STORM_PETREL
;
261 birds
+= TRUE_PETREL
;
262 for (auto bird
: birds
) {
263 MOZ_RELEASE_ASSERT(vec
.append(bird
));
266 MOZ_RELEASE_ASSERT(vec
.length() == 4);
267 MOZ_RELEASE_ASSERT(vec
[0] == GADFLY_PETREL
);
268 MOZ_RELEASE_ASSERT(vec
[1] == TRUE_PETREL
);
269 MOZ_RELEASE_ASSERT(vec
[2] == DIVING_PETREL
);
270 MOZ_RELEASE_ASSERT(vec
[3] == STORM_PETREL
);
273 void testInitializerListConstuctor() {
274 EnumSetSeaBird empty
{};
275 MOZ_RELEASE_ASSERT(empty
.size() == 0);
276 MOZ_RELEASE_ASSERT(empty
.isEmpty());
278 EnumSetSeaBird someBirds
{SKIMMER
, GULL
, BOOBY
};
279 MOZ_RELEASE_ASSERT(someBirds
.size() == 3);
280 MOZ_RELEASE_ASSERT(someBirds
.contains(SKIMMER
));
281 MOZ_RELEASE_ASSERT(someBirds
.contains(GULL
));
282 MOZ_RELEASE_ASSERT(someBirds
.contains(BOOBY
));
286 EnumSet
<BigEnum
> set
;
288 MOZ_RELEASE_ASSERT(set
.serialize() ==
289 (uint64_t(1) << uint64_t(BigEnum::Bar
)));
292 EnumSetSeaBird mAlcidae
;
293 EnumSetSeaBird mDiomedeidae
;
294 EnumSetSeaBird mPetrelProcellariidae
;
295 EnumSetSeaBird mNonPetrelProcellariidae
;
296 EnumSetSeaBird mPetrels
;
300 EnumSetSuite
<uint32_t> suite1
;
303 EnumSetSuite
<BitSet
<SEA_BIRD_COUNT
>> suite2
;