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; }
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; }