summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/OrderIterator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/OrderIterator.cpp')
-rw-r--r--Source/WebCore/rendering/OrderIterator.cpp67
1 files changed, 40 insertions, 27 deletions
diff --git a/Source/WebCore/rendering/OrderIterator.cpp b/Source/WebCore/rendering/OrderIterator.cpp
index e09924f97..fade9388c 100644
--- a/Source/WebCore/rendering/OrderIterator.cpp
+++ b/Source/WebCore/rendering/OrderIterator.cpp
@@ -32,31 +32,16 @@
#include "config.h"
#include "OrderIterator.h"
-#include "RenderFlexibleBox.h"
-#include "RenderGrid.h"
+#include "RenderBox.h"
namespace WebCore {
-static const int cInvalidIndex = -1;
-
OrderIterator::OrderIterator(RenderBox& containerBox)
: m_containerBox(containerBox)
{
reset();
}
-void OrderIterator::setOrderValues(OrderValues&& orderValues)
-{
- reset();
- m_orderValues = std::move(orderValues);
- if (m_orderValues.size() < 2)
- return;
-
- 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* OrderIterator::first()
{
reset();
@@ -65,25 +50,22 @@ RenderBox* OrderIterator::first()
RenderBox* OrderIterator::next()
{
- int endIndex = m_orderValues.size();
do {
if (m_currentChild) {
m_currentChild = m_currentChild->nextSiblingBox();
continue;
}
- if (m_orderIndex == endIndex)
- return nullptr;
-
- if (m_orderIndex != cInvalidIndex) {
- ++m_orderIndex;
- if (m_orderIndex == endIndex)
- return nullptr;
- } else
+ if (m_orderIndex)
+ ++m_orderIndex.value();
+ else
m_orderIndex = 0;
+ if (m_orderIndex.value() >= m_orderValues.size())
+ return nullptr;
+
m_currentChild = m_containerBox.firstChildBox();
- } while (!m_currentChild || m_currentChild->style().order() != m_orderValues[m_orderIndex]);
+ } while (!m_currentChild || m_currentChild->style().order() != m_orderValues[m_orderIndex.value()]);
return m_currentChild;
}
@@ -91,7 +73,38 @@ RenderBox* OrderIterator::next()
void OrderIterator::reset()
{
m_currentChild = nullptr;
- m_orderIndex = cInvalidIndex;
+ m_orderIndex = std::nullopt;
+}
+
+OrderIteratorPopulator::OrderIteratorPopulator(OrderIterator& iterator)
+ : m_iterator(iterator)
+{
+ // Note that we don't release the memory here, we only invalidate the size
+ // This avoids unneeded reallocation if the size ends up not changing.
+ m_iterator.m_orderValues.shrink(0);
}
+OrderIteratorPopulator::~OrderIteratorPopulator()
+{
+ m_iterator.reset();
+
+ if (m_iterator.m_orderValues.size() > 1)
+ removeDuplicatedOrderValues();
+}
+
+void OrderIteratorPopulator::removeDuplicatedOrderValues()
+{
+ auto& orderValues = m_iterator.m_orderValues;
+
+ std::sort(orderValues.begin(), orderValues.end());
+ auto nextElement = std::unique(orderValues.begin(), orderValues.end());
+ orderValues.shrinkCapacity(nextElement - orderValues.begin());
+}
+
+void OrderIteratorPopulator::collectChild(const RenderBox& child)
+{
+ m_iterator.m_orderValues.append(child.style().order());
+}
+
+
} // namespace WebCore