]> git.sesse.net Git - casparcg/blob - common/enum_class.h
[scene] #564 Made a crawler example scene.
[casparcg] / common / enum_class.h
1 #pragma once\r
2 \r
3 #include <type_traits>\r
4 \r
5 #include <boost/range/irange.hpp>\r
6 \r
7 #include "linq.h"\r
8 \r
9 // Macro that defines & and &= for an enum class. Add more when needed.\r
10 \r
11 #define ENUM_ENABLE_BITWISE(enum_class) \\r
12         static enum_class operator&(enum_class lhs, enum_class rhs) \\r
13         { \\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
17         }; \\r
18         static enum_class& operator&=(enum_class& lhs, enum_class rhs) \\r
19         { \\r
20                 lhs = lhs & rhs; \\r
21                 return lhs; \\r
22         }; \\r
23         static enum_class operator | (enum_class lhs, enum_class rhs) \\r
24         { \\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
28         }; \\r
29         static enum_class& operator|=(enum_class& lhs, enum_class rhs) \\r
30         { \\r
31                 lhs = lhs | rhs; \\r
32                 return lhs; \\r
33         }; \\r
34         static enum_class operator ^ (enum_class lhs, enum_class rhs) \\r
35         { \\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
39         }; \\r
40         static enum_class& operator^=(enum_class& lhs, enum_class rhs) \\r
41         { \\r
42                 lhs = lhs ^ rhs; \\r
43                 return lhs; \\r
44         }; \\r
45         static enum_class operator~ (enum_class e) \\r
46         { \\r
47                 return static_cast<enum_class>( \\r
48                                 ~static_cast<std::underlying_type<enum_class>::type>(e)); \\r
49         };\r
50 \r
51 namespace caspar {\r
52 \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
56 {\r
57         typedef typename std::underlying_type<E>::type integer;\r
58 \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
61                 //.cast<E>()\r
62                 .select([](int i) { return static_cast<E>(i); })\r
63                 .to_vector();\r
64 \r
65         return result;\r
66 }\r
67 \r
68 }\r