diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2014-10-23 18:55:45 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2014-10-23 19:02:39 +0100 |
| commit | 3e797a3d152b59302365a7c11c5253292cd34ee7 (patch) | |
| tree | b9f9423e3216e38221272d8d1ca80215782ebde8 /src/flags.hh | |
| parent | 5eb8989192445b0505933fcdb1c4f489d4bdc7f9 (diff) | |
centralize bit operation support for enum used as flags
Diffstat (limited to 'src/flags.hh')
| -rw-r--r-- | src/flags.hh | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/flags.hh b/src/flags.hh new file mode 100644 index 00000000..a3cbc5e0 --- /dev/null +++ b/src/flags.hh @@ -0,0 +1,52 @@ +#ifndef flags_hh_INCLUDED +#define flags_hh_INCLUDED + +#include <type_traits> + +namespace Kakoune +{ + +template<typename Flags> +struct WithBitOps : std::false_type {}; + +template<typename Flags> +using EnumStorageType = typename std::underlying_type<Flags>::type; + +template<typename Flags> +using EnableIfWithBitOps = typename std::enable_if<WithBitOps<Flags>::value>::type; + +template<typename Flags, typename = EnableIfWithBitOps<Flags>> +constexpr Flags operator|(Flags lhs, Flags rhs) +{ + return (Flags)((EnumStorageType<Flags>) lhs | (EnumStorageType<Flags>) rhs); +} + +template<typename Flags, typename = EnableIfWithBitOps<Flags>> +Flags& operator|=(Flags& lhs, Flags rhs) +{ + (EnumStorageType<Flags>&) lhs |= (EnumStorageType<Flags>) rhs; + return lhs; +} + +template<typename Flags, typename = EnableIfWithBitOps<Flags>> +constexpr bool operator&(Flags lhs, Flags rhs) +{ + return ((EnumStorageType<Flags>) lhs & (EnumStorageType<Flags>) rhs) != 0; +} + +template<typename Flags, typename = EnableIfWithBitOps<Flags>> +Flags& operator&=(Flags& lhs, Flags rhs) +{ + (EnumStorageType<Flags>&) lhs &= (EnumStorageType<Flags>) rhs; + return lhs; +} + +template<typename Flags, typename = EnableIfWithBitOps<Flags>> +constexpr Flags operator~(Flags lhs) +{ + return (Flags)(~(EnumStorageType<Flags>)lhs); +} + +} + +#endif // flags_hh_INCLUDED |
