From fc5b252010aeb6155d22e752914b8b9e371c5398 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Thu, 4 Mar 2021 23:16:59 -0800 Subject: [PATCH] AK: Implement IsEnum and UnderlyingType type traits I needed these meta-programming type traits while working on something else. Add basic support for these two type traits as well as some tests. --- AK/StdLibExtras.h | 19 +++++++++++++++++++ AK/Tests/TestTypeTraits.cpp | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/AK/StdLibExtras.h b/AK/StdLibExtras.h index 0e6cd49df7..643106aed7 100644 --- a/AK/StdLibExtras.h +++ b/AK/StdLibExtras.h @@ -450,6 +450,10 @@ constexpr T exchange(T& slot, U&& value) return old_value; } +template +struct IsEnum : public IntegralConstant { +}; + template struct IsUnion : public IntegralConstant { }; @@ -570,6 +574,19 @@ struct IdentityType { using Type = T; }; +template::value> +struct __UnderlyingType { + using Type = __underlying_type(T); +}; + +template +struct __UnderlyingType { +}; + +template +struct UnderlyingType : __UnderlyingType { +}; + } using AK::AddConst; @@ -590,6 +607,7 @@ using AK::IsArithmetic; using AK::IsBaseOf; using AK::IsClass; using AK::IsConst; +using AK::IsEnum; using AK::IsFundamental; using AK::IsNullPointer; using AK::IsSame; @@ -605,4 +623,5 @@ using AK::min; using AK::move; using AK::RemoveConst; using AK::swap; +using AK::UnderlyingType; using AK::Void; diff --git a/AK/Tests/TestTypeTraits.cpp b/AK/Tests/TestTypeTraits.cpp index 184dabcdc1..c00e6e617e 100644 --- a/AK/Tests/TestTypeTraits.cpp +++ b/AK/Tests/TestTypeTraits.cpp @@ -55,6 +55,10 @@ struct Empty { }; +enum class Enummer : u8 { + Dummmy, +}; + TEST_CASE(FundamentalTypeClassification) { EXPECT_TRAIT_TRUE(IsVoid, void); @@ -89,6 +93,12 @@ TEST_CASE(FundamentalTypeClassification) EXPECT_TRAIT_FALSE(IsUnsigned, short); EXPECT_TRAIT_FALSE(IsUnsigned, char); EXPECT_TRAIT_FALSE(IsUnsigned, long); + + EXPECT_TRAIT_TRUE(IsEnum, Enummer); + EXPECT_TRAIT_FALSE(IsEnum, Empty); + EXPECT_TRAIT_FALSE(IsEnum, int); + EXPECT_TRAIT_FALSE(IsEnum, void); + EXPECT_TRAIT_FALSE(IsEnum, std::nullptr_t); } TEST_CASE(AddConst) @@ -101,4 +111,11 @@ TEST_CASE(AddConst) EXPECT_EQ_WITH_TRAIT(AddConst, NoConstList, YesConstList); } +TEST_CASE(UnderlyingType) +{ + using Type = UnderlyingType::Type; + + STATIC_EXPECT_EQ(Type, u8); +} + TEST_MAIN(TypeTraits)