struct interval_node *interval_insert(struct interval_node *node, struct interval_node **root) { struct interval_node **p, *parent = NULL; LASSERT(!interval_is_intree(node)); p = root; while (*p) { parent = *p; if (extent_equal(&parent->in_extent, &node->in_extent)) return parent; /* max_high field must be updated after each iteration */ if (parent->in_max_high < interval_high(node)) parent->in_max_high = interval_high(node); if (extent_compare(&node->in_extent, &parent->in_extent) < 0) p = &parent->in_left; else p = &parent->in_right; } /* link node into the tree */ node->in_parent = parent; node->in_color = INTERVAL_RED; node->in_left = NULL; node->in_right = NULL; *p = node; interval_insert_color(node, root); node->in_intree = 1; return NULL; }
static inline int node_compare(struct interval_node *n1, struct interval_node *n2) { return extent_compare(&n1->in_extent, &n2->in_extent); }