| Index: Source/core/rendering/OrderIterator.h
|
| diff --git a/Source/core/rendering/OrderIterator.h b/Source/core/rendering/OrderIterator.h
|
| index 8639bdcb1001f7a24c31fcdf2470ab73822bf86d..8704078968c6cd215facd2cacd9f4dfe71643039 100644
|
| --- a/Source/core/rendering/OrderIterator.h
|
| +++ b/Source/core/rendering/OrderIterator.h
|
| @@ -31,6 +31,7 @@
|
| #ifndef OrderIterator_h
|
| #define OrderIterator_h
|
|
|
| +#include "wtf/HashMap.h"
|
| #include "wtf/Noncopyable.h"
|
| #include "wtf/Vector.h"
|
|
|
| @@ -38,6 +39,16 @@ namespace WebCore {
|
|
|
| class RenderBox;
|
|
|
| +// Normally, -1 and 0 are not valid in a HashSet, but these are relatively likel y 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 OrdererValueMapKeyHashTraits : 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; }
|
| +};
|
| +
|
| class OrderIterator {
|
| WTF_MAKE_NONCOPYABLE(OrderIterator);
|
| public:
|
| @@ -52,34 +63,38 @@ public:
|
|
|
| private:
|
| const RenderBox* m_containerBox;
|
| - RenderBox* m_currentChild;
|
| +
|
| // The inline capacity for a single item is used to cover the most
|
| // common case by far: if we only have the default 'order' value 0.
|
| typedef Vector<int, 1> OrderValues;
|
| OrderValues m_orderValues;
|
| - Vector<int>::const_iterator m_orderValuesIterator;
|
| +
|
| + RenderBox* m_currentChild;
|
| + size_t m_currentOrderIndex;
|
| + size_t m_currentChildIndex;
|
| +
|
| + // This HashMap is empty if there is only one value.
|
| + typedef HashMap<int, Vector<RenderBox*>, DefaultHash<int>::Hash, OrdererValueMapKeyHashTraits > OrderedValuesMap;
|
| + OrderedValuesMap m_orderedValues;
|
| };
|
|
|
| class OrderIteratorPopulator {
|
| public:
|
| OrderIteratorPopulator(OrderIterator& iterator)
|
| : m_iterator(iterator)
|
| - , m_anyChildHasDefaultOrderValue(false)
|
| {
|
| // 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);
|
| + m_iterator.m_orderedValues.clear();
|
| }
|
|
|
| ~OrderIteratorPopulator();
|
|
|
| - void collectChild(const RenderBox*);
|
| + void collectChild(RenderBox*);
|
|
|
| private:
|
| - void removeDuplicatedOrderValues();
|
| -
|
| OrderIterator& m_iterator;
|
| - bool m_anyChildHasDefaultOrderValue;
|
| };
|
|
|
| } // namespace WebCore
|
|
|