int map_insert(map * m, void *key, void *value) { map_node *p = m->root.left, *q; int cr; if (!p) { m->root.left = map_node_new(key, value, &(m->root)); return 1; } while ((cr = m->comp_fn(key, p->key))) { if (cr > 0) { if (!p->right) { q = map_node_new(key, value, p); p->right = q; if (++p->balance) goto do_balance; return 1; } p = p->right; } else { if (!p->left) { q = map_node_new(key, value, p); p->left = q; if (--p->balance) goto do_balance; return 1; } p = p->left; } } return 0; do_balance: do { q = p->parent; if (!q->parent) return 1; if (q->left == p) { q->balance--; if (q->balance < -2) MAP_BUG(); if (q->balance == -2) { if (map_do_balance(q)) break; MAP_BUG(); } } else { q->balance++; if (q->balance > 2) MAP_BUG(); if (q->balance == 2) { if (map_do_balance(q)) break; MAP_BUG(); } } p = q; } while (q->balance); return 1; }
void map_insert(map_t * handle, void * key, void * val) { binomial_tree_node_t * curr; map_node_t * cval; map_node_t * node = map_node_new(key, val); int rc; curr = binomial_tree_get_root(handle->tree); while (1) { cval = (map_node_t*)binomial_tree_node_get_value(curr); if (cval == NULL) { if (binomial_tree_node_set_value(curr, cval, node) == 0) { binomial_tree_node_release(curr); break; } continue; } if (cval->flag) { curr = binomial_tree_node_get_right(curr); continue; } rc = handle->cmp_func(node->key, cval->key); if (rc < 0) { curr = binomial_tree_node_get_left(curr); } else if (rc > 0) { curr = binomial_tree_node_get_right(curr); } else { if (binomial_tree_node_set_value(curr, cval, node) == 0) { binomial_tree_node_release(curr); break; } } } }