124 lines
3.1 KiB
C
124 lines
3.1 KiB
C
|
|
#include <igraph.h>
|
|
|
|
#include "core/genheap.h"
|
|
|
|
#include "test_utilities.h"
|
|
|
|
typedef struct intpair_t {
|
|
int x, y;
|
|
} intpair_t;
|
|
|
|
int cmp(const void *a, const void *b) {
|
|
const intpair_t *sa = a, *sb = b;
|
|
if (sa->x < sb->x) return -1;
|
|
if (sa->x > sb->x) return 1;
|
|
if (sa->y < sb->y) return -1;
|
|
if (sa->y > sb->y) return 1;
|
|
return 0;
|
|
}
|
|
|
|
void intpair_print(const intpair_t *p) {
|
|
printf("(%d, %d)", p->x, p->y);
|
|
}
|
|
|
|
int main(void) {
|
|
igraph_int_t n;
|
|
igraph_vector_int_t idx;
|
|
igraph_gen2wheap_t h;
|
|
igraph_int_t i;
|
|
intpair_t p;
|
|
|
|
igraph_rng_seed(igraph_rng_default(), 42);
|
|
|
|
n = 10;
|
|
|
|
igraph_gen2wheap_init(&h, cmp, sizeof(intpair_t), n);
|
|
IGRAPH_ASSERT(igraph_gen2wheap_max_size(&h) == n);
|
|
|
|
igraph_vector_int_init_range(&idx, 0, n);
|
|
igraph_vector_int_shuffle(&idx);
|
|
|
|
for (i=0; i < n; i++) {
|
|
igraph_int_t j = VECTOR(idx)[i];
|
|
p.x = RNG_INTEGER(1, 10);
|
|
p.y = RNG_INTEGER(1, 10);
|
|
printf("Adding %2" IGRAPH_PRId ": ", j);
|
|
intpair_print(&p);
|
|
printf("\n");
|
|
IGRAPH_ASSERT(! igraph_gen2wheap_has_elem(&h, j));
|
|
igraph_gen2wheap_push_with_index(&h, j, &p);
|
|
igraph_gen2wheap_check(&h);
|
|
IGRAPH_ASSERT(igraph_gen2wheap_has_elem(&h, j));
|
|
IGRAPH_ASSERT(igraph_gen2wheap_size(&h) == i+1);
|
|
}
|
|
|
|
printf("\n");
|
|
|
|
i = igraph_gen2wheap_size(&h);
|
|
while (!igraph_gen2wheap_empty(&h)) {
|
|
printf("Removing %2" IGRAPH_PRId ": ", igraph_gen2wheap_max_index(&h));
|
|
intpair_print(igraph_gen2wheap_max(&h));
|
|
printf("\n");
|
|
igraph_gen2wheap_delete_max(&h);
|
|
igraph_gen2wheap_check(&h);
|
|
i--;
|
|
IGRAPH_ASSERT(igraph_gen2wheap_size(&h) == i);
|
|
}
|
|
|
|
printf("\n");
|
|
|
|
n=5;
|
|
for (igraph_int_t i=0; i < n; i++) {
|
|
p.x = RNG_INTEGER(1, 10);
|
|
p.y = RNG_INTEGER(1, 10);
|
|
printf("Adding %2" IGRAPH_PRId ": ", i);
|
|
intpair_print(&p);
|
|
printf("\n");
|
|
IGRAPH_ASSERT(! igraph_gen2wheap_has_elem(&h, i));
|
|
igraph_gen2wheap_push_with_index(&h, i, &p);
|
|
igraph_gen2wheap_check(&h);
|
|
IGRAPH_ASSERT(igraph_gen2wheap_has_elem(&h, i));
|
|
IGRAPH_ASSERT(igraph_gen2wheap_size(&h) == i+1);
|
|
}
|
|
|
|
i = 1;
|
|
p.x = -1; p.y = -1;
|
|
printf("\nModifying %" IGRAPH_PRId " to ", i);
|
|
intpair_print(&p);
|
|
printf("\n");
|
|
igraph_gen2wheap_modify(&h, i, &p);
|
|
igraph_gen2wheap_check(&h);
|
|
|
|
i = igraph_gen2wheap_max_index(&h);
|
|
p = * (intpair_t *) igraph_gen2wheap_max(&h);
|
|
p.x -= 3;
|
|
printf("Modifying max to ");
|
|
intpair_print(&p);
|
|
printf("\n");
|
|
igraph_gen2wheap_modify(&h, i, &p);
|
|
igraph_gen2wheap_check(&h);
|
|
|
|
printf("\n");
|
|
|
|
i = igraph_gen2wheap_size(&h);
|
|
while (!igraph_gen2wheap_empty(&h)) {
|
|
printf("Removing %2" IGRAPH_PRId ": ", igraph_gen2wheap_max_index(&h));
|
|
intpair_print(igraph_gen2wheap_max(&h));
|
|
printf("\n");
|
|
igraph_gen2wheap_delete_max(&h);
|
|
igraph_gen2wheap_check(&h);
|
|
i--;
|
|
IGRAPH_ASSERT(igraph_gen2wheap_size(&h) == i);
|
|
}
|
|
|
|
printf("\n");
|
|
|
|
igraph_vector_int_destroy(&idx);
|
|
igraph_gen2wheap_destroy(&h);
|
|
|
|
VERIFY_FINALLY_STACK();
|
|
|
|
return 0;
|
|
}
|