PoDoFo 1.0.0-dev
Loading...
Searching...
No Matches
EnumFlags.h
1#ifndef AUX_ENUM_FLAGS_H
2#define AUX_ENUM_FLAGS_H
3
4#include <type_traits>
5
6// http://blog.bitwigglers.org/using-enum-classes-as-type-safe-bitmasks/
7// https://gist.github.com/derofim/0188769131c62c8aff5e1da5740b3574
8
9template<typename Enum>
10struct EnableBitMaskOperators
11{
12 static const bool enable = false;
13};
14
15#define ENABLE_BITMASK_OPERATORS(x) \
16template<> \
17struct EnableBitMaskOperators<x> \
18{ \
19 static const bool enable = true; \
20};
21
22template<typename Enum>
23constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type
24operator &(Enum lhs, Enum rhs) noexcept
25{
26 using underlying = typename std::underlying_type<Enum>::type;
27 return static_cast<Enum> (
28 static_cast<underlying>(lhs) &
29 static_cast<underlying>(rhs)
30 );
31}
32
33template<typename Enum>
34constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type
35operator ^(Enum lhs, Enum rhs) noexcept
36{
37 using underlying = typename std::underlying_type<Enum>::type;
38 return static_cast<Enum> (
39 static_cast<underlying>(lhs) ^
40 static_cast<underlying>(rhs)
41 );
42}
43
44template<typename Enum>
45constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type
46operator ~(Enum rhs) noexcept
47{
48
49 using underlying = typename std::underlying_type<Enum>::type;
50 return static_cast<Enum> (
51 ~static_cast<underlying>(rhs)
52 );
53}
54
55template<typename Enum>
56constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type
57operator |(Enum lhs, Enum rhs) noexcept
58{
59 using underlying = typename std::underlying_type<Enum>::type;
60 return static_cast<Enum> (
61 static_cast<underlying>(lhs) |
62 static_cast<underlying>(rhs)
63 );
64}
65
66template<typename Enum>
67constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type&
68operator &=(Enum& lhs, Enum rhs) noexcept
69{
70 using underlying = typename std::underlying_type<Enum>::type;
71 lhs = static_cast<Enum> (
72 static_cast<underlying>(lhs) &
73 static_cast<underlying>(rhs)
74 );
75 return lhs;
76}
77
78template<typename Enum>
79constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type&
80operator ^=(Enum& lhs, Enum rhs) noexcept
81{
82 using underlying = typename std::underlying_type<Enum>::type;
83 lhs = static_cast<Enum> (
84 static_cast<underlying>(lhs) ^
85 static_cast<underlying>(rhs)
86 );
87 return lhs;
88}
89
90template<typename Enum>
91constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum&>::type
92operator |=(Enum& lhs, Enum rhs) noexcept
93{
94 using underlying = typename std::underlying_type<Enum>::type;
95 lhs = static_cast<Enum> (
96 static_cast<underlying>(lhs) |
97 static_cast<underlying>(rhs)
98 );
99 return lhs;
100}
101
102#endif // AUX_ENUM_FLAGS_H