static void ss_ht_test0(void) { ssht ht; t( ss_htinit(&ht, &st_r.a, 8) == 0 ); int i = 0; while (i < 3431) { if (ss_htisfull(&ht)) { t( ss_htresize(&ht, &st_r.a) == 0 ); } htnode *n = ss_malloc(&st_r.a, sizeof(htnode)); int len = snprintf(n->key, sizeof(n->key), "key_%d", i); n->node.hash = ss_fnv(n->key, len); int pos = ssht_search(&ht, n->node.hash, n->key, len, NULL); ss_htset(&ht, pos, &n->node); i++; } i = 0; while (i < 3431) { htnode key; int len = snprintf(key.key, sizeof(key.key), "key_%d", i); key.node.hash = ss_fnv(key.key, len); int pos = ssht_search(&ht, key.node.hash, key.key, len, NULL); t( ht.i[pos] != NULL ); t( strcmp(sscast(ht.i[pos], htnode, node)->key, key.key) == 0 ); i++; } i = 0; while (i < ht.size) { if (ht.i[i]) ss_free(&st_r.a, ht.i[i]); i++; } ss_htfree(&ht, &st_r.a); }
int sd_buildbegin(sdbuild *b, sr *r, int crc, int compress, int compress_dup) { b->crc = crc; b->compress = compress; b->compress_dup = compress_dup; int rc; if (compress_dup && b->tracker.size == 0) { rc = ss_htinit(&b->tracker, r->a, 32768); if (ssunlikely(rc == -1)) return sr_oom(r->e); } rc = ss_bufensure(&b->list, r->a, sizeof(sdbuildref)); if (ssunlikely(rc == -1)) return sr_oom(r->e); sdbuildref *ref = (sdbuildref*)ss_bufat(&b->list, sizeof(sdbuildref), b->n); ref->m = ss_bufused(&b->m); ref->msize = 0; ref->v = ss_bufused(&b->v); ref->vsize = 0; ref->k = ss_bufused(&b->k); ref->ksize = 0; ref->c = ss_bufused(&b->c); ref->csize = 0; rc = ss_bufensure(&b->m, r->a, sizeof(sdpageheader)); if (ssunlikely(rc == -1)) return sr_oom(r->e); sdpageheader *h = sd_buildheader(b); memset(h, 0, sizeof(*h)); h->lsnmin = UINT64_MAX; h->lsnmindup = UINT64_MAX; memset(h->reserve, 0, sizeof(h->reserve)); ss_bufadvance(&b->list, sizeof(sdbuildref)); ss_bufadvance(&b->m, sizeof(sdpageheader)); return 0; }