Safety commit
[SXSI/xpathcomp.git] / hcons.ml
1 INCLUDE "utils.ml"
2 module type SA =
3   sig
4     type data
5     type t 
6     val make : data -> t
7     val node : t -> data
8     val hash : t -> int
9     val uid : t -> Uid.t
10     val equal : t -> t -> bool
11   end
12
13 module type S =
14   sig
15     type data
16     type t = private { id : Uid.t;
17                        key : int;
18                        node : data }
19     val make : data -> t
20     val node : t -> data
21     val hash : t -> int
22     val uid : t -> Uid.t
23     val equal : t -> t -> bool
24
25   end
26
27 module Make (H : Hashtbl.HashedType) : S with type data = H.t =
28 struct
29   type data = H.t
30   type t = { id : Uid.t;
31              key : int;
32              node : data }
33   let node t = t.node
34   let uid t = t.id
35   let hash t = t.key
36   let equal t1 t2 = t1 == t2
37   module WH = Weak.Make( struct 
38                            type _t = t 
39                            type t = _t 
40                            let hash = hash
41                            let equal a b = a==b || H.equal a.node b.node 
42                          end)
43   let pool = WH.create MED_H_SIZE
44   let make x = 
45     let cell = { id = Uid.make(); key = H.hash x; node = x } in
46       WH.merge pool cell
47 end