From 3e797a3d152b59302365a7c11c5253292cd34ee7 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Thu, 23 Oct 2014 18:55:45 +0100 Subject: centralize bit operation support for enum used as flags --- src/flags.hh | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/flags.hh (limited to 'src/flags.hh') 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 + +namespace Kakoune +{ + +template +struct WithBitOps : std::false_type {}; + +template +using EnumStorageType = typename std::underlying_type::type; + +template +using EnableIfWithBitOps = typename std::enable_if::value>::type; + +template> +constexpr Flags operator|(Flags lhs, Flags rhs) +{ + return (Flags)((EnumStorageType) lhs | (EnumStorageType) rhs); +} + +template> +Flags& operator|=(Flags& lhs, Flags rhs) +{ + (EnumStorageType&) lhs |= (EnumStorageType) rhs; + return lhs; +} + +template> +constexpr bool operator&(Flags lhs, Flags rhs) +{ + return ((EnumStorageType) lhs & (EnumStorageType) rhs) != 0; +} + +template> +Flags& operator&=(Flags& lhs, Flags rhs) +{ + (EnumStorageType&) lhs &= (EnumStorageType) rhs; + return lhs; +} + +template> +constexpr Flags operator~(Flags lhs) +{ + return (Flags)(~(EnumStorageType)lhs); +} + +} + +#endif // flags_hh_INCLUDED -- cgit v1.2.3