5 #include <boost/range/irange.hpp>
9 // Macro that defines & and &= for an enum class. Add more when needed.
11 #define ENUM_ENABLE_BITWISE(enum_class) \
12 static enum_class operator&(enum_class lhs, enum_class rhs) \
14 return static_cast<enum_class>( \
15 static_cast<std::underlying_type<enum_class>::type>(lhs) \
16 & static_cast<std::underlying_type<enum_class>::type>(rhs)); \
18 static enum_class& operator&=(enum_class& lhs, enum_class rhs) \
23 static enum_class operator | (enum_class lhs, enum_class rhs) \
\r
25 return static_cast<enum_class>( \
\r
26 static_cast<std::underlying_type<enum_class>::type>(lhs) \
\r
27 | static_cast<std::underlying_type<enum_class>::type>(rhs)); \
\r
29 static enum_class& operator|=(enum_class& lhs, enum_class rhs) \
34 static enum_class operator ^ (enum_class lhs, enum_class rhs) \
\r
36 return static_cast<enum_class>( \
\r
37 static_cast<std::underlying_type<enum_class>::type>(lhs) \
\r
38 ^ static_cast<std::underlying_type<enum_class>::type>(rhs)); \
\r
40 static enum_class& operator^=(enum_class& lhs, enum_class rhs) \
48 // For enum classes starting at 0 and without any gaps with a terminating count constant.
50 const std::vector<E>& enum_constants()
52 typedef typename std::underlying_type<E>::type integer;
54 static const auto ints = boost::irange(static_cast<integer>(0), static_cast<integer>(E::count));
55 static const auto result = cpplinq::from(ints.begin(), ints.end())
57 .select([](int i) { return static_cast<E>(i); })