/* * Extend a priority search tree so that it can store a node with heap_index * max_heap_index. In the worst case, this algorithm takes O((log n)^2). * However, this function is used rarely and the common case performance is * not bad. */ static struct prio_tree_node *prio_tree_expand(struct prio_tree_root *root, struct prio_tree_node *node, unsigned long max_heap_index) { struct prio_tree_node *prev; if (max_heap_index > prio_tree_maxindex(root->index_bits)) root->index_bits++; prev = node; INIT_PRIO_TREE_NODE(node); while (max_heap_index > prio_tree_maxindex(root->index_bits)) { struct prio_tree_node *tmp = root->prio_tree_node; root->index_bits++; if (prio_tree_empty(root)) continue; prio_tree_remove(root, root->prio_tree_node); INIT_PRIO_TREE_NODE(tmp); prio_set_parent(prev, tmp, true); prev = tmp; } if (!prio_tree_empty(root)) prio_set_parent(prev, root->prio_tree_node, true); root->prio_tree_node = node; return node; }
/* * Extend a priority search tree so that it can store a node with heap_index * max_heap_index. In the worst case, this algorithm takes O((log n)^2). * However, this function is used rarely and the common case performance is * not bad. */ static struct prio_tree_node *prio_tree_expand(struct prio_tree_root *root, struct prio_tree_node *node, unsigned long max_heap_index) { struct prio_tree_node *first = NULL, *prev, *last = NULL; if (max_heap_index > prio_tree_maxindex(root->index_bits)) root->index_bits++; while (max_heap_index > prio_tree_maxindex(root->index_bits)) { root->index_bits++; if (prio_tree_empty(root)) continue; if (first == NULL) { first = root->prio_tree_node; prio_tree_remove(root, root->prio_tree_node); INIT_PRIO_TREE_NODE(first); last = first; } else { prev = last; last = root->prio_tree_node; prio_tree_remove(root, root->prio_tree_node); INIT_PRIO_TREE_NODE(last); prev->left = last; last->parent = prev; } } INIT_PRIO_TREE_NODE(node); if (first) { node->left = first; first->parent = node; } else last = node; if (!prio_tree_empty(root)) { last->left = root->prio_tree_node; last->left->parent = last; } root->prio_tree_node = node; return node; }