3 #include <type_traits>
\r
5 #include <boost/range/irange.hpp>
\r
9 // Macro that defines & and &= for an enum class. Add more when needed.
\r
11 #define ENUM_ENABLE_BITWISE(enum_class) \
\r
12 static enum_class operator&(enum_class lhs, enum_class rhs) \
\r
14 return static_cast<enum_class>( \
\r
15 static_cast<std::underlying_type<enum_class>::type>(lhs) \
\r
16 & static_cast<std::underlying_type<enum_class>::type>(rhs)); \
\r
18 static enum_class& operator&=(enum_class& lhs, enum_class rhs) \
\r
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) \
\r
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) \
\r
45 static enum_class operator~ (enum_class e) \
\r
47 return static_cast<enum_class>( \
\r
48 ~static_cast<std::underlying_type<enum_class>::type>(e)); \
\r
53 // For enum classes starting at 0 and without any gaps with a terminating count constant.
\r
54 template <typename E>
\r
55 const std::vector<E>& enum_constants()
\r
57 typedef typename std::underlying_type<E>::type integer;
\r
59 static const auto ints = boost::irange(static_cast<integer>(0), static_cast<integer>(E::count));
\r
60 static const auto result = cpplinq::from(ints.begin(), ints.end())
\r
62 .select([](int i) { return static_cast<E>(i); })
\r