/* * Remove 'node' from the heap. O(log n) amortized. */ void pairingheap_remove(pairingheap *heap, pairingheap_node *node) { pairingheap_node *children; pairingheap_node *replacement; pairingheap_node *next_sibling; pairingheap_node **prev_ptr; /* * If the removed node happens to be the root node, do it with * pairingheap_remove_first(). */ if (node == heap->ph_root) { (void) pairingheap_remove_first(heap); return; } /* * Before we modify anything, remember the removed node's first_child and * next_sibling pointers. */ children = node->first_child; next_sibling = node->next_sibling; /* * Also find the pointer to the removed node in its previous sibling, or * if this is the first child of its parent, in its parent. */ if (node->prev_or_parent->first_child == node) prev_ptr = &node->prev_or_parent->first_child; else prev_ptr = &node->prev_or_parent->next_sibling; Assert(*prev_ptr == node); /* * If this node has children, make a new subheap of the children and link * the subheap in place of the removed node. Otherwise just unlink this * node. */ if (children) { replacement = merge_children(heap, children); replacement->prev_or_parent = node->prev_or_parent; replacement->next_sibling = node->next_sibling; *prev_ptr = replacement; if (next_sibling) next_sibling->prev_or_parent = replacement; } else { *prev_ptr = next_sibling; if (next_sibling) next_sibling->prev_or_parent = node->prev_or_parent; } }
/* * Extract next item (in order) from search queue * * Returns a GISTSearchItem or NULL. Caller must pfree item when done with it. */ static GISTSearchItem * getNextGISTSearchItem(GISTScanOpaque so) { GISTSearchItem *item; if (!pairingheap_is_empty(so->queue)) { item = (GISTSearchItem *) pairingheap_remove_first(so->queue); } else { /* Done when both heaps are empty */ item = NULL; } /* Return item; caller is responsible to pfree it */ return item; }