#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); }