#ifndef __SPL_FOLD_H__ #define __SPL_FOLD_H__ #include "../stage0/include/utils.h" /* 通用 intrusive 哈希集合,对应 LLVM FoldingSet 的桶链部分。 - 节点表由调用方持有,节点自带 next 字段; - hash 只用于选择桶(本实现以完整 hash 值作桶 map 的 key), 相等始终由 eq 回调做结构比较; - 只增不删,适合类型 intern。 */ typedef usize spl_fold_id_t; /* 相等返回非零;probe 指向调用方的临时(尚未入表)节点。 */ typedef int (*spl_fold_eq_fn)(void *ctx, spl_fold_id_t node, const void *probe); typedef spl_fold_id_t (*spl_fold_next_fn)(void *ctx, spl_fold_id_t node); typedef void (*spl_fold_set_next_fn)(void *ctx, spl_fold_id_t node, spl_fold_id_t next); typedef struct { MAP(usize, spl_fold_id_t) buckets; void *ctx; spl_fold_eq_fn eq; spl_fold_next_fn next; spl_fold_set_next_fn set_next; } spl_fold_t; 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); void spl_fold_drop(spl_fold_t *fold); /* 命中返回已存在的 id,否则返回 0。 */ spl_fold_id_t spl_fold_find(const spl_fold_t *fold, usize hash, const void *probe); /* 把已分配 id 的节点挂到对应桶头。 */ void spl_fold_insert(spl_fold_t *fold, usize hash, spl_fold_id_t id); #endif /* __SPL_FOLD_H__ */