void NodeSet::sort() const { if (m_isSorted) return; unsigned nodeCount = m_nodes.size(); if (nodeCount < 2) { const_cast<bool&>(m_isSorted) = true; return; } if (nodeCount > traversalSortCutoff) { traversalSort(); return; } bool containsAttributeNodes = false; WillBeHeapVector<NodeSetVector> parentMatrix(nodeCount); for (unsigned i = 0; i < nodeCount; ++i) { NodeSetVector& parentsVector = parentMatrix[i]; Node* n = m_nodes[i].get(); parentsVector.append(n); if (n->isAttributeNode()) { n = toAttr(n)->ownerElement(); parentsVector.append(n); containsAttributeNodes = true; } while ((n = n->parentNode())) parentsVector.append(n); } sortBlock(0, nodeCount, parentMatrix, containsAttributeNodes); // It is not possible to just assign the result to m_nodes, because some // nodes may get dereferenced and destroyed. WillBeHeapVector<RefPtrWillBeMember<Node> > sortedNodes; sortedNodes.reserveInitialCapacity(nodeCount); for (unsigned i = 0; i < nodeCount; ++i) sortedNodes.append(parentMatrix[i][0]); const_cast<WillBeHeapVector<RefPtrWillBeMember<Node> >&>(m_nodes).swap(sortedNodes); }
void NodeSet::sort() const { if (m_isSorted) return; unsigned nodeCount = m_nodes.size(); if (nodeCount < 2) { m_isSorted = true; return; } if (nodeCount > traversalSortCutoff) { traversalSort(); return; } bool containsAttributeNodes = false; Vector<Vector<Node*>> parentMatrix(nodeCount); for (unsigned i = 0; i < nodeCount; ++i) { Vector<Node*>& parentsVector = parentMatrix[i]; Node* node = m_nodes[i].get(); parentsVector.append(node); if (is<Attr>(*node)) { node = downcast<Attr>(*node).ownerElement(); parentsVector.append(node); containsAttributeNodes = true; } while ((node = node->parentNode())) parentsVector.append(node); } sortBlock(0, nodeCount, parentMatrix, containsAttributeNodes); // It is not possible to just assign the result to m_nodes, because some nodes may get dereferenced and destroyed. Vector<RefPtr<Node>> sortedNodes; sortedNodes.reserveInitialCapacity(nodeCount); for (unsigned i = 0; i < nodeCount; ++i) sortedNodes.append(parentMatrix[i][0]); m_nodes = WTF::move(sortedNodes); m_isSorted = true; }