AK: Add Flatten Variant helper

This will be used in future commits.
It has to be present for types, that are generated by the IDL since the
IDL flattens variants of variants.
This commit is contained in:
Totto16 2024-11-14 14:14:36 +01:00 committed by Tim Ledbetter
parent eb1c60f37b
commit 14e808e574
Notes: github-actions[bot] 2024-12-06 13:11:28 +00:00
2 changed files with 31 additions and 0 deletions

View file

@ -499,9 +499,24 @@ private:
template<typename... Ts>
struct TypeList<Variant<Ts...>> : TypeList<Ts...> { };
namespace Detail {
template<typename T1, typename T2>
struct FlattenVariant;
template<typename... Ts1, typename... Ts2>
struct FlattenVariant<::AK::Variant<Ts1...>, ::AK::Variant<Ts2...>> {
using type = ::AK::Variant<Ts1..., Ts2...>;
};
}
template<typename T1, typename T2>
using FlattenVariant = Detail::FlattenVariant<T1, T2>::type;
}
#if USING_AK_GLOBALLY
using AK::Empty;
using AK::FlattenVariant;
using AK::Variant;
#endif

View file

@ -302,3 +302,19 @@ TEST_CASE(variant_equality)
EXPECT_EQ(variant1, variant2);
}
}
TEST_CASE(flatten_variant)
{
using InnerVariant = Variant<Empty, int>;
using OuterVariant = FlattenVariant<InnerVariant, Variant<float>>;
using MyVariant = Variant<Empty, int, float>;
EXPECT_EQ((TypeList<MyVariant>::size), 3u);
EXPECT_EQ((TypeList<OuterVariant>::size), 3u);
EXPECT((IsSame<OuterVariant, MyVariant>));
using OuterList = TypeList<OuterVariant>;
EXPECT((IsSame<typename OuterList::template Type<0>, Empty>));
EXPECT((IsSame<typename OuterList::template Type<1>, int>));
EXPECT((IsSame<typename OuterList::template Type<2>, float>));
}