1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
type 'a hash_consed = {node: 'a; tag: int} let get_initial_cache_size, set_initial_cache_size, reset_initial_cache_size = let default = 512 in let initial_cache_size = ref default in ( (fun () -> !initial_cache_size) , (fun size -> initial_cache_size := size) , fun () -> initial_cache_size := default ) module Mk (Cache : Hashtbl.S) = struct type t = Cache.key hash_consed Cache.t let tbl = Cache.create (get_initial_cache_size ()) let clear () = Cache.clear tbl let iter f = Cache.iter f tbl let stats () = Cache.stats tbl let hashcons = let gen = let count = ref (-1) in fun () -> incr count ; !count in fun k -> try Cache.find tbl k with Not_found -> let v = {tag= gen (); node= k} in Cache.add tbl k v ; v end module Make (H : Hashtbl.HashedType) = struct include Mk (Ephemeron.K1.Make (H)) end module MakeStrong (H : Hashtbl.HashedType) = struct include Mk (Hashtbl.Make (H)) end