COMPS_MRTree * comps_mrtree_clone(COMPS_MRTree * rt) {

    COMPS_HSList * to_clone, *tmplist, *new_subnodes;
    COMPS_MRTree * ret;
    COMPS_HSListItem *it, *it2;
    COMPS_MRTreeData *rtdata;
    COMPS_HSList *new_data_list;

    to_clone = comps_hslist_create();
    comps_hslist_init(to_clone, NULL, NULL, NULL);
    ret = comps_mrtree_create(rt->data_constructor, rt->data_cloner,
                              rt->data_destructor);

    for (it = rt->subnodes->first; it != NULL; it = it->next) {
        rtdata = comps_mrtree_data_create(rt,
                                      ((COMPS_MRTreeData*)it->data)->key, NULL);
        new_data_list = comps_hslist_clone(((COMPS_MRTreeData*)it->data)->data);
        comps_hslist_destroy(&rtdata->data);
        comps_hslist_destroy(&rtdata->subnodes);
        rtdata->subnodes = ((COMPS_MRTreeData*)it->data)->subnodes;
        rtdata->data = new_data_list;
        comps_hslist_append(ret->subnodes, rtdata, 0);

        comps_hslist_append(to_clone, rtdata, 0);
    }


    while (to_clone->first) {
        it2 = to_clone->first;
        tmplist = ((COMPS_MRTreeData*)it2->data)->subnodes;
        comps_hslist_remove(to_clone, to_clone->first);

        new_subnodes = comps_hslist_create();
        comps_hslist_init(new_subnodes, NULL, NULL, &comps_mrtree_data_destroy_v);
        for (it = tmplist->first; it != NULL; it = it->next) {
            rtdata = comps_mrtree_data_create(rt,
                                      ((COMPS_MRTreeData*)it->data)->key, NULL);
            new_data_list = comps_hslist_clone(((COMPS_MRTreeData*)it->data)->data);
            comps_hslist_destroy(&rtdata->subnodes);
            comps_hslist_destroy(&rtdata->data);
            rtdata->subnodes = ((COMPS_MRTreeData*)it->data)->subnodes;
            rtdata->data = new_data_list;
            comps_hslist_append(new_subnodes, rtdata, 0);

            comps_hslist_append(to_clone, rtdata, 0);
        }
        ((COMPS_MRTreeData*)it2->data)->subnodes = new_subnodes;
        free(it2);
    }
    comps_hslist_destroy(&to_clone);
    return ret;
}
Example #2
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;
}