#include #include #include #include #include "fasthash.h" #include "treetrie.h" static void dump_arena(tt_arena_t *a) { int i; printf("max_probe: %u\n", a->max_probe); printf("live_count: %u\n", a->live_count); printf("table_length: %u\n", a->table_length); for (i = 0; i < a->table_length; i++) { tt_node_idx_t n = a->table[i]; tt_hash_t h = tt_hash_node(a, n); int distance = i - (h % a->table_length); if (distance < 0) distance += a->table_length; if (n >= TT_FIRST_VALID_NODE_IDX) { printf("%12u -> %12u: dist %d ref %d ", i, n, distance, a->headers[n].inuse.refcount); switch (a->headers[n].inuse.tag) { case TT_TAG_TAIL: printf("tail %u\n", a->nodes[n].a); break; case TT_TAG_BRANCH: printf("branch %u %u\n", a->nodes[n].a, a->nodes[n].b); break; case TT_TAG_LEAF: printf("leaf %u %u\n", a->nodes[n].a, a->nodes[n].b); break; case TT_TAG_NODE: printf("node index %d, %u %u\n", a->headers[n].inuse.index, a->nodes[n].a, a->nodes[n].b); break; } } } } int main(int argc, char *argv[]) { tt_arena_t a; int i, outer; tt_node_idx_t prev = TT_EMPTY; setbuf(stdout, NULL); tt_arena_init(&a); for (outer = 0; outer < 10; outer++) { tt_grab(&a, prev); tt_drop(&a, prev); printf("---------------------------------------- AFTER DROP of %d:\n", prev); dump_arena(&a); prev = TT_EMPTY; printf("======================================== LOOP ITERATION %d\n", outer); for (i = 0; i < 10; i++) { tt_node_idx_t leaf = tt_arena_cons(&a, TT_TAG_LEAF, 0, TT_OK, 1001); tt_node_idx_t curr = tt_arena_cons(&a, TT_TAG_NODE, 0, leaf, prev); dump_arena(&a); prev = curr; } } tt_arena_done(&a); return EXIT_SUCCESS; }