1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "mozilla/Assertions.h"
7 #include "mozilla/EnumTypeTraits.h"
11 using namespace mozilla
;
13 /* Feature check for EnumTypeFitsWithin. */
15 #define MAKE_FIXED_EMUM_FOR_TYPE(IntType) \
16 enum FixedEnumFor_##IntType : IntType{ \
22 template <typename EnumType
, typename IntType
>
23 static void TestShouldFit() {
24 static_assert(EnumTypeFitsWithin
<EnumType
, IntType
>::value
,
25 "Should fit within exact/promoted integral type");
28 template <typename EnumType
, typename IntType
>
29 static void TestShouldNotFit() {
30 static_assert(!EnumTypeFitsWithin
<EnumType
, IntType
>::value
,
31 "Should not fit within");
34 void TestFitForTypes() {
36 MAKE_FIXED_EMUM_FOR_TYPE(int8_t);
37 TestShouldFit
<FixedEnumFor_int8_t
, int8_t>();
38 TestShouldFit
<FixedEnumFor_int8_t
, int16_t>();
39 TestShouldFit
<FixedEnumFor_int8_t
, int32_t>();
40 TestShouldFit
<FixedEnumFor_int8_t
, int64_t>();
42 TestShouldNotFit
<FixedEnumFor_int8_t
, uint8_t>();
43 TestShouldNotFit
<FixedEnumFor_int8_t
, uint16_t>();
44 TestShouldNotFit
<FixedEnumFor_int8_t
, uint32_t>();
45 TestShouldNotFit
<FixedEnumFor_int8_t
, uint64_t>();
48 MAKE_FIXED_EMUM_FOR_TYPE(uint8_t);
49 TestShouldFit
<FixedEnumFor_uint8_t
, uint8_t>();
50 TestShouldFit
<FixedEnumFor_uint8_t
, uint16_t>();
51 TestShouldFit
<FixedEnumFor_uint8_t
, uint32_t>();
52 TestShouldFit
<FixedEnumFor_uint8_t
, uint64_t>();
54 TestShouldNotFit
<FixedEnumFor_uint8_t
, int8_t>();
55 TestShouldFit
<FixedEnumFor_uint8_t
, int16_t>();
56 TestShouldFit
<FixedEnumFor_uint8_t
, int32_t>();
57 TestShouldFit
<FixedEnumFor_uint8_t
, int64_t>();
60 MAKE_FIXED_EMUM_FOR_TYPE(int16_t);
61 TestShouldNotFit
<FixedEnumFor_int16_t
, int8_t>();
62 TestShouldFit
<FixedEnumFor_int16_t
, int16_t>();
63 TestShouldFit
<FixedEnumFor_int16_t
, int32_t>();
64 TestShouldFit
<FixedEnumFor_int16_t
, int64_t>();
66 TestShouldNotFit
<FixedEnumFor_int16_t
, uint8_t>();
67 TestShouldNotFit
<FixedEnumFor_int16_t
, uint16_t>();
68 TestShouldNotFit
<FixedEnumFor_int16_t
, uint32_t>();
69 TestShouldNotFit
<FixedEnumFor_int16_t
, uint64_t>();
72 MAKE_FIXED_EMUM_FOR_TYPE(uint16_t);
73 TestShouldNotFit
<FixedEnumFor_uint16_t
, uint8_t>();
74 TestShouldFit
<FixedEnumFor_uint16_t
, uint16_t>();
75 TestShouldFit
<FixedEnumFor_uint16_t
, uint32_t>();
76 TestShouldFit
<FixedEnumFor_uint16_t
, uint64_t>();
78 TestShouldNotFit
<FixedEnumFor_uint16_t
, int8_t>();
79 TestShouldNotFit
<FixedEnumFor_uint16_t
, int16_t>();
80 TestShouldFit
<FixedEnumFor_uint16_t
, int32_t>();
81 TestShouldFit
<FixedEnumFor_uint16_t
, int64_t>();
84 MAKE_FIXED_EMUM_FOR_TYPE(int32_t);
85 TestShouldNotFit
<FixedEnumFor_int32_t
, int8_t>();
86 TestShouldNotFit
<FixedEnumFor_int32_t
, int16_t>();
87 TestShouldFit
<FixedEnumFor_int32_t
, int32_t>();
88 TestShouldFit
<FixedEnumFor_int32_t
, int64_t>();
90 TestShouldNotFit
<FixedEnumFor_int32_t
, uint8_t>();
91 TestShouldNotFit
<FixedEnumFor_int32_t
, uint16_t>();
92 TestShouldNotFit
<FixedEnumFor_int32_t
, uint32_t>();
93 TestShouldNotFit
<FixedEnumFor_int32_t
, uint64_t>();
96 MAKE_FIXED_EMUM_FOR_TYPE(uint32_t);
97 TestShouldNotFit
<FixedEnumFor_uint32_t
, uint8_t>();
98 TestShouldNotFit
<FixedEnumFor_uint32_t
, uint16_t>();
99 TestShouldFit
<FixedEnumFor_uint32_t
, uint32_t>();
100 TestShouldFit
<FixedEnumFor_uint32_t
, uint64_t>();
102 TestShouldNotFit
<FixedEnumFor_uint32_t
, int8_t>();
103 TestShouldNotFit
<FixedEnumFor_uint32_t
, int16_t>();
104 TestShouldNotFit
<FixedEnumFor_uint32_t
, int32_t>();
105 TestShouldFit
<FixedEnumFor_uint32_t
, int64_t>();
108 MAKE_FIXED_EMUM_FOR_TYPE(int64_t);
109 TestShouldNotFit
<FixedEnumFor_int64_t
, int8_t>();
110 TestShouldNotFit
<FixedEnumFor_int64_t
, int16_t>();
111 TestShouldNotFit
<FixedEnumFor_int64_t
, int32_t>();
112 TestShouldFit
<FixedEnumFor_int64_t
, int64_t>();
114 TestShouldNotFit
<FixedEnumFor_int64_t
, uint8_t>();
115 TestShouldNotFit
<FixedEnumFor_int64_t
, uint16_t>();
116 TestShouldNotFit
<FixedEnumFor_int64_t
, uint32_t>();
117 TestShouldNotFit
<FixedEnumFor_int64_t
, uint64_t>();
119 // check for uint64_t
120 MAKE_FIXED_EMUM_FOR_TYPE(uint64_t);
121 TestShouldNotFit
<FixedEnumFor_uint64_t
, uint8_t>();
122 TestShouldNotFit
<FixedEnumFor_uint64_t
, uint16_t>();
123 TestShouldNotFit
<FixedEnumFor_uint64_t
, uint32_t>();
124 TestShouldFit
<FixedEnumFor_uint64_t
, uint64_t>();
126 TestShouldNotFit
<FixedEnumFor_uint64_t
, int8_t>();
127 TestShouldNotFit
<FixedEnumFor_uint64_t
, int16_t>();
128 TestShouldNotFit
<FixedEnumFor_uint64_t
, int32_t>();
129 TestShouldNotFit
<FixedEnumFor_uint64_t
, int64_t>();
134 template <typename T
, typename U
>
135 static constexpr void AssertSameTypeAndValue(T a
, U b
) {
136 static_assert(std::is_same_v
<T
, U
>);
140 void TestUnderlyingValue() {
141 enum class Pet
: int16_t { Cat
, Dog
, Fish
};
142 enum class Plant
{ Flower
, Tree
, Vine
};
144 AssertSameTypeAndValue(UnderlyingValue(Pet::Cat
), int16_t(0));
145 AssertSameTypeAndValue(UnderlyingValue(Pet::Dog
), int16_t(1));
146 AssertSameTypeAndValue(UnderlyingValue(Pet::Fish
), int16_t(2));
148 AssertSameTypeAndValue(UnderlyingValue(Plant::Flower
), int(0));
149 AssertSameTypeAndValue(UnderlyingValue(Plant::Tree
), int(1));
150 AssertSameTypeAndValue(UnderlyingValue(Plant::Vine
), int(2));
157 TestUnderlyingValue();