Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
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;
}
Beispiel #5
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;
}