Files

35 lines
1.1 KiB
C

#include "spl_fold.h"
static usize spl_fold_bucket_hash(usize k) { return MAP_HASH_INT(k); }
static int spl_fold_bucket_cmp(usize a, usize b) { return MAP_CMP_INT(a, b); }
void spl_fold_init(spl_fold_t *fold, void *ctx, spl_fold_eq_fn eq, spl_fold_next_fn next,
spl_fold_set_next_fn set_next) {
map_init(fold->buckets, spl_fold_bucket_hash, spl_fold_bucket_cmp);
fold->ctx = ctx;
fold->eq = eq;
fold->next = next;
fold->set_next = set_next;
}
void spl_fold_drop(spl_fold_t *fold) { map_free(fold->buckets); }
spl_fold_id_t spl_fold_find(const spl_fold_t *fold, usize hash, const void *probe) {
spl_fold_id_t cur = 0;
if (!map_get(fold->buckets, hash, &cur))
return 0;
while (cur) {
if (fold->eq(fold->ctx, cur, probe))
return cur;
cur = fold->next(fold->ctx, cur);
}
return 0;
}
void spl_fold_insert(spl_fold_t *fold, usize hash, spl_fold_id_t id) {
spl_fold_id_t head = 0;
map_get(fold->buckets, hash, &head);
fold->set_next(fold->ctx, id, head);
map_put(fold->buckets, hash, id);
}