Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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 );
}
Example #4
0
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 );
}
Example #5
0
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;
}