New files refactoring the code
[SXSI/xpathcomp.git] / hcons.ml
diff --git a/hcons.ml b/hcons.ml
new file mode 100644 (file)
index 0000000..293b90f
--- /dev/null
+++ b/hcons.ml
@@ -0,0 +1,37 @@
+INCLUDE "utils.ml"
+module type S = 
+sig
+  type data
+  type t
+  val make : data -> t
+  val node : t -> data
+  val hash : t -> int
+  val uid : t -> int
+  val equal : t -> t -> bool
+end
+module Make (H : Hashtbl.HashedType) : S with type data = H.t =
+struct
+  type data = H.t
+  type t =  { id : int;
+             key : int; (* hash *)
+             node : data;
+           }
+  
+  let node t = t.node
+  let hash t = t.key
+  let uid t = t.id
+  let gen_uid  =
+    let id = ref ~-1 in 
+      fun () -> incr id;!id
+  let equal t1 t2 = t1 == t2 || t1.id == t2.id
+  module WH = Weak.Make( struct 
+                          type _t = t 
+                          type t = _t 
+                          let hash = hash
+                          let equal a b = H.equal a.node b.node 
+                        end)
+  let pool = WH.create MED_H_SIZE
+  let make x = 
+    let cell = { id = gen_uid(); key = H.hash x; node = x } in
+      WH.merge pool cell
+end