[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