Index: Source/core/dom/DocumentOrderedMap.h |
diff --git a/Source/core/dom/DocumentOrderedMap.h b/Source/core/dom/DocumentOrderedMap.h |
index b6fc8e07e0df1e0111506225fd0bc5c4bd1e0cc8..fa1e39d573fab7e50cf2331cce3541d2ea179892 100644 |
--- a/Source/core/dom/DocumentOrderedMap.h |
+++ b/Source/core/dom/DocumentOrderedMap.h |
@@ -59,23 +59,35 @@ public: |
private: |
template<bool keyMatches(StringImpl*, Element*)> Element* get(StringImpl*, const TreeScope*) const; |
- typedef HashMap<StringImpl*, Element*> Map; |
+ struct MapEntry { |
+ MapEntry() |
+ : element(0) |
+ , count(0) |
+ { } |
+ |
+ explicit MapEntry(Element* firstElement) |
+ : element(firstElement) |
+ , count(1) |
+ { } |
+ |
+ Element* element; |
+ unsigned count; |
+ }; |
+ |
+ typedef HashMap<StringImpl*, MapEntry> Map; |
- // We maintain the invariant that m_duplicateCounts is the count of all elements with a given key |
- // excluding the one referenced in m_map, if any. This means it one less than the total count |
- // when the first node with a given key is cached, otherwise the same as the total count. |
mutable Map m_map; |
- mutable HashCountedSet<StringImpl*> m_duplicateCounts; |
}; |
inline bool DocumentOrderedMap::contains(StringImpl* id) const |
{ |
- return m_map.contains(id) || m_duplicateCounts.contains(id); |
+ return m_map.contains(id); |
} |
inline bool DocumentOrderedMap::containsMultiple(StringImpl* id) const |
{ |
- return m_duplicateCounts.contains(id); |
+ Map::const_iterator it = m_map.find(id); |
+ return it != m_map.end() && it->value.count > 1; |
} |
} // namespace WebCore |