Changeset 238504 in webkit
- Timestamp:
- Nov 26, 2018, 11:29:23 AM (7 years ago)
- Location:
- trunk/Source
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r238478 r238504 1 2018-11-26 Sam Weinig <sam@webkit.org> 2 3 Streamline ListHashSet use in floating object code 4 https://bugs.webkit.org/show_bug.cgi?id=191957 5 6 Reviewed by Alex Christensen. 7 8 * wtf/ListHashSet.h: 9 Reverses the order of the template arguments for the find() and contains() 10 overload that allow specifying a hash translator to allow the compiler to 11 deduce type T. This simplifies call sites and matches other WTF containers. 12 1 13 2018-11-25 Michael Catanzaro <mcatanzaro@igalia.com> 2 14 -
trunk/Source/WTF/wtf/ListHashSet.h
r238467 r238504 113 113 // with some other type, to avoid the cost of type conversion. 114 114 // The HashTranslator interface is defined in HashSet. 115 // FIXME: We should reverse the order of the template arguments so that callers 116 // can just pass the translator let the compiler deduce T. 117 template<typename T, typename HashTranslator> iterator find(const T&); 118 template<typename T, typename HashTranslator> const_iterator find(const T&) const; 119 template<typename T, typename HashTranslator> bool contains(const T&) const; 115 template<typename HashTranslator, typename T> iterator find(const T&); 116 template<typename HashTranslator, typename T> const_iterator find(const T&) const; 117 template<typename HashTranslator, typename T> bool contains(const T&) const; 120 118 121 119 // The return value of add is a pair of an iterator to the new value's location, … … 481 479 482 480 template<typename ValueType, typename U> 483 template<typename T, typename HashTranslator>481 template<typename HashTranslator, typename T> 484 482 inline auto ListHashSet<ValueType, U>::find(const T& value) -> iterator 485 483 { … … 491 489 492 490 template<typename ValueType, typename U> 493 template<typename T, typename HashTranslator>491 template<typename HashTranslator, typename T> 494 492 inline auto ListHashSet<ValueType, U>::find(const T& value) const -> const_iterator 495 493 { … … 501 499 502 500 template<typename ValueType, typename U> 503 template<typename T, typename HashTranslator>501 template<typename HashTranslator, typename T> 504 502 inline bool ListHashSet<ValueType, U>::contains(const T& value) const 505 503 { -
trunk/Source/WebCore/ChangeLog
r238503 r238504 1 2018-11-26 Sam Weinig <sam@webkit.org> 2 3 Streamline ListHashSet use in floating object code 4 https://bugs.webkit.org/show_bug.cgi?id=191957 5 6 Reviewed by Alex Christensen. 7 8 Simplify use of ListHashSet by using new raw pointer overloads and 9 making use of reversed order of template arguments in the find() and 10 contains() overloads that take hash translators. 11 12 * rendering/FloatingObjects.cpp: 13 (WebCore::FloatingObjects::remove): 14 Use raw pointer overloads of contains and remove. Remove seperate call 15 to find / check agains end() which is unnecessary as remove() already 16 does that. 17 18 * rendering/FloatingObjects.h: 19 (WebCore::FloatingObjectHashFunctions::hash): 20 (WebCore::FloatingObjectHashFunctions::equal): 21 (WebCore::FloatingObjectHashTranslator::hash): 22 (WebCore::FloatingObjectHashTranslator::equal): 23 Add hash()/equal() overloads for the raw pointer cases. As the FIXME 24 notes, this could be simplified by changing PtrHashBase to use designated 25 bottleneck functions for hash() and equal(). 26 27 * rendering/RenderBlockFlow.cpp: 28 (WebCore::RenderBlockFlow::containsFloat const): 29 (WebCore::RenderBlockFlow::insertFloatingObject): 30 (WebCore::RenderBlockFlow::removeFloatingObject): 31 (WebCore::RenderBlockFlow::hasOverhangingFloat): 32 (WebCore::RenderBlockFlow::addIntrudingFloats): 33 Use simplified calls. 34 35 * rendering/RenderBlockLineLayout.cpp: 36 (WebCore::RenderBlockFlow::layoutRunsAndFloatsInRange): 37 (WebCore::RenderBlockFlow::linkToEndLineIfNeeded): 38 Use simplified calls. 39 1 40 2018-11-26 Jeremy Jones <jeremyj@apple.com> 2 41 -
trunk/Source/WebCore/rendering/FloatingObjects.cpp
r238463 r238504 349 349 void FloatingObjects::remove(FloatingObject* floatingObject) 350 350 { 351 ASSERT((m_set.contains <FloatingObject&, FloatingObjectHashTranslator>(*floatingObject)));351 ASSERT((m_set.contains(floatingObject))); 352 352 decreaseObjectsCount(floatingObject->type()); 353 353 ASSERT(floatingObject->isPlaced() || !floatingObject->isInPlacedTree()); … … 355 355 removePlacedObject(floatingObject); 356 356 ASSERT(!floatingObject->originatingLine()); 357 auto it = m_set.find<FloatingObject&, FloatingObjectHashTranslator>(*floatingObject); 358 if (it == m_set.end()) 359 return; 360 m_set.remove(it); 357 m_set.remove(floatingObject); 361 358 } 362 359 -
trunk/Source/WebCore/rendering/FloatingObjects.h
r235315 r238504 112 112 }; 113 113 114 // FIXME: This could be simplified if we made it inherit from PtrHash<std::unique_ptr<FloatingObject>> and 115 // changed PtrHashBase to have all of its hash and equal functions bottleneck through single functions (as 116 // is done here). That would allow us to only override those master hash and equal functions. 114 117 struct FloatingObjectHashFunctions { 115 static unsigned hash(const std::unique_ptr<FloatingObject>& key) { return PtrHash<RenderBox*>::hash(&key->renderer()); } 116 static bool equal(const std::unique_ptr<FloatingObject>& a, const std::unique_ptr<FloatingObject>& b) { return &a->renderer() == &b->renderer(); } 118 typedef std::unique_ptr<FloatingObject> T; 119 typedef typename WTF::GetPtrHelper<T>::PtrType PtrType; 120 121 static unsigned hash(PtrType key) { return PtrHash<RenderBox*>::hash(&key->renderer()); } 122 static bool equal(PtrType a, PtrType b) { return &a->renderer() == &b->renderer(); } 117 123 static const bool safeToCompareToEmptyOrDeleted = true; 124 125 static unsigned hash(const T& key) { return hash(WTF::getPtr(key)); } 126 static bool equal(const T& a, const T& b) { return equal(WTF::getPtr(a), WTF::getPtr(b)); } 127 static bool equal(PtrType a, const T& b) { return equal(a, WTF::getPtr(b)); } 128 static bool equal(const T& a, PtrType b) { return equal(WTF::getPtr(a), b); } 118 129 }; 119 130 struct FloatingObjectHashTranslator { 120 131 static unsigned hash(const RenderBox& key) { return PtrHash<const RenderBox*>::hash(&key); } 121 static unsigned hash(const FloatingObject& key) { return PtrHash<RenderBox*>::hash(&key.renderer()); }122 132 static bool equal(const std::unique_ptr<FloatingObject>& a, const RenderBox& b) { return &a->renderer() == &b; } 123 static bool equal(const std::unique_ptr<FloatingObject>& a, const FloatingObject& b) { return &a->renderer() == &b.renderer(); }124 133 }; 125 134 -
trunk/Source/WebCore/rendering/RenderBlockFlow.cpp
r238463 r238504 1986 1986 bool RenderBlockFlow::containsFloat(RenderBox& renderer) const 1987 1987 { 1988 return m_floatingObjects && m_floatingObjects->set().contains< RenderBox&,FloatingObjectHashTranslator>(renderer);1988 return m_floatingObjects && m_floatingObjects->set().contains<FloatingObjectHashTranslator>(renderer); 1989 1989 } 1990 1990 … … 2234 2234 // Don't insert the floatingObject again if it's already in the list 2235 2235 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 2236 auto it = floatingObjectSet.find< RenderBox&,FloatingObjectHashTranslator>(floatBox);2236 auto it = floatingObjectSet.find<FloatingObjectHashTranslator>(floatBox); 2237 2237 if (it != floatingObjectSet.end()) 2238 2238 return it->get(); … … 2268 2268 if (m_floatingObjects) { 2269 2269 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 2270 auto it = floatingObjectSet.find< RenderBox&,FloatingObjectHashTranslator>(floatBox);2270 auto it = floatingObjectSet.find<FloatingObjectHashTranslator>(floatBox); 2271 2271 if (it != floatingObjectSet.end()) { 2272 2272 auto& floatingObject = *it->get(); … … 2684 2684 2685 2685 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 2686 const auto it = floatingObjectSet.find< RenderBox&,FloatingObjectHashTranslator>(renderer);2686 const auto it = floatingObjectSet.find<FloatingObjectHashTranslator>(renderer); 2687 2687 if (it == floatingObjectSet.end()) 2688 2688 return false; … … 2710 2710 auto& floatingObject = *prevIt->get(); 2711 2711 if (logicalBottomForFloat(floatingObject) > logicalTopOffset) { 2712 if (!m_floatingObjects || !m_floatingObjects->set().contains <FloatingObject&, FloatingObjectHashTranslator>(floatingObject)) {2712 if (!m_floatingObjects || !m_floatingObjects->set().contains(&floatingObject)) { 2713 2713 // We create the floating object list lazily. 2714 2714 if (!m_floatingObjects) -
trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp
r238463 r238504 1458 1458 auto end = floatingObjectSet.end(); 1459 1459 if (auto* lastFloat = layoutState.floatList().lastFloat()) { 1460 auto lastFloatIterator = floatingObjectSet.find <FloatingObject&, FloatingObjectHashTranslator>(*lastFloat);1460 auto lastFloatIterator = floatingObjectSet.find(lastFloat); 1461 1461 ASSERT(lastFloatIterator != end); 1462 1462 ++lastFloatIterator; … … 1621 1621 auto end = floatingObjectSet.end(); 1622 1622 if (auto* lastFloat = layoutState.floatList().lastFloat()) { 1623 auto lastFloatIterator = floatingObjectSet.find <FloatingObject&, FloatingObjectHashTranslator>(*lastFloat);1623 auto lastFloatIterator = floatingObjectSet.find(lastFloat); 1624 1624 ASSERT(lastFloatIterator != end); 1625 1625 ++lastFloatIterator;
Note:
See TracChangeset
for help on using the changeset viewer.