Bumping gaia.json for 7 gaia revision(s) a=gaia-bump
[gecko.git] / mfbt / TypedEnumBits.h
blob1f439f123996d0e901e703d3e2975a40c5a33b6d
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
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 /*
8 * MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS allows using a typed enum as bit flags.
9 */
11 #ifndef mozilla_TypedEnumBits_h
12 #define mozilla_TypedEnumBits_h
14 #include "mozilla/IntegerTypeTraits.h"
15 #include "mozilla/TypedEnumInternal.h"
17 namespace mozilla {
19 #define MOZ_CASTABLETYPEDENUMRESULT_BINOP(Op, OtherType, ReturnType) \
20 template<typename E> \
21 MOZ_CONSTEXPR ReturnType \
22 operator Op(const OtherType& aE, const CastableTypedEnumResult<E>& aR) \
23 { \
24 return ReturnType(aE Op OtherType(aR)); \
25 } \
26 template<typename E> \
27 MOZ_CONSTEXPR ReturnType \
28 operator Op(const CastableTypedEnumResult<E>& aR, const OtherType& aE) \
29 { \
30 return ReturnType(OtherType(aR) Op aE); \
31 } \
32 template<typename E> \
33 MOZ_CONSTEXPR ReturnType \
34 operator Op(const CastableTypedEnumResult<E>& aR1, \
35 const CastableTypedEnumResult<E>& aR2) \
36 { \
37 return ReturnType(OtherType(aR1) Op OtherType(aR2)); \
40 MOZ_CASTABLETYPEDENUMRESULT_BINOP(|, E, CastableTypedEnumResult<E>)
41 MOZ_CASTABLETYPEDENUMRESULT_BINOP(&, E, CastableTypedEnumResult<E>)
42 MOZ_CASTABLETYPEDENUMRESULT_BINOP(^, E, CastableTypedEnumResult<E>)
43 MOZ_CASTABLETYPEDENUMRESULT_BINOP(==, E, bool)
44 MOZ_CASTABLETYPEDENUMRESULT_BINOP(!=, E, bool)
45 MOZ_CASTABLETYPEDENUMRESULT_BINOP(||, bool, bool)
46 MOZ_CASTABLETYPEDENUMRESULT_BINOP(&&, bool, bool)
48 template <typename E>
49 MOZ_CONSTEXPR CastableTypedEnumResult<E>
50 operator ~(const CastableTypedEnumResult<E>& aR)
52 return CastableTypedEnumResult<E>(~(E(aR)));
55 #define MOZ_CASTABLETYPEDENUMRESULT_COMPOUND_ASSIGN_OP(Op) \
56 template<typename E> \
57 E& \
58 operator Op(E& aR1, \
59 const CastableTypedEnumResult<E>& aR2) \
60 { \
61 return aR1 Op E(aR2); \
64 MOZ_CASTABLETYPEDENUMRESULT_COMPOUND_ASSIGN_OP(&=)
65 MOZ_CASTABLETYPEDENUMRESULT_COMPOUND_ASSIGN_OP(|=)
66 MOZ_CASTABLETYPEDENUMRESULT_COMPOUND_ASSIGN_OP(^=)
68 #undef MOZ_CASTABLETYPEDENUMRESULT_COMPOUND_ASSIGN_OP
70 #undef MOZ_CASTABLETYPEDENUMRESULT_BINOP
72 #ifndef MOZ_HAVE_CXX11_STRONG_ENUMS
74 #define MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(Op, ReturnType) \
75 template<typename E> \
76 MOZ_CONSTEXPR ReturnType \
77 operator Op(typename E::Enum aE, const CastableTypedEnumResult<E>& aR) \
78 { \
79 return ReturnType(aE Op E(aR)); \
80 } \
81 template<typename E> \
82 MOZ_CONSTEXPR ReturnType \
83 operator Op(const CastableTypedEnumResult<E>& aR, typename E::Enum aE) \
84 { \
85 return ReturnType(E(aR) Op aE); \
88 MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(|, CastableTypedEnumResult<E>)
89 MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(&, CastableTypedEnumResult<E>)
90 MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(^, CastableTypedEnumResult<E>)
91 MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(==, bool)
92 MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(!=, bool)
94 #undef MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11
96 #endif // not MOZ_HAVE_CXX11_STRONG_ENUMS
98 namespace detail {
99 template<typename E>
100 struct UnsignedIntegerTypeForEnum
101 : UnsignedStdintTypeForSize<sizeof(E)>
105 } // namespace mozilla
107 #define MOZ_MAKE_ENUM_CLASS_BINOP_IMPL(Name, Op) \
108 inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult<Name> \
109 operator Op(Name a, Name b) \
111 typedef mozilla::CastableTypedEnumResult<Name> Result; \
112 typedef mozilla::detail::UnsignedIntegerTypeForEnum<Name>::Type U; \
113 return Result(Name(U(a) Op U(b))); \
116 inline Name& \
117 operator Op##=(Name& a, Name b) \
119 return a = a Op b; \
122 #define MOZ_MAKE_ENUM_CLASS_OPS_IMPL(Name) \
123 MOZ_MAKE_ENUM_CLASS_BINOP_IMPL(Name, |) \
124 MOZ_MAKE_ENUM_CLASS_BINOP_IMPL(Name, &) \
125 MOZ_MAKE_ENUM_CLASS_BINOP_IMPL(Name, ^) \
126 inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult<Name> \
127 operator~(Name a) \
129 typedef mozilla::CastableTypedEnumResult<Name> Result; \
130 typedef mozilla::detail::UnsignedIntegerTypeForEnum<Name>::Type U; \
131 return Result(Name(~(U(a)))); \
134 #ifndef MOZ_HAVE_CXX11_STRONG_ENUMS
135 # define MOZ_MAKE_ENUM_CLASS_BITWISE_BINOP_EXTRA_NON_CXX11(Name, Op) \
136 inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult<Name> \
137 operator Op(Name a, Name::Enum b) \
139 return a Op Name(b); \
142 inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult<Name> \
143 operator Op(Name::Enum a, Name b) \
145 return Name(a) Op b; \
148 inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult<Name> \
149 operator Op(Name::Enum a, Name::Enum b) \
151 return Name(a) Op Name(b); \
154 inline Name& \
155 operator Op##=(Name& a, Name::Enum b) \
157 return a = a Op Name(b); \
160 # define MOZ_MAKE_ENUM_CLASS_OPS_EXTRA_NON_CXX11(Name) \
161 MOZ_MAKE_ENUM_CLASS_BITWISE_BINOP_EXTRA_NON_CXX11(Name, |) \
162 MOZ_MAKE_ENUM_CLASS_BITWISE_BINOP_EXTRA_NON_CXX11(Name, &) \
163 MOZ_MAKE_ENUM_CLASS_BITWISE_BINOP_EXTRA_NON_CXX11(Name, ^) \
164 inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult<Name> \
165 operator~(Name::Enum a) \
167 return ~(Name(a)); \
169 #endif
172 * MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS generates standard bitwise operators
173 * for the given enum type. Use this to enable using an enum type as bit-field.
175 #ifdef MOZ_HAVE_CXX11_STRONG_ENUMS
176 # define MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(Name) \
177 MOZ_MAKE_ENUM_CLASS_OPS_IMPL(Name)
178 #else
179 # define MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(Name) \
180 MOZ_MAKE_ENUM_CLASS_OPS_IMPL(Name) \
181 MOZ_MAKE_ENUM_CLASS_OPS_EXTRA_NON_CXX11(Name)
182 #endif
184 #endif // mozilla_TypedEnumBits_h