static DirectNode * tree_node_insert (DirectTree *tree, DirectNode *node, void *key, void *value, int *inserted) { int cmp; int old_balance; if (!node) { *inserted = 1; return tree_node_new (tree, key, value); } cmp = key - node->key; if (cmp == 0) { node->value = value; return node; } if (cmp < 0) { if (node->left) { old_balance = node->left->balance; node->left = tree_node_insert (tree, node->left, key, value, inserted); if ((old_balance != node->left->balance) && node->left->balance) node->balance -= 1; } else { *inserted = 1; node->left = tree_node_new (tree, key, value); node->balance -= 1; } } else if (cmp > 0) { if (node->right) { old_balance = node->right->balance; node->right = tree_node_insert (tree, node->right, key, value, inserted); if ((old_balance != node->right->balance) && node->right->balance) node->balance += 1; } else { *inserted = 1; node->right = tree_node_new (tree, key, value); node->balance += 1; } } if (*inserted && (node->balance < -1 || node->balance > 1)) node = tree_node_balance (node); return node; }
TreeNode *tree_node_insert (Tree *tree, TreeNode *root, Object *key, void *value) { if (root == tree->nil) { if (!(root = node_create (tree, key, 1))) { error (FunctionCall); return NULL; } root->value = value; } else { TreeNode *node = NULL; int direction; if (root->key->id == key->id) { error (InvalidOperation); return NULL; } direction = root->key->id < key->id; if (!(node = tree_node_insert (tree, root->link[direction], key, value))) { return NULL; } root->link[direction] = node; root = skew (root); root = split (root); } return root; }
void direct_tree_insert( DirectTree *tree, void *key, void *value ) { int inserted = 0; int fast_key = (unsigned int) key - 32; if (fast_key >= 0 && fast_key < 96) tree->fast_keys[fast_key] = value; else tree->root = tree_node_insert( tree, tree->root, key, value, &inserted ); }
void direct_tree_insert( DirectTree *tree, void *key, void *value ) { int inserted = 0; unsigned long fast_key = (unsigned long) key; if (fast_key < 128) tree->fast_keys[fast_key] = value; else tree->root = tree_node_insert( tree, tree->root, key, value, &inserted ); }
bool tree_insert (Tree *tree, Object *key, void *value) { TreeNode *node; if (!tree) { error (InvalidArgument); return false; } if (!key) { error (InvalidArgument); return false; } if (!size_t_add (tree->count, 1, NULL)) { error (Overflow); return false; } if (!(node = tree_node_insert (tree, tree->root, key, value))) { return false; } tree->root = node; tree->count++; return true; }