diff options
| author | Maxime Coste <mawww@kakoune.org> | 2020-11-11 21:43:27 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2021-11-21 09:44:56 +1100 |
| commit | fb4cef5b61639c507e6c5740cc5973d0d79ba673 (patch) | |
| tree | 751e533a39d9a51be6b8af9e4abe6af75df00e87 /src/flags.hh | |
| parent | 04f11c2af3e0ecdc78df9800d381b2fdc46af3b7 (diff) | |
Replace std::enable_if with requires
Introduce some concepts for enum and flags handling, goodbye and
thanks for all the fish std::enable_if.
Diffstat (limited to 'src/flags.hh')
| -rw-r--r-- | src/flags.hh | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/src/flags.hh b/src/flags.hh index 6b701016..6d4764f3 100644 --- a/src/flags.hh +++ b/src/flags.hh @@ -12,21 +12,18 @@ template<typename Flags> constexpr bool with_bit_ops(Meta::Type<Flags>) { return false; } template<typename Flags> -using UnderlyingType = std::underlying_type_t<Flags>; - -template<typename Flags, typename T = void> -using EnableIfWithBitOps = std::enable_if_t<with_bit_ops(Meta::Type<Flags>{}), T>; +concept WithBitOps = with_bit_ops(Meta::Type<Flags>{}); -template<typename Flags, typename T = void> -using EnableIfWithoutBitOps = std::enable_if_t<not with_bit_ops(Meta::Type<Flags>{}), T>; +template<typename Flags> +using UnderlyingType = std::underlying_type_t<Flags>; -template<typename Flags, typename = EnableIfWithBitOps<Flags>> +template<WithBitOps Flags> constexpr Flags operator|(Flags lhs, Flags rhs) { return (Flags)((UnderlyingType<Flags>) lhs | (UnderlyingType<Flags>) rhs); } -template<typename Flags, typename = EnableIfWithBitOps<Flags>> +template<WithBitOps Flags> constexpr Flags& operator|=(Flags& lhs, Flags rhs) { (UnderlyingType<Flags>&) lhs |= (UnderlyingType<Flags>) rhs; @@ -45,32 +42,32 @@ struct TestableFlags constexpr bool operator!=(const TestableFlags<Flags>& other) const { return value != other.value; } }; -template<typename Flags, typename = EnableIfWithBitOps<Flags>> +template<WithBitOps Flags> constexpr TestableFlags<Flags> operator&(Flags lhs, Flags rhs) { return { (Flags)((UnderlyingType<Flags>) lhs & (UnderlyingType<Flags>) rhs) }; } -template<typename Flags, typename = EnableIfWithBitOps<Flags>> +template<WithBitOps Flags> constexpr Flags& operator&=(Flags& lhs, Flags rhs) { (UnderlyingType<Flags>&) lhs &= (UnderlyingType<Flags>) rhs; return lhs; } -template<typename Flags, typename = EnableIfWithBitOps<Flags>> +template<WithBitOps Flags> constexpr Flags operator~(Flags lhs) { return (Flags)(~(UnderlyingType<Flags>)lhs); } -template<typename Flags, typename = EnableIfWithBitOps<Flags>> +template<WithBitOps Flags> constexpr Flags operator^(Flags lhs, Flags rhs) { return (Flags)((UnderlyingType<Flags>) lhs ^ (UnderlyingType<Flags>) rhs); } -template<typename Flags, typename = EnableIfWithBitOps<Flags>> +template<WithBitOps Flags> constexpr Flags& operator^=(Flags& lhs, Flags rhs) { (UnderlyingType<Flags>&) lhs ^= (UnderlyingType<Flags>) rhs; |
