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/EnumSet.h"
8 #include "mozilla/Vector.h"
10 #include <type_traits>
12 using namespace mozilla
;
37 enum class SmallEnum
: uint8_t {
42 enum class BigEnum
: uint64_t {
51 mDiomedeidae(ALBATROSS
),
52 mPetrelProcellariidae(GADFLY_PETREL
, TRUE_PETREL
),
53 mNonPetrelProcellariidae(FULMAR
, PRION
, SHEARWATER
),
54 mPetrels(GADFLY_PETREL
, TRUE_PETREL
, DIVING_PETREL
, STORM_PETREL
) {}
72 testInitializerListConstuctor();
77 void testEnumSetLayout() {
79 static_assert(sizeof(EnumSet
<SmallEnum
>) == sizeof(SmallEnum
),
80 "EnumSet should be no bigger than the enum by default");
81 static_assert(sizeof(EnumSet
<SmallEnum
, uint32_t>) == sizeof(uint32_t),
82 "EnumSet should be able to have its size overriden.");
83 static_assert(std::is_trivially_copyable_v
<EnumSet
<SmallEnum
>>,
84 "EnumSet should be lightweight outside of debug.");
89 MOZ_RELEASE_ASSERT(mAlcidae
.size() == 0);
90 MOZ_RELEASE_ASSERT(mDiomedeidae
.size() == 1);
91 MOZ_RELEASE_ASSERT(mPetrelProcellariidae
.size() == 2);
92 MOZ_RELEASE_ASSERT(mNonPetrelProcellariidae
.size() == 3);
93 MOZ_RELEASE_ASSERT(mPetrels
.size() == 4);
97 MOZ_RELEASE_ASSERT(!mPetrels
.contains(PENGUIN
));
98 MOZ_RELEASE_ASSERT(!mPetrels
.contains(ALBATROSS
));
99 MOZ_RELEASE_ASSERT(!mPetrels
.contains(FULMAR
));
100 MOZ_RELEASE_ASSERT(!mPetrels
.contains(PRION
));
101 MOZ_RELEASE_ASSERT(!mPetrels
.contains(SHEARWATER
));
102 MOZ_RELEASE_ASSERT(mPetrels
.contains(GADFLY_PETREL
));
103 MOZ_RELEASE_ASSERT(mPetrels
.contains(TRUE_PETREL
));
104 MOZ_RELEASE_ASSERT(mPetrels
.contains(DIVING_PETREL
));
105 MOZ_RELEASE_ASSERT(mPetrels
.contains(STORM_PETREL
));
106 MOZ_RELEASE_ASSERT(!mPetrels
.contains(PELICAN
));
107 MOZ_RELEASE_ASSERT(!mPetrels
.contains(GANNET
));
108 MOZ_RELEASE_ASSERT(!mPetrels
.contains(BOOBY
));
109 MOZ_RELEASE_ASSERT(!mPetrels
.contains(CORMORANT
));
110 MOZ_RELEASE_ASSERT(!mPetrels
.contains(FRIGATEBIRD
));
111 MOZ_RELEASE_ASSERT(!mPetrels
.contains(TROPICBIRD
));
112 MOZ_RELEASE_ASSERT(!mPetrels
.contains(SKUA
));
113 MOZ_RELEASE_ASSERT(!mPetrels
.contains(GULL
));
114 MOZ_RELEASE_ASSERT(!mPetrels
.contains(TERN
));
115 MOZ_RELEASE_ASSERT(!mPetrels
.contains(SKIMMER
));
116 MOZ_RELEASE_ASSERT(!mPetrels
.contains(AUK
));
120 EnumSet
<SeaBird
> likes
= mPetrels
;
121 likes
-= TRUE_PETREL
;
122 MOZ_RELEASE_ASSERT(mPetrels
.size() == 4);
123 MOZ_RELEASE_ASSERT(mPetrels
.contains(TRUE_PETREL
));
125 MOZ_RELEASE_ASSERT(likes
.size() == 3);
126 MOZ_RELEASE_ASSERT(likes
.contains(GADFLY_PETREL
));
127 MOZ_RELEASE_ASSERT(likes
.contains(DIVING_PETREL
));
128 MOZ_RELEASE_ASSERT(likes
.contains(STORM_PETREL
));
132 EnumSet
<SeaBird
> seen
= mPetrels
;
135 MOZ_RELEASE_ASSERT(mPetrels
.size() == 4);
136 MOZ_RELEASE_ASSERT(!mPetrels
.contains(CORMORANT
));
137 MOZ_RELEASE_ASSERT(seen
.size() == 5);
138 MOZ_RELEASE_ASSERT(seen
.contains(GADFLY_PETREL
));
139 MOZ_RELEASE_ASSERT(seen
.contains(TRUE_PETREL
));
140 MOZ_RELEASE_ASSERT(seen
.contains(DIVING_PETREL
));
141 MOZ_RELEASE_ASSERT(seen
.contains(STORM_PETREL
));
142 MOZ_RELEASE_ASSERT(seen
.contains(CORMORANT
));
146 EnumSet
<SeaBird
> seen
= mPetrels
+ CORMORANT
+ STORM_PETREL
;
147 MOZ_RELEASE_ASSERT(mPetrels
.size() == 4);
148 MOZ_RELEASE_ASSERT(!mPetrels
.contains(CORMORANT
));
149 MOZ_RELEASE_ASSERT(seen
.size() == 5);
150 MOZ_RELEASE_ASSERT(seen
.contains(GADFLY_PETREL
));
151 MOZ_RELEASE_ASSERT(seen
.contains(TRUE_PETREL
));
152 MOZ_RELEASE_ASSERT(seen
.contains(DIVING_PETREL
));
153 MOZ_RELEASE_ASSERT(seen
.contains(STORM_PETREL
));
154 MOZ_RELEASE_ASSERT(seen
.contains(CORMORANT
));
158 EnumSet
<SeaBird
> procellariidae
;
159 procellariidae
+= mPetrelProcellariidae
;
160 procellariidae
+= mNonPetrelProcellariidae
;
161 MOZ_RELEASE_ASSERT(procellariidae
.size() == 5);
163 // Both procellariidae and mPetrels include GADFLY_PERTEL and TRUE_PETREL
164 EnumSet
<SeaBird
> procellariiformes
;
165 procellariiformes
+= mDiomedeidae
;
166 procellariiformes
+= procellariidae
;
167 procellariiformes
+= mPetrels
;
168 MOZ_RELEASE_ASSERT(procellariiformes
.size() == 8);
172 EnumSet
<SeaBird
> procellariidae
=
173 mPetrelProcellariidae
+ mNonPetrelProcellariidae
;
174 MOZ_RELEASE_ASSERT(procellariidae
.size() == 5);
176 // Both procellariidae and mPetrels include GADFLY_PETREL and TRUE_PETREL
177 EnumSet
<SeaBird
> procellariiformes
=
178 mDiomedeidae
+ procellariidae
+ mPetrels
;
179 MOZ_RELEASE_ASSERT(procellariiformes
.size() == 8);
182 void testRemoveFrom() {
183 EnumSet
<SeaBird
> likes
= mPetrels
;
184 likes
-= TRUE_PETREL
;
185 likes
-= DIVING_PETREL
;
186 MOZ_RELEASE_ASSERT(likes
.size() == 2);
187 MOZ_RELEASE_ASSERT(likes
.contains(GADFLY_PETREL
));
188 MOZ_RELEASE_ASSERT(likes
.contains(STORM_PETREL
));
192 EnumSet
<SeaBird
> likes
= mPetrels
- TRUE_PETREL
- DIVING_PETREL
;
193 MOZ_RELEASE_ASSERT(likes
.size() == 2);
194 MOZ_RELEASE_ASSERT(likes
.contains(GADFLY_PETREL
));
195 MOZ_RELEASE_ASSERT(likes
.contains(STORM_PETREL
));
198 void testRemoveAllFrom() {
199 EnumSet
<SeaBird
> likes
= mPetrels
;
200 likes
-= mPetrelProcellariidae
;
201 MOZ_RELEASE_ASSERT(likes
.size() == 2);
202 MOZ_RELEASE_ASSERT(likes
.contains(DIVING_PETREL
));
203 MOZ_RELEASE_ASSERT(likes
.contains(STORM_PETREL
));
206 void testRemoveAll() {
207 EnumSet
<SeaBird
> likes
= mPetrels
- mPetrelProcellariidae
;
208 MOZ_RELEASE_ASSERT(likes
.size() == 2);
209 MOZ_RELEASE_ASSERT(likes
.contains(DIVING_PETREL
));
210 MOZ_RELEASE_ASSERT(likes
.contains(STORM_PETREL
));
213 void testIntersect() {
214 EnumSet
<SeaBird
> likes
= mPetrels
;
215 likes
&= mPetrelProcellariidae
;
216 MOZ_RELEASE_ASSERT(likes
.size() == 2);
217 MOZ_RELEASE_ASSERT(likes
.contains(GADFLY_PETREL
));
218 MOZ_RELEASE_ASSERT(likes
.contains(TRUE_PETREL
));
221 void testInsersection() {
222 EnumSet
<SeaBird
> likes
= mPetrels
& mPetrelProcellariidae
;
223 MOZ_RELEASE_ASSERT(likes
.size() == 2);
224 MOZ_RELEASE_ASSERT(likes
.contains(GADFLY_PETREL
));
225 MOZ_RELEASE_ASSERT(likes
.contains(TRUE_PETREL
));
228 void testEquality() {
229 EnumSet
<SeaBird
> likes
= mPetrels
& mPetrelProcellariidae
;
230 MOZ_RELEASE_ASSERT(likes
== EnumSet
<SeaBird
>(GADFLY_PETREL
, TRUE_PETREL
));
233 void testDuplicates() {
234 EnumSet
<SeaBird
> likes
= mPetrels
;
235 likes
+= GADFLY_PETREL
;
236 likes
+= TRUE_PETREL
;
237 likes
+= DIVING_PETREL
;
238 likes
+= STORM_PETREL
;
239 MOZ_RELEASE_ASSERT(likes
.size() == 4);
240 MOZ_RELEASE_ASSERT(likes
== mPetrels
);
243 void testIteration() {
244 EnumSet
<SeaBird
> birds
;
247 for (auto bird
: birds
) {
248 MOZ_RELEASE_ASSERT(vec
.append(bird
));
250 MOZ_RELEASE_ASSERT(vec
.length() == 0);
252 birds
+= DIVING_PETREL
;
253 birds
+= GADFLY_PETREL
;
254 birds
+= STORM_PETREL
;
255 birds
+= TRUE_PETREL
;
256 for (auto bird
: birds
) {
257 MOZ_RELEASE_ASSERT(vec
.append(bird
));
260 MOZ_RELEASE_ASSERT(vec
.length() == 4);
261 MOZ_RELEASE_ASSERT(vec
[0] == GADFLY_PETREL
);
262 MOZ_RELEASE_ASSERT(vec
[1] == TRUE_PETREL
);
263 MOZ_RELEASE_ASSERT(vec
[2] == DIVING_PETREL
);
264 MOZ_RELEASE_ASSERT(vec
[3] == STORM_PETREL
);
267 void testInitializerListConstuctor() {
268 EnumSet
<SeaBird
> empty
{};
269 MOZ_RELEASE_ASSERT(empty
.size() == 0);
271 EnumSet
<SeaBird
> someBirds
{SKIMMER
, GULL
, BOOBY
};
272 MOZ_RELEASE_ASSERT(someBirds
.size() == 3);
273 MOZ_RELEASE_ASSERT(someBirds
.contains(SKIMMER
));
274 MOZ_RELEASE_ASSERT(someBirds
.contains(GULL
));
275 MOZ_RELEASE_ASSERT(someBirds
.contains(BOOBY
));
279 EnumSet
<BigEnum
> set
;
281 MOZ_RELEASE_ASSERT(set
.serialize() ==
282 (uint64_t(1) << uint64_t(BigEnum::Bar
)));
285 EnumSet
<SeaBird
> mAlcidae
;
286 EnumSet
<SeaBird
> mDiomedeidae
;
287 EnumSet
<SeaBird
> mPetrelProcellariidae
;
288 EnumSet
<SeaBird
> mNonPetrelProcellariidae
;
289 EnumSet
<SeaBird
> mPetrels
;