diff --git a/AK/Variant.h b/AK/Variant.h index 7ae5619ef63..58a014da765 100644 --- a/AK/Variant.h +++ b/AK/Variant.h @@ -499,9 +499,24 @@ private: template struct TypeList> : TypeList { }; +namespace Detail { +template +struct FlattenVariant; + +template +struct FlattenVariant<::AK::Variant, ::AK::Variant> { + using type = ::AK::Variant; +}; + +} + +template +using FlattenVariant = Detail::FlattenVariant::type; + } #if USING_AK_GLOBALLY using AK::Empty; +using AK::FlattenVariant; using AK::Variant; #endif diff --git a/Tests/AK/TestVariant.cpp b/Tests/AK/TestVariant.cpp index 44806a43101..63d61b7f6f3 100644 --- a/Tests/AK/TestVariant.cpp +++ b/Tests/AK/TestVariant.cpp @@ -302,3 +302,19 @@ TEST_CASE(variant_equality) EXPECT_EQ(variant1, variant2); } } + +TEST_CASE(flatten_variant) +{ + using InnerVariant = Variant; + using OuterVariant = FlattenVariant>; + using MyVariant = Variant; + + EXPECT_EQ((TypeList::size), 3u); + EXPECT_EQ((TypeList::size), 3u); + EXPECT((IsSame)); + + using OuterList = TypeList; + EXPECT((IsSame, Empty>)); + EXPECT((IsSame, int>)); + EXPECT((IsSame, float>)); +}