Ejemplo n.º 1
0
void dict_merge(dict_t *dest, dict_t *source)
{
    dict_load_t load;
    dnode_t *leftnode = dict_first(dest), *rightnode = dict_first(source);

    assert (dict_similar(dest, source));

    if (source == dest)
        return;

#ifdef NO_FC_SOLVE
    dest->nodecount = 0;
#endif
    load_begin_internal(&load, dest);

    for (;;) {
        if (leftnode != NULL && rightnode != NULL) {
            if (dest->compare(leftnode->key, rightnode->key, source->context) < 0)
                goto copyleft;
            else
                goto copyright;
        } else if (leftnode != NULL) {
            goto copyleft;
        } else if (rightnode != NULL) {
            goto copyright;
        } else {
            assert (leftnode == NULL && rightnode == NULL);
            break;
        }

    copyleft:
        {
            dnode_t *next = dict_next(dest, leftnode);
            #ifndef NDEBUG
            leftnode->left = NULL;      /* suppress assertion in dict_load_next */
            #endif
            dict_load_next(&load, leftnode, leftnode->key);
            leftnode = next;
            continue;
        }

    copyright:
        {
            dnode_t *next = dict_next(source, rightnode);
            #ifndef NDEBUG
            rightnode->left = NULL;
            #endif
            dict_load_next(&load, rightnode, rightnode->key);
            rightnode = next;
            continue;
        }
    }

    dict_clear(source);
    dict_load_end(&load);
}
Ejemplo n.º 2
0
void dict_init_like(dict_t *dict, const dict_t *orig)
{
    dict->compare = orig->compare;
    dict->allocnode = orig->allocnode;
    dict->freenode = orig->freenode;
    dict->context = orig->context;
    dict->nodecount = 0;
    dict->maxcount = orig->maxcount;
    dict->nilnode.left = &dict->nilnode;
    dict->nilnode.right = &dict->nilnode;
    dict->nilnode.parent = &dict->nilnode;
    dict->nilnode.color = dnode_black;
    dict->dupes = orig->dupes;

    assert (dict_similar(dict, orig));
}
Ejemplo n.º 3
0
void dict_init_like(dict_t *dict, const dict_t *orig)
{
    dict->compare = orig->compare;
    /* Removed for fc-solve. */
#if 0
    dict->allocnode = orig->allocnode;
    dict->freenode = orig->freenode;
#else
#endif
    dict->context = orig->context;
#ifdef NO_FC_SOLVE
    dict->nodecount = 0;
    dict->maxcount = orig->maxcount;
#endif
    dict->nilnode.left = &dict->nilnode;
    dict->nilnode.right = &dict->nilnode;
    dict->nilnode.parent = &dict->nilnode;
    dict->nilnode.color = dnode_black;
#ifdef NO_FC_SOLVE
    dict->dupes = orig->dupes;
#endif

    assert (dict_similar(dict, orig));
}