summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/ADT/DenseMapTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/ADT/DenseMapTest.cpp')
-rw-r--r--llvm/unittests/ADT/DenseMapTest.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp
index caeba457918..db00f8cf8e5 100644
--- a/llvm/unittests/ADT/DenseMapTest.cpp
+++ b/llvm/unittests/ADT/DenseMapTest.cpp
@@ -496,6 +496,55 @@ TEST(DenseMapCustomTest, StringRefTest) {
EXPECT_EQ(42, M.lookup(StringRef("a", 0)));
}
+struct CachedHashTest {
+ unsigned Val;
+ unsigned *Counter = nullptr;
+ CachedHashTest(unsigned Val) : Val(Val) {}
+ CachedHashTest(unsigned Val, unsigned *Counter)
+ : Val(Val), Counter(Counter) {}
+};
+}
+namespace llvm {
+template <> struct DenseMapInfo<CachedHashTest> {
+ static CachedHashTest getEmptyKey() { return ~0; }
+ static CachedHashTest getTombstoneKey() { return ~0U - 1; }
+ static unsigned getHashValue(const CachedHashTest &X) {
+ ++*X.Counter;
+ return X.Val;
+ }
+ static bool isEqual(const CachedHashTest &LHS, const CachedHashTest &RHS) {
+ return LHS.Val == RHS.Val;
+ }
+};
+}
+namespace {
+
+TEST(DenseMapCustomTest, CachedHashTest) {
+ unsigned Counter = 0;
+ CachedHashTest Val(0, &Counter);
+ DenseMap<CachedHashTest, int> Map;
+
+ Map[Val] = 0;
+ ASSERT_EQ(1u, Counter);
+
+ Map.reserve(64);
+ ASSERT_EQ(2u, Counter);
+}
+
+// Like above, but now cache the hash.
+TEST(DenseMapCustomTest, CachedHashTest2) {
+ unsigned Counter = 0;
+ CachedHashTest Val(0, &Counter);
+ typedef CachedHash<CachedHashTest> Cached;
+ DenseMap<Cached, int> Map;
+
+ Map[Val] = 0;
+ ASSERT_EQ(1u, Counter);
+
+ Map.reserve(64);
+ ASSERT_EQ(1u, Counter);
+}
+
// Key traits that allows lookup with either an unsigned or char* key;
// In the latter case, "a" == 0, "b" == 1 and so on.
struct TestDenseMapInfo {
OpenPOWER on IntegriCloud