Unreviewed, rolling out r157916.
[WebKit-https.git] / Source / WebCore / rendering / RenderFlexibleBox.cpp
index b1be52c..2d5bc99 100644 (file)
 
 namespace WebCore {
 
+// Normally, -1 and 0 are not valid in a HashSet, but these are relatively likely order: values. Instead,
+// we make the two smallest int values invalid order: values (in the css parser code we clamp them to
+// int min + 2).
+struct RenderFlexibleBox::OrderHashTraits : WTF::GenericHashTraits<int> {
+    static const bool emptyValueIsZero = false;
+    static int emptyValue() { return std::numeric_limits<int>::min(); }
+    static void constructDeletedValue(int& slot) { slot = std::numeric_limits<int>::min() + 1; }
+    static bool isDeletedValue(int value) { return value == std::numeric_limits<int>::min() + 1; }
+};
+
 RenderFlexibleBox::OrderIterator::OrderIterator(const RenderFlexibleBox* flexibleBox)
     : m_flexibleBox(flexibleBox)
     , m_currentChild(0)
@@ -46,16 +56,11 @@ RenderFlexibleBox::OrderIterator::OrderIterator(const RenderFlexibleBox* flexibl
 {
 }
 
-void RenderFlexibleBox::OrderIterator::setOrderValues(const OrderValues& orderValues)
+void RenderFlexibleBox::OrderIterator::setOrderValues(const OrderHashSet& orderValues)
 {
     reset();
-    m_orderValues = orderValues;
-    if (m_orderValues.size() < 2)
-        return;
-
+    copyToVector(orderValues, m_orderValues);
     std::sort(m_orderValues.begin(), m_orderValues.end());
-    auto nextElement = std::unique(m_orderValues.begin(), m_orderValues.end());
-    m_orderValues.shrinkCapacity(nextElement - m_orderValues.begin());
 }
 
 RenderBox* RenderFlexibleBox::OrderIterator::first()
@@ -343,7 +348,7 @@ void RenderFlexibleBox::layoutBlock(bool relayoutChildren, LayoutUnit)
     dirtyForLayoutFromPercentageHeightDescendants();
 
     Vector<LineContext> lineContexts;
-    OrderIterator::OrderValues orderValues;
+    OrderHashSet orderValues;
     computeMainAxisPreferredSizes(orderValues);
     m_orderIterator.setOrderValues(orderValues);
 
@@ -903,16 +908,10 @@ LayoutUnit RenderFlexibleBox::computeChildMarginValue(const Length& margin)
     return minimumValueForLength(margin, availableSize);
 }
 
-void RenderFlexibleBox::computeMainAxisPreferredSizes(OrderIterator::OrderValues& orderValues)
+void RenderFlexibleBox::computeMainAxisPreferredSizes(OrderHashSet& orderValues)
 {
-    ASSERT(orderValues.isEmpty());
-
     for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
-        // Avoid growing the vector for the common-case default value of 0. This optimizes the most common case which is
-        // one or a few values with the default order 0
-        int order = child->style()->order();
-        if (orderValues.isEmpty() || orderValues.last() != order)
-            orderValues.append(order);
+        orderValues.add(child->style()->order());
 
         if (child->isOutOfFlowPositioned())
             continue;