Index: Source/wtf/HashMapTest.cpp |
diff --git a/Source/wtf/HashMapTest.cpp b/Source/wtf/HashMapTest.cpp |
index cbdbca6eb6c1c11b65ad3537b508e6267e0067ea..931ec737b33d439e27bc0374558d4e8b4667035a 100644 |
--- a/Source/wtf/HashMapTest.cpp |
+++ b/Source/wtf/HashMapTest.cpp |
@@ -303,6 +303,62 @@ TEST(HashMapTest, ValueTypeDestructed) |
EXPECT_EQ(0, InstanceCounter::counter); |
} |
+class CopyCounter { |
+public: |
+ CopyCounter() = default; |
+ explicit CopyCounter(int data) : m_data(data) { } |
+ |
+ CopyCounter(const CopyCounter& copy) : m_data(copy.m_data) { ++s_counter; } |
+ |
+ int data() const { return m_data; } |
+ |
+ bool isHashTableDeletedValue() const { return m_data == HashTableDeletedValue; } |
+ |
+ static int s_counter; |
+private: |
+ int m_data; |
+}; |
+ |
+int CopyCounter::s_counter = 0; |
+ |
+struct CopyCounterHash { |
+ static unsigned hash(const CopyCounter& key) |
+ { |
+ return IntHash<unsigned>::hash(key.data()); |
+ } |
+ |
+ static bool equal(const CopyCounter& a, const CopyCounter& b) |
+ { |
+ return a.data() == b.data(); |
+ } |
+ |
+ static const bool safeToCompareToEmptyOrDeleted = true; |
+}; |
+ |
+struct CopyCounterHashTraits: SimpleClassHashTraits<CopyCounter> { |
+#if COMPILER(MSVC) |
+ // Need this in order to enable RVO on VS2013 (the default traits |
+ // implementation would produce an unneeded copy). |
+ static CopyCounter emptyValue() |
+ { |
+ CopyCounter empty; |
+ return empty; |
+ } |
+#endif |
+ static const bool hasIsEmptyValueFunction = true; |
+ static bool isEmptyValue(const CopyCounter& counter) { return !counter.data(); } |
+}; |
+ |
+TEST(HashMapTest, LookupNoKeyCopies) |
+{ |
+ HashMap<CopyCounter, int, CopyCounterHash, CopyCounterHashTraits> map; |
+ |
+ map.contains(CopyCounter(1)); |
+ auto it = map.find(CopyCounter(1)); |
+ ALLOW_UNUSED_LOCAL(it); |
+ EXPECT_EQ(0, CopyCounter::s_counter); |
+} |
+ |
} // anonymous namespace |
} // namespace WTF |