Пример #1
0
int main(int argc, char * argv[]) {

    COMPS_MRTree *tree, *tree2, *cloned1, *cloned2;
    COMPS_HSList * keyslist;

    char * keys[] = {"some key", "some Cray", "some", "anything"};
    int x1 = 10;
    int x2 = 11;
    int x3 = 12;
    int y1 = 20;
    int y2 = 21;
    int y3 = 22;
    int z1 = 30;
    int z2 = 31;
    int z3 = 32;

    int udata = 9;
    void * data;

    tree = comps_mrtree_create(&int_cloner, &int_cloner, &free);

printf(">> Building tree\n");
/*          Root
 */
    comps_mrtree_set(tree,"some key",(void*)&x1);
    comps_mrtree_set(tree,"some key",(void*)&x2);
printf(
"            Root                      \n"
"              ['some key']-->10,11    \n"
"                                      \n"
"");
    comps_mrtree_set(tree,"some Cray",(void*)&y1);
    comps_mrtree_set(tree,"some Cray",(void*)&y2);
printf(
"            Root                           \n"
"              ['some']-->|-['Cray']-->20,21\n"
"                         |-['key']-->10,11 \n"
"");
    comps_mrtree_set(tree,"some",(void*)&z1);
    comps_mrtree_set(tree,"some",(void*)&z3);
printf(
"            Root                           \n"
"              ['some']-->|-['Cray']-->20,21\n"
"                  |      |-['key']-->10,11 \n"
"                  V                        \n"
"                 30,32                     \n"
"");
    comps_mrtree_set(tree,"anything",(void*)&z2);
printf(
"            Root                           \n"
"    [anythink]['some']-->|-['Cray']-->20,21\n"
"        |         |      |-['key']-->10,11 \n"
"        V         V                        \n"
"       31       30,32                      \n"
"");

    printf(">> Incrementing all values by %d\n", udata);
    comps_mrtree_values_walk(tree, &udata, &inc);
    print_data4keys(tree, keys, 4);
    data = comps_mrtree_get(tree, "sAme Cray");
    print_intp_data(data, "sAme Cray");

    printf("------------\n");
    printf(">> Getting all keys for tree:\n");
    keyslist = comps_mrtree_keys(tree);
    print_keys(keyslist);
    comps_hslist_destroy(&keyslist);

    printf("------------\n");
    printf(">> Adding %d to 'some key'\n", x3);
    comps_mrtree_set(tree,"some key",(void*)&x3);
    data = comps_mrtree_get(tree, "some key");
    print_intp_data(data, "some key (modified)");
    printf("------------\n");

    printf(">> Removing 'some Cray'\n");
    comps_mrtree_unset(tree, "some Cray");
    print_data4keys(tree, keys, 4);
    printf("------------\n");

    printf(">> Clonning tree\n");
    cloned1 = comps_mrtree_clone(tree);
    printf(">> Incrementing all values in clonned tree by %d\n", udata);
    comps_mrtree_values_walk(cloned1, &udata, &inc);
    printf(">> Original tree data:\n");
    data = comps_mrtree_get(cloned1, "some key");
    print_data4keys(tree, keys, 4);
    printf("\n");
    printf(">> Cloned tree data:\n");
    print_data4keys(cloned1, keys, 4);
    printf("------------\n");

    printf("\n");
    printf(">> Clonning from clone\n");
    cloned2 = comps_mrtree_clone(cloned1);
    printf(">> Incrementing all values in clonned2 tree by %d\n", udata);
    printf(">> Data for original clone\n");
    comps_mrtree_values_walk(cloned1, &udata, &inc);
    print_data4keys(cloned1, keys, 4);
    printf("\n");
    printf(">> Data for cloned clone\n");
    comps_mrtree_values_walk(cloned1, &udata, &inc);
    print_data4keys(cloned1, keys, 4);
    comps_mrtree_destroy(cloned1);
    comps_mrtree_destroy(cloned2);
    printf("------------\n");

    printf(">> Removing 'some'\n");
    comps_mrtree_unset(tree, "some");

    data = comps_mrtree_get(tree, "some key");
    print_intp_data(data, "some key");

    data = comps_mrtree_get(tree, "some");
    print_intp_data(data, "some");
    printf("------------\n");

    printf(">> Adding %d to key 'anyones' shortened to len 6 [anyone]\n", x3);
    comps_mrtree_set_n(tree,"anyones", 6,(void*)&x3);

    data = comps_mrtree_get(tree, "anyones");
    print_intp_data(data, "anyones");

    data = comps_mrtree_get(tree, "anyone");
    print_intp_data(data, "anyone");

    tree2 = comps_mrtree_create(&int_cloner, &int_cloner, &free);
    printf(">> Building tree2\n");
    comps_mrtree_set(tree2,"foo",(void*)&x1);
    //comps_mrtree_set(tree2,"bar",(void*)&x2);
printf(
"            Root         \n"
"       ['foo']['bar']    \n"
"          |      |       \n"
"          V      V       \n"
"         109    100      \n"
"");
    udata = 99;
    //comps_mrtree_values_walk(tree2, &udata, &inc);
    data = comps_mrtree_get(tree2, "foo");
    print_intp_data(data, "foo");
    data = comps_mrtree_get(tree2, "bar");
    print_intp_data(data, "bar");

   printf(">> Adding tree2 to tree1 (tree1 = tree1 + tree2)\n");
   comps_mrtree_unite(tree, tree2);
    printf("Keylist\n");
    printf(">> Getting all keys for tree:\n");
    keyslist = comps_mrtree_keys(tree);
    print_keys(keyslist);
    comps_hslist_destroy(&keyslist);

    data = comps_mrtree_get(tree, "foo");
    print_intp_data(data, "foo");
    data = comps_mrtree_get(tree, "bar");
    print_intp_data(data, "bar");

    comps_mrtree_destroy(tree);
    comps_mrtree_destroy(tree2);
    return 0;
}
void comps_mrtree_unite(COMPS_MRTree *rt1, COMPS_MRTree *rt2) {
    COMPS_HSList *tmplist, *tmp_subnodes;
    COMPS_HSListItem *it, *it2;
    struct Pair {
        COMPS_HSList * subnodes;
        char * key;
    } *pair, *parent_pair;

    pair = malloc(sizeof(struct Pair));
    pair->subnodes = rt2->subnodes;
    pair->key = NULL;

    tmplist = comps_hslist_create();
    comps_hslist_init(tmplist, NULL, NULL, &free);
    comps_hslist_append(tmplist, pair, 0);

    while (tmplist->first != NULL) {
        it = tmplist->first;
        comps_hslist_remove(tmplist, tmplist->first);
        tmp_subnodes = ((struct Pair*)it->data)->subnodes;
        parent_pair = (struct Pair*) it->data;
        free(it);

        for (it = tmp_subnodes->first; it != NULL; it=it->next) {
            pair = malloc(sizeof(struct Pair));
            pair->subnodes = ((COMPS_MRTreeData*)it->data)->subnodes;

            if (parent_pair->key != NULL) {
                pair->key =
                    malloc(sizeof(char)
                           * (strlen(((COMPS_MRTreeData*)it->data)->key)
                           + strlen(parent_pair->key) + 1));
                memcpy(pair->key, parent_pair->key,
                       sizeof(char) * strlen(parent_pair->key));
                memcpy(pair->key+strlen(parent_pair->key),
                       ((COMPS_MRTreeData*)it->data)->key,
                       sizeof(char)*(strlen(((COMPS_MRTreeData*)it->data)->key)+1));
            } else {
                pair->key = malloc(sizeof(char)*
                                (strlen(((COMPS_MRTreeData*)it->data)->key) +
                                1));
                memcpy(pair->key, ((COMPS_MRTreeData*)it->data)->key,
                       sizeof(char)*(strlen(((COMPS_MRTreeData*)it->data)->key)+1));
            }
            /* current node has data */
            if (((COMPS_MRTreeData*)it->data)->data->first != NULL) {
                for (it2 = ((COMPS_MRTreeData*)it->data)->data->first;
                     it2 != NULL; it2 = it2->next) {
                    comps_mrtree_set(rt1, pair->key, it2->data);
                }

                if (((COMPS_MRTreeData*)it->data)->subnodes->first) {
                    comps_hslist_append(tmplist, pair, 0);
                } else {
                    free(pair->key);
                    free(pair);
                }
            /* current node hasn't data */
            } else {
                if (((COMPS_MRTreeData*)it->data)->subnodes->first) {
                    comps_hslist_append(tmplist, pair, 0);
                } else {
                    free(pair->key);
                    free(pair);
                }
            }
        }
        free(parent_pair->key);
        free(parent_pair);
    }
    comps_hslist_destroy(&tmplist);
}