浏览代码

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.
Totto16 8 月之前
父节点
当前提交
14e808e574
共有 2 个文件被更改,包括 31 次插入0 次删除
  1. 15 0
      AK/Variant.h
  2. 16 0
      Tests/AK/TestVariant.cpp

+ 15 - 0
AK/Variant.h

@@ -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

+ 16 - 0
Tests/AK/TestVariant.cpp

@@ -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>));
+}