Example #1
0
char comps_set_cmp(COMPS_Set *set1, COMPS_Set *set2) {
    unsigned int x, index;
    COMPS_Set *not_processed1, *not_processed2;
    COMPS_HSListItem *it;
    void *item;//, *tmpdata;
    char ret;
    int at;

    not_processed1 = comps_set_create();
    not_processed2 = comps_set_create();
    comps_set_init(not_processed1, &comps_set_index_clone,
                                   &comps_set_index_clone,
                                   &free, &comps_set_index_cmp);
    comps_set_init(not_processed2, &comps_set_index_clone,
                                   &comps_set_index_clone,
                                   &free, &comps_set_index_cmp);
    for (x = 0, it = set1->data->first; it!= NULL; it = it->next, x++) {
        comps_hslist_append(not_processed1->data, &x, 1);
    }
    for (x = 0, it = set2->data->first; it!= NULL; it = it->next, x++) {
        comps_hslist_append(not_processed2->data, &x, 1);
    }
    it = set1->data->first;

    index = 0;
    ret = 0;
    while (!comps_set_is_empty(not_processed1) &&
           !comps_set_is_empty(not_processed2)) {
        if ((at = comps_set_at(set2, it->data)) != -1) {
            item = comps_set_remove(not_processed1, (void*)&index);
            free(item);
            item = comps_set_remove(not_processed2 , (void*)&at);
            free(item);
            //tmpdata = comps_hslist_data_at(set2->data, at);
        } else {
            ret = 2;
            break;
        }
        it = it->next;
        index++;
        if (it == NULL) break;
    }
    if (ret == 0) {
        if (comps_set_is_empty(not_processed1)) {
            /*if (comps_set_is_empty(not_processed2))
                ret = 0;*/
            if (!comps_set_is_empty(not_processed2))
                ret = -1;
        } else {
            if (comps_set_is_empty(not_processed2))
                ret = 1;
            else ret = 2;
        }
    }
    comps_set_destroy(&not_processed1);
    comps_set_destroy(&not_processed2);
    return ret;
}
Example #2
0
COMPS_ObjList* comps_groups_union(COMPS_ObjList *groups1,
                                  COMPS_ObjList *groups2) {
    COMPS_HSListItem *hsit;
    COMPS_Set *set;
    COMPS_ObjList *ret;
    COMPS_DocGroup *tmpgroup;
    COMPS_ObjListIt *it;
    void *tmpdata;

    ret = (COMPS_ObjList*)comps_object_create(&COMPS_ObjList_ObjInfo, NULL);

    set = comps_set_create();
    comps_set_init(set, NULL, NULL, NULL, &__comps_docgroup_idcmp);

    for (it = groups1 ? groups1->first : NULL; it != NULL; it = it->next) {
        comps_set_add(set, comps_object_copy(it->comps_obj));
    }
    for (it = groups2 ? groups2->first : NULL; it != NULL; it = it->next) {
        if (comps_set_in(set, it->comps_obj)) {
            tmpgroup = comps_docgroup_union(
                                (COMPS_DocGroup*)it->comps_obj,
                                (COMPS_DocGroup*)comps_set_data_at(set,
                                                                   it->comps_obj));
            tmpdata = comps_set_data_at(set, it->comps_obj);
            comps_set_remove(set, it->comps_obj);
            comps_object_destroy((COMPS_Object*)tmpdata);
            comps_set_add(set, tmpgroup);
        } else {
            comps_set_add(set, comps_object_copy(it->comps_obj));
        }
    }
    for (hsit = set->data->first; hsit != NULL; hsit = hsit->next) {
        comps_objlist_append_x(ret, (COMPS_Object*)hsit->data);
    }
    comps_set_destroy(&set);

    return ret;
}