Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(910)

Unified Diff: Source/core/rendering/OrderIterator.cpp

Issue 18162016: OrderIterator should be O(number of children) (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/OrderIterator.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/OrderIterator.cpp
diff --git a/Source/core/rendering/OrderIterator.cpp b/Source/core/rendering/OrderIterator.cpp
index d55779cc4cf8de6523a7a428241a3f9b5530328a..1bc7bc2929cc8cbb0718a96ca7f6fd928df9e97d 100644
--- a/Source/core/rendering/OrderIterator.cpp
+++ b/Source/core/rendering/OrderIterator.cpp
@@ -38,7 +38,8 @@ namespace WebCore {
OrderIterator::OrderIterator(const RenderBox* containerBox)
: m_containerBox(containerBox)
, m_currentChild(0)
- , m_orderValuesIterator(0)
+ , m_currentOrderIndex(0)
+ , m_currentChildIndex(0)
{
}
@@ -50,73 +51,50 @@ RenderBox* OrderIterator::first()
RenderBox* OrderIterator::next()
{
- do {
- if (!m_currentChild) {
- if (m_orderValuesIterator == m_orderValues.end())
- return 0;
- if (m_orderValuesIterator) {
- ++m_orderValuesIterator;
- if (m_orderValuesIterator == m_orderValues.end())
- return 0;
- } else {
- m_orderValuesIterator = m_orderValues.begin();
- }
-
- m_currentChild = m_containerBox->firstChildBox();
- } else {
- m_currentChild = m_currentChild->nextSiblingBox();
+ for (; m_currentOrderIndex < m_orderValues.size(); ++m_currentOrderIndex) {
+ const Vector<RenderBox*>& currentOrderChildren = m_orderedValues.get(m_orderValues[m_currentOrderIndex]);
+ ASSERT(!currentOrderChildren.isEmpty());
+ for (; m_currentChildIndex < currentOrderChildren.size(); ++m_currentChildIndex) {
tony 2013/07/19 17:36:31 Using a for loop here is weird since you always re
+ m_currentChild = currentOrderChildren[m_currentChildIndex];
+ ++m_currentChildIndex;
+ return m_currentChild;
}
- } while (!m_currentChild || m_currentChild->style()->order() != *m_orderValuesIterator);
+ m_currentChildIndex = 0;
+ }
+
+ m_currentChild = 0;
return m_currentChild;
}
void OrderIterator::reset()
{
+ m_currentOrderIndex = 0;
+ m_currentChildIndex = 0;
m_currentChild = 0;
- m_orderValuesIterator = 0;
}
OrderIteratorPopulator::~OrderIteratorPopulator()
{
m_iterator.reset();
- if (m_anyChildHasDefaultOrderValue)
- m_iterator.m_orderValues.append(0);
-
- if (m_iterator.m_orderValues.size() > 1)
- removeDuplicatedOrderValues();
+ std::sort(m_iterator.m_orderValues.begin(), m_iterator.m_orderValues.end());
// Ensure that we release any extra memory we hold onto.
m_iterator.m_orderValues.shrinkToFit();
}
-void OrderIteratorPopulator::removeDuplicatedOrderValues()
-{
- OrderIterator::OrderValues& orderValues = m_iterator.m_orderValues;
-
- std::sort(orderValues.begin(), orderValues.end());
-
- int previous = orderValues[0];
- size_t uniqueItemIndex = 0;
- for (size_t i = 1; i < orderValues.size(); ++i) {
- int current = orderValues[i];
- if (current == previous)
- continue;
- ++uniqueItemIndex;
- std::swap(orderValues[i], orderValues[uniqueItemIndex]);
- previous = current;
- }
- orderValues.shrink(uniqueItemIndex + 1);
-}
-
-void OrderIteratorPopulator::collectChild(const RenderBox* child)
+void OrderIteratorPopulator::collectChild(RenderBox* child)
{
- // Avoid growing the vector for the common-case default value of 0.
- if (int order = child->style()->order())
+ int order = child->style()->order();
+
+ // FIXME: Ideally we would want to avoid inserting into the HashMap for the common case where there are only items
+ // with the default 'order' 0. The current API is designed to blend into a single iteration which makes having a
+ // slower fallback difficult without having to store the children (grid items may not be contiguous in DOM order).
+ OrderIterator::OrderedValuesMap::AddResult result = m_iterator.m_orderedValues.add(order, Vector<RenderBox*>());
tony 2013/07/19 17:36:31 Can we use a std::map<int, Vector<RenderBox*> > he
+ result.iterator->value.append(child);
+ if (result.isNewEntry)
m_iterator.m_orderValues.append(order);
- else
- m_anyChildHasDefaultOrderValue = true;
}
} // namespace WebCore
« no previous file with comments | « Source/core/rendering/OrderIterator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698