/* The right rotation "pivots" around the link from node to node->left, and * - node will be linked to node->left's right child, and * - node->left's right child will be linked to node's left child. */ static void __rotate_right(struct interval_node *node, struct interval_node **root) { struct interval_node *left = node->in_left; struct interval_node *parent = node->in_parent; node->in_left = left->in_right; if (node->in_left) left->in_right->in_parent = node; left->in_right = node; left->in_parent = parent; if (parent) { if (node_is_right_child(node)) parent->in_right = left; else parent->in_left = left; } else { *root = left; } node->in_parent = left; /* update max_high for node and left */ __rotate_change_maxhigh(node, left); }
static struct interval_node *interval_next(struct interval_node *node) { if (!node) return NULL; if (node->in_right) return interval_first(node->in_right); while (node->in_parent && node_is_right_child(node)) node = node->in_parent; return node->in_parent; }
static struct interval_node *interval_next(struct interval_node *node) { ENTRY; if (!node) RETURN(NULL); if (node->in_right) RETURN(interval_first(node->in_right)); while (node->in_parent && node_is_right_child(node)) node = node->in_parent; RETURN(node->in_parent); }