Eina_Rbtree_Direction tern_cmp(const Eina_Rbtree *left, const Eina_Rbtree *right) { test_eina_rbtree_node_t *p, *q; p = EINA_RBTREE_CONTAINER_GET(left, test_eina_rbtree_node_t); q = EINA_RBTREE_CONTAINER_GET(right, test_eina_rbtree_node_t); if(p->i > q->i) return EINA_RBTREE_LEFT; return EINA_RBTREE_RIGHT; }
static Eina_Rbtree_Direction _eina_class_direction_range(const Eina_Rbtree *left, const Eina_Rbtree *right, EINA_UNUSED void *data) { Eina_Class_Range *rl; Eina_Class_Range *rr; rl = EINA_RBTREE_CONTAINER_GET(left, Eina_Class_Range); rr = EINA_RBTREE_CONTAINER_GET(right, Eina_Class_Range); if (rl->start < rr->start) return EINA_RBTREE_LEFT; return EINA_RBTREE_RIGHT; }
int tern_cmpkey(const Eina_Rbtree *node, int *key) { test_eina_rbtree_node_t *p; p = EINA_RBTREE_CONTAINER_GET(node, test_eina_rbtree_node_t); if(p->i > (*key)) return -1; else if(p->i < (*key)) return 1; return 0; }
static int _eina_rbtree_cmp_range(const Eina_Rbtree *node, const void *key, EINA_UNUSED int length, EINA_UNUSED void *data) { Eina_Class_Range *range; Eina_Object_ID id; range = EINA_RBTREE_CONTAINER_GET(node, Eina_Class_Range); id = (Eina_Object_ID) key; if (id < range->start) return -1; else if (id >= range->end) return 1; return 0; }
int main() { const intptr_t max = 10000000; intptr_t i; struct timeval g_start, start, end, diff; test_rbtree_node_t *trn; test_rbtree_fast_node_t *trfn; gds_inline_rbtree_node_t *irn; gds_inline_rbtree_fast_node_t *irfn; /* gds_inline_rbtree */ printf("gds_inline_rbtree\n"); gettimeofday(&g_start, NULL); printf("\tInserting %ld nodes...\n", max); gettimeofday(&start, NULL); gds_inline_rbtree_node_t *root = NULL; for(i=0; i<max; i++) { trn = trn_new(i); gds_inline_rbtree_add(&root, &(trn->rbtree), trn_cmp, NULL); } gettimeofday(&end, NULL); timeval_diff(&start, &end, &diff); printf("\tTime: %lds %ldus\n", diff.tv_sec, diff.tv_usec); printf("\tGetting %ld nodes...\n", max); gettimeofday(&start, NULL); for(i=0; i<max; i++) { gds_inline_rbtree_get_node(root, &i, trn_cmp_with_key, NULL); } gettimeofday(&end, NULL); timeval_diff(&start, &end, &diff); printf("\tTime: %lds %ldus\n", diff.tv_sec, diff.tv_usec); printf("\tDeleting %ld nodes...\n", max); gettimeofday(&start, NULL); for(i=0; i<max; i++) { irn = gds_inline_rbtree_del(&root, &i, trn_cmp_with_key, NULL); trn = trn_container_of(irn); trn_free(trn); } gettimeofday(&end, NULL); timeval_diff(&start, &end, &diff); printf("\tTime: %lds %ldus\n", diff.tv_sec, diff.tv_usec); timeval_diff(&g_start, &end, &diff); printf("\tTotal time: %lds %ldus\n", diff.tv_sec, diff.tv_usec); printf("\tEstimated size: %ld bytes\n", max * (sizeof(test_rbtree_node_t))); /* gds_inline_rbtree_fast */ printf("gds_inline_rbtree_fast\n"); gettimeofday(&g_start, NULL); printf("\tInserting %ld nodes...\n", max); gettimeofday(&start, NULL); gds_inline_rbtree_fast_node_t *froot = NULL; for(i=0; i<max; i++) { trfn = trfn_new(i); gds_inline_rbtree_fast_add(&froot, &(trfn->rbtree), trfn_cmp, NULL); } gettimeofday(&end, NULL); timeval_diff(&start, &end, &diff); printf("\tTime: %lds %ldus\n", diff.tv_sec, diff.tv_usec); printf("\tGetting %ld nodes...\n", max); gettimeofday(&start, NULL); for(i=0; i<max; i++) { gds_inline_rbtree_fast_get_node(froot, &i, trfn_cmp_with_key, NULL); } gettimeofday(&end, NULL); timeval_diff(&start, &end, &diff); printf("\tTime: %lds %ldus\n", diff.tv_sec, diff.tv_usec); printf("\tDeleting %ld nodes...\n", max); gettimeofday(&start, NULL); for(i=0; i<max; i++) { irfn = gds_inline_rbtree_fast_del(&froot, &i, trfn_cmp_with_key, NULL); trfn = trfn_container_of(irfn); trfn_free(trfn); } gettimeofday(&end, NULL); timeval_diff(&start, &end, &diff); printf("\tTime: %lds %ldus\n", diff.tv_sec, diff.tv_usec); timeval_diff(&g_start, &end, &diff); printf("\tTotal time: %lds %ldus\n", diff.tv_sec, diff.tv_usec); printf("\tEstimated size: %ld bytes\n", max * (sizeof(test_rbtree_fast_node_t))); /* eina */ printf("eina\n"); gettimeofday(&g_start, NULL); printf("\tInserting %ld nodes\n", max); gettimeofday(&start, NULL); Eina_Rbtree *eroot = NULL; test_eina_rbtree_node_t *tern; for(i=0; i<max; i++) { tern = tern_new(i); eroot = eina_rbtree_inline_insert(eroot, EINA_RBTREE_GET(tern), EINA_RBTREE_CMP_NODE_CB(tern_cmp), NULL); } gettimeofday(&end, NULL); timeval_diff(&start, &end, &diff); printf("\tTime: %lds %ldus\n", diff.tv_sec, diff.tv_usec); printf("\tGetting %ld nodes...\n", max); gettimeofday(&start, NULL); Eina_Rbtree *n = NULL; for(i=0; i<max; i++) { n = eina_rbtree_inline_lookup(eroot, &i, 1, EINA_RBTREE_CMP_KEY_CB(tern_cmpkey), NULL); } gettimeofday(&end, NULL); timeval_diff(&start, &end, &diff); printf("\tTime: %lds %ldus\n", diff.tv_sec, diff.tv_usec); printf("\tDeleting %ld nodes...\n", max); gettimeofday(&start, NULL); for(i=0; i<max; i++) { n = eina_rbtree_inline_lookup(eroot, &i, 1, EINA_RBTREE_CMP_KEY_CB(tern_cmpkey), NULL); eroot = eina_rbtree_inline_remove(eroot, n, EINA_RBTREE_CMP_NODE_CB(tern_cmp), NULL); tern = EINA_RBTREE_CONTAINER_GET(n, test_eina_rbtree_node_t); free(tern); } gettimeofday(&end, NULL); timeval_diff(&start, &end, &diff); printf("\tTime: %lds %ldus\n", diff.tv_sec, diff.tv_usec); timeval_diff(&g_start, &end, &diff); printf("\tTotal time: %lds %ldus\n", diff.tv_sec, diff.tv_usec); printf("\tEstimated size: %ld bytes\n", max * (sizeof(test_eina_rbtree_node_t))); return 0; }