| 325 | }; |
| 326 | |
| 327 | static QVector<LayoutGraphNode *> getPrioritySortedConnectedComponents(QVector<LayoutGraphNode *> &nodeList) |
| 328 | { |
| 329 | QVector<LayoutGraphNode *> connectedComponents; |
| 330 | QHash<LayoutGraphNode *, VisitorState> visitedComponents; |
| 331 | Q_FOREACH (LayoutGraphNode *node, nodeList) |
| 332 | visitedComponents[node] = Unknown; |
| 333 | for (int i = 0; i < nodeList.size(); ++i) { |
| 334 | LayoutGraphNode *curNode = nodeList[i]; |
| 335 | LayoutGraphNode *representativeNode = curNode; |
| 336 | if (visitedComponents[curNode] != Visited) { |
| 337 | QStack<LayoutGraphNode *> stack; |
| 338 | stack.push(curNode); |
| 339 | while (!stack.isEmpty()) { |
| 340 | curNode = stack.pop(); |
| 341 | Q_ASSERT(visitedComponents[curNode] != Visited); |
| 342 | visitedComponents[curNode] = Visited; |
| 343 | if (curNode->bottomSuccesor && visitedComponents[curNode->bottomSuccesor] != Visited) |
| 344 | stack.push(curNode->bottomSuccesor); |
| 345 | if (curNode->leftSuccesor && visitedComponents[curNode->leftSuccesor] != Visited) |
| 346 | stack.push(curNode->leftSuccesor); |
| 347 | if (curNode->sharedSuccesor && visitedComponents[curNode->sharedSuccesor] != Visited) |
| 348 | stack.push(curNode->sharedSuccesor); |
| 349 | if (curNode->priority < representativeNode->priority) |
| 350 | representativeNode = curNode; |
| 351 | } |
| 352 | connectedComponents.append(representativeNode); |
| 353 | } |
| 354 | } |
| 355 | std::sort(connectedComponents.begin(), connectedComponents.end(), ConnectedComponentsComparator()); |
| 356 | return connectedComponents; |
| 357 | } |
| 358 | |
| 359 | struct PriorityComparator |
| 360 | { |
no test coverage detected