| 455 | // Change node's parent to new_parent |
| 456 | template <typename T> |
| 457 | void |
| 458 | Tree<T>::_change_parent(Node *node, Node *new_parent, bool exclusive) |
| 459 | { |
| 460 | ink_release_assert(node->parent != nullptr); |
| 461 | node->parent->children.remove(node); |
| 462 | if (node->queued) { |
| 463 | node->parent->queue->erase(node->entry); |
| 464 | node->queued = false; |
| 465 | |
| 466 | Node *current = node->parent; |
| 467 | while (current->queue->empty() && !current->active && current->parent != nullptr) { |
| 468 | current->parent->queue->erase(current->entry); |
| 469 | current->queued = false; |
| 470 | current = current->parent; |
| 471 | } |
| 472 | } |
| 473 | |
| 474 | node->parent = nullptr; |
| 475 | if (exclusive) { |
| 476 | while (Node *child = new_parent->children.pop()) { |
| 477 | if (child->queued) { |
| 478 | child->parent->queue->erase(child->entry); |
| 479 | node->queue->push(child->entry); |
| 480 | } |
| 481 | |
| 482 | node->children.push(child); |
| 483 | ink_release_assert(child != node); |
| 484 | child->parent = node; |
| 485 | } |
| 486 | } |
| 487 | |
| 488 | new_parent->children.push(node); |
| 489 | ink_release_assert(node != new_parent); |
| 490 | node->parent = new_parent; |
| 491 | |
| 492 | if (node->active || !node->queue->empty()) { |
| 493 | Node *current = node; |
| 494 | while (current->parent != nullptr && !current->queued) { |
| 495 | current->parent->queue->push(current->entry); |
| 496 | current->queued = true; |
| 497 | current = current->parent; |
| 498 | } |
| 499 | } |
| 500 | } |
| 501 | |
| 502 | template <typename T> |
| 503 | Node * |