summaryrefslogtreecommitdiff
path: root/src/flags.hh
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2020-11-11 21:43:27 +1100
committerMaxime Coste <mawww@kakoune.org>2021-11-21 09:44:56 +1100
commitfb4cef5b61639c507e6c5740cc5973d0d79ba673 (patch)
tree751e533a39d9a51be6b8af9e4abe6af75df00e87 /src/flags.hh
parent04f11c2af3e0ecdc78df9800d381b2fdc46af3b7 (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.hh23
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;