(* Author: Alain Frisch. Public domain. *) let dummy = Obj.magic (ref 0) type ('a,'b) t = { keys: 'a array; vals: 'b array; occ: int array } let create n = { keys = Array.make n (Obj.magic dummy); vals = Array.make n (Obj.magic dummy); occ = Array.make n 0 } let get tbl cmp x h v = let h = (h land max_int) mod (Array.length tbl.keys) in let i = tbl.occ.(h) in let k = tbl.keys.(h) in if (k != dummy) && (cmp k x) then (tbl.occ.(h) <- succ i; tbl.vals.(h)) else ( let r = Lazy.force v in if (i = 0) then (tbl.keys.(h) <- x; tbl.vals.(h) <- r; tbl.occ.(h) <- 1) else tbl.occ.(h) <- pred i; r ) let clear tbl = let n = Array.length tbl.keys in Array.fill tbl.keys 0 n (Obj.magic dummy); Array.fill tbl.vals 0 n (Obj.magic dummy); Array.fill tbl.occ 0 n 0