+#include <type_traits>\r
+\r
+#include <boost/range/irange.hpp>\r
+\r
+#include "linq.h"\r
+\r
+// Macro that defines & and &= for an enum class. Add more when needed.\r
+\r
+#define ENUM_ENABLE_BITWISE(enum_class) \\r
+ static enum_class operator&(enum_class lhs, enum_class rhs) \\r
+ { \\r
+ return static_cast<enum_class>( \\r
+ static_cast<std::underlying_type<enum_class>::type>(lhs) \\r
+ & static_cast<std::underlying_type<enum_class>::type>(rhs)); \\r
+ }; \\r
+ static enum_class& operator&=(enum_class& lhs, enum_class rhs) \\r
+ { \\r
+ lhs = lhs & rhs; \\r
+ return lhs; \\r
+ }; \\r
+ static enum_class operator | (enum_class lhs, enum_class rhs) \\r
+ { \\r
+ return static_cast<enum_class>( \\r
+ static_cast<std::underlying_type<enum_class>::type>(lhs) \\r
+ | static_cast<std::underlying_type<enum_class>::type>(rhs)); \\r
+ }; \\r
+ static enum_class& operator|=(enum_class& lhs, enum_class rhs) \\r
+ { \\r
+ lhs = lhs | rhs; \\r
+ return lhs; \\r
+ }; \\r
+ static enum_class operator ^ (enum_class lhs, enum_class rhs) \\r
+ { \\r
+ return static_cast<enum_class>( \\r
+ static_cast<std::underlying_type<enum_class>::type>(lhs) \\r
+ ^ static_cast<std::underlying_type<enum_class>::type>(rhs)); \\r
+ }; \\r
+ static enum_class& operator^=(enum_class& lhs, enum_class rhs) \\r
+ { \\r
+ lhs = lhs ^ rhs; \\r
+ return lhs; \\r
+ }; \\r
+ static enum_class operator~ (enum_class e) \\r
+ { \\r
+ return static_cast<enum_class>( \\r
+ ~static_cast<std::underlying_type<enum_class>::type>(e)); \\r
+ };\r
+\r