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

Side by Side Diff: Source/core/rendering/OrderIterator.cpp

Issue 19661006: Revert last week's OrderIterator changes (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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/rendering/OrderIterator.h ('k') | Source/core/rendering/RenderFlexibleBox.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 20 matching lines...) Expand all
31 #include "config.h" 31 #include "config.h"
32 #include "core/rendering/OrderIterator.h" 32 #include "core/rendering/OrderIterator.h"
33 33
34 #include "core/rendering/RenderBox.h" 34 #include "core/rendering/RenderBox.h"
35 35
36 namespace WebCore { 36 namespace WebCore {
37 37
38 OrderIterator::OrderIterator(const RenderBox* containerBox) 38 OrderIterator::OrderIterator(const RenderBox* containerBox)
39 : m_containerBox(containerBox) 39 : m_containerBox(containerBox)
40 , m_currentChild(0) 40 , m_currentChild(0)
41 , m_currentOrderIndex(0) 41 , m_orderValuesIterator(0)
42 , m_currentChildIndex(0)
43 { 42 {
44 } 43 }
45 44
46 RenderBox* OrderIterator::first() 45 RenderBox* OrderIterator::first()
47 { 46 {
48 reset(); 47 reset();
49 return next(); 48 return next();
50 } 49 }
51 50
52 RenderBox* OrderIterator::next() 51 RenderBox* OrderIterator::next()
53 { 52 {
54 for (; m_currentOrderIndex < m_orderValues.size(); ++m_currentOrderIndex) { 53 do {
55 const Vector<RenderBox*>& currentOrderChildren = m_orderedValues.get(m_o rderValues[m_currentOrderIndex]); 54 if (!m_currentChild) {
56 ASSERT(!currentOrderChildren.isEmpty()); 55 if (m_orderValuesIterator == m_orderValues.end())
57 for (; m_currentChildIndex < currentOrderChildren.size(); ++m_currentChi ldIndex) { 56 return 0;
58 m_currentChild = currentOrderChildren[m_currentChildIndex]; 57 if (m_orderValuesIterator) {
59 ++m_currentChildIndex; 58 ++m_orderValuesIterator;
60 return m_currentChild; 59 if (m_orderValuesIterator == m_orderValues.end())
60 return 0;
61 } else {
62 m_orderValuesIterator = m_orderValues.begin();
63 }
64
65 m_currentChild = m_containerBox->firstChildBox();
66 } else {
67 m_currentChild = m_currentChild->nextSiblingBox();
61 } 68 }
69 } while (!m_currentChild || m_currentChild->style()->order() != *m_orderValu esIterator);
62 70
63 m_currentChildIndex = 0;
64 }
65
66 m_currentChild = 0;
67 return m_currentChild; 71 return m_currentChild;
68 } 72 }
69 73
70 void OrderIterator::reset() 74 void OrderIterator::reset()
71 { 75 {
72 m_currentOrderIndex = 0;
73 m_currentChildIndex = 0;
74 m_currentChild = 0; 76 m_currentChild = 0;
75 } 77 m_orderValuesIterator = 0;
76
77 void OrderIterator::invalidate()
78 {
79 // Note that we don't release the memory here, we only invalidate the size.
80 // This avoids unneeded reallocation if the size ends up not changing.
81 m_orderValues.shrink(0);
82 m_orderedValues.clear();
83
84 reset();
85 } 78 }
86 79
87 OrderIteratorPopulator::~OrderIteratorPopulator() 80 OrderIteratorPopulator::~OrderIteratorPopulator()
88 { 81 {
89 m_iterator.reset(); 82 m_iterator.reset();
90 83
91 std::sort(m_iterator.m_orderValues.begin(), m_iterator.m_orderValues.end()); 84 if (m_anyChildHasDefaultOrderValue)
85 m_iterator.m_orderValues.append(0);
86
87 if (m_iterator.m_orderValues.size() > 1)
88 removeDuplicatedOrderValues();
92 89
93 // Ensure that we release any extra memory we hold onto. 90 // Ensure that we release any extra memory we hold onto.
94 m_iterator.m_orderValues.shrinkToFit(); 91 m_iterator.m_orderValues.shrinkToFit();
95 } 92 }
96 93
97 void OrderIteratorPopulator::collectChild(RenderBox* child) 94 void OrderIteratorPopulator::removeDuplicatedOrderValues()
98 { 95 {
99 int order = child->style()->order(); 96 OrderIterator::OrderValues& orderValues = m_iterator.m_orderValues;
100 97
101 // FIXME: Ideally we would want to avoid inserting into the HashMap for the common case where there are only items 98 std::sort(orderValues.begin(), orderValues.end());
102 // with the default 'order' 0. The current API is designed to blend into a s ingle iteration which makes having a 99
103 // slower fallback difficult without having to store the children (grid item s may not be contiguous in DOM order). 100 int previous = orderValues[0];
104 OrderIterator::OrderedValuesMap::AddResult result = m_iterator.m_orderedValu es.add(order, Vector<RenderBox*>()); 101 size_t uniqueItemIndex = 0;
105 result.iterator->value.append(child); 102 for (size_t i = 1; i < orderValues.size(); ++i) {
106 if (result.isNewEntry) 103 int current = orderValues[i];
104 if (current == previous)
105 continue;
106 ++uniqueItemIndex;
107 std::swap(orderValues[i], orderValues[uniqueItemIndex]);
108 previous = current;
109 }
110 orderValues.shrink(uniqueItemIndex + 1);
111 }
112
113 void OrderIteratorPopulator::collectChild(const RenderBox* child)
114 {
115 // Avoid growing the vector for the common-case default value of 0.
116 if (int order = child->style()->order())
107 m_iterator.m_orderValues.append(order); 117 m_iterator.m_orderValues.append(order);
118 else
119 m_anyChildHasDefaultOrderValue = true;
108 } 120 }
109 121
110 } // namespace WebCore 122 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/OrderIterator.h ('k') | Source/core/rendering/RenderFlexibleBox.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698