[PATCH] D103223: [ADT][WIP] Proof of concept impl of generic visit for PointerUnion

Scott Linder via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 26 21:16:33 PDT 2021


scott.linder created this revision.
Herald added a subscriber: dexonsmith.
scott.linder requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D103223

Files:
  llvm/include/llvm/ADT/PointerUnion.h
  llvm/unittests/ADT/PointerUnionTest.cpp


Index: llvm/unittests/ADT/PointerUnionTest.cpp
===================================================================
--- llvm/unittests/ADT/PointerUnionTest.cpp
+++ llvm/unittests/ADT/PointerUnionTest.cpp
@@ -156,4 +156,26 @@
   EXPECT_TRUE((void *)n.getAddrOfPtr1() == (void *)&n);
 }
 
+TEST_F(PointerUnionTest, Visitor) {
+  void *ptr;
+
+  visit(makeVisitor([&](int *intPtr) { ptr = intPtr; },
+                    [&](float *floatPtr) { ptr = floatPtr; }),
+        a);
+  EXPECT_EQ(&f, ptr);
+
+  visit(makeVisitor([&](int *intPtr) { ptr = intPtr; },
+                    [&](float *floatPtr) { ptr = floatPtr; },
+                    [&](long long *longPtr) { ptr = longPtr; }),
+        i3);
+  EXPECT_EQ(&i, ptr);
+
+  visit(makeVisitor([&](int *intPtr) { ptr = intPtr; },
+                    [&](float *floatPtr) { ptr = floatPtr; },
+                    [&](long long *longPtr) { ptr = longPtr; },
+                    [&](double *doublePtr) { ptr = doublePtr; }),
+        d4);
+  EXPECT_EQ(&d, ptr);
+}
+
 } // end anonymous namespace
Index: llvm/include/llvm/ADT/PointerUnion.h
===================================================================
--- llvm/include/llvm/ADT/PointerUnion.h
+++ llvm/include/llvm/ADT/PointerUnion.h
@@ -16,6 +16,7 @@
 
 #include "llvm/ADT/DenseMapInfo.h"
 #include "llvm/ADT/PointerIntPair.h"
+#include "llvm/ADT/VariantTraits.h"
 #include "llvm/Support/PointerLikeTypeTraits.h"
 #include <cassert>
 #include <cstddef>
@@ -149,6 +150,8 @@
   using First = TypeAtIndex<0, PTs...>;
   using Base = typename PointerUnion::PointerUnionMembers;
 
+  friend struct variant_traits_detail::VariantTraits<PointerUnion>;
+
 public:
   PointerUnion() = default;
 
@@ -272,6 +275,19 @@
   }
 };
 
+template <typename... PTs>
+struct variant_traits_detail::VariantTraits<PointerUnion<PTs...>> {
+  static constexpr size_t numAlts() { return sizeof...(PTs); }
+  static constexpr size_t getIndex(const PointerUnion<PTs...> &Variant) {
+    return Variant.Val.getInt();
+  }
+  template <size_t Index, typename VariantT>
+  static constexpr decltype(auto) getAlt(VariantT &&Variant) {
+    return std::forward<VariantT>(Variant)
+        .template get<TypeAtIndex<Index, PTs...>>();
+  }
+};
+
 } // end namespace llvm
 
 #endif // LLVM_ADT_POINTERUNION_H


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103223.348151.patch
Type: text/x-patch
Size: 2283 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210527/ebcd9856/attachment.bin>


More information about the llvm-commits mailing list