示例#1
0
文件: rb-tree.c 项目: cfengine/core
bool RBTreeIteratorNext(RBTreeIterator *iter, void **key, void **value)
{
    if (Peek_(iter, key, value))
    {
        iter->curr = Next_(iter->tree, iter->curr);
        return true;
    }
    else
    {
        return false;
    }
}
示例#2
0
static char	*find_owner(int uid)
{ OwnerDetails	*node;
  char		*temp;
  
  for (node = Head_(OwnerDetails, OwnerList);
       !EndOfList_(node);
       node = Next_(OwnerDetails, node))
   if (node->Uid eq uid)
    return(node->Name);

  node = New(OwnerDetails);
  if (node eq Null(OwnerDetails))
   return("<unknown>");
  node->Uid	= uid;
  temp		= (char *) RmWhoIs(uid);
  if (temp eq Null(char))
   strcpy(node->Name, "<unknown>");
  else
示例#3
0
文件: rb-tree.c 项目: cfengine/core
bool RBTreeRemove(RBTree *tree, const void *key)
{
    assert(!tree->nil->red);

    RBNode *z = Get_(tree, key);
    if (z == tree->nil)
    {
        return false;
    }

    RBNode *y = ((z->left == tree->nil) || (z->right == tree->nil)) ? z : Next_(tree, z);
    RBNode *x = (y->left == tree->nil) ? y->right : y->left;

    x->parent = y->parent;
    if (tree->root == x->parent)
    {
        tree->root->left = x;
    }
    else
    {
        if (y == y->parent->left)
        {
            y->parent->left = x;
        }
        else
        {
            y->parent->right = x;
        }
    }

    if (z != y)
    {
        assert(y != tree->nil);
        assert(!tree->nil->red);

        if (!y->red)
        {
            RemoveFix_(tree, x);
        }

        y->left = z->left;
        y->right = z->right;
        y->parent = z->parent;
        y->red = z->red;
        z->left->parent = y;
        z->right->parent = y;

        if (z == z->parent->left)
        {
            z->parent->left = y;
        }
        else
        {
            z->parent->right = y;
        }
        NodeDestroy_(tree, z);
    }
    else
    {
        if (!y->red)
        {
            RemoveFix_(tree, x);
        }
        NodeDestroy_(tree, y);
    }

    assert(!tree->nil->red);

    tree->size--;
    return true;
}
示例#4
0
文件: rb-tree.c 项目: cfengine/core
RBTree *RBTreeCopy(const RBTree *tree, RBTreePredicate *filter, void *user_data)
{
    RBNode **nodes = xmalloc(tree->size * sizeof(RBNode *));
    size_t node_count = 0;

    {
        RBTreeIterator *iter = NULL;
        for (iter = RBTreeIteratorNew(tree); iter->curr != iter->tree->nil; iter->curr = Next_(iter->tree, iter->curr))
        {
            if (!filter || filter(iter->curr->key, iter->curr->value, user_data))
            {
                nodes[node_count] = iter->curr;
                node_count++;
            }
        }
        RBTreeIteratorDestroy(iter);
    }

    RBTree *copy = RBTreeNew(tree->KeyCopy, tree->KeyCompare, tree->KeyDestroy,
                             tree->ValueCopy, tree->ValueCompare, tree->ValueDestroy);

    RBNode *node = NULL;
    // [0, 1, 2, 3, 4]
    if ((node_count % 2) != 0)
    {
        node = nodes[node_count / 2];
        RBTreePut(copy, node->key, node->value);
        node_count--;
    }
    else
    {
        node = copy->root;
    }

    assert((node_count % 2) == 0);

    // [0, 1, 2, 3]
    for (size_t i = 0; i < (node_count / 2); i += 1)
    {
        node = nodes[(node_count / 2) + i];
        RBTreePut(copy, node->key, node->value);

        node = nodes[(node_count / 2) - i - 1];
        RBTreePut(copy, node->key, node->value);
    }

    free(nodes);

    VerifyTree_(copy);

    return copy;
}