Index: Source/wtf/HashMapTest.cpp |
diff --git a/Source/wtf/HashMapTest.cpp b/Source/wtf/HashMapTest.cpp |
index cbdbca6eb6c1c11b65ad3537b508e6267e0067ea..f60596134e6f391657d3164f720f663714c6720d 100644 |
--- a/Source/wtf/HashMapTest.cpp |
+++ b/Source/wtf/HashMapTest.cpp |
@@ -303,6 +303,60 @@ 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) |
+ static CopyCounter emptyValue() |
tkent
2015/07/30 23:55:54
Please add a comment why this is necessary.
|
+ { |
+ 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 |