X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=ptset.ml;h=3fd3d39e26dc1b79b9b8b28e2a52a383c67f226b;hb=2676d5a3bbb1e6f6a5af66477edfe3b4c849f4e7;hp=ea84ddf845e19416da121aa08176703d2a37e11c;hpb=25dd7fcc77c2188732d96d5ff98d759bb81737cb;p=SXSI%2Fxpathcomp.git diff --git a/ptset.ml b/ptset.ml index ea84ddf..3fd3d39 100644 --- a/ptset.ml +++ b/ptset.ml @@ -9,6 +9,7 @@ INCLUDE "utils.ml" module type S = sig include Set.S + type data val intersect : t -> t -> bool val is_singleton : t -> bool val mem_union : t -> t -> t @@ -16,17 +17,18 @@ sig val uid : t -> int val uncons : t -> elt*t val from_list : elt list -> t + val make : data -> t + val node : t -> data end module Make ( H : Hcons.S ) : S with type elt = H.t = struct type elt = H.t - type 'a node = | Empty | Leaf of elt | Branch of int * int * 'a * 'a - + module rec HNode : Hcons.S with type data = Node.t = Hcons.Make (Node) and Node : Hashtbl.HashedType with type t = HNode.t node = struct @@ -42,15 +44,17 @@ struct | _ -> false let hash = function | Empty -> 0 - | Leaf i -> HASHINT2(HALF_MAX_INT,H.hash i) - | Branch (b,i,l,r) -> HASHINT4(b,i,HNode.hash l, HNode.hash r) + | Leaf i -> HASHINT2(HALF_MAX_INT,H.uid i) + | Branch (b,i,l,r) -> HASHINT4(b,i,HNode.uid l, HNode.uid r) end ;; type t = HNode.t + type data = t node let hash = HNode.hash let uid = HNode.uid - + let make = HNode.make + let node _ = failwith "node" let empty = HNode.make Empty let is_empty s = (HNode.node s) == Empty @@ -343,10 +347,6 @@ let split x s = in fold coll s (empty, false, empty) - -let make l = List.fold_left (fun acc e -> add e acc ) empty l -(*i*) - (*s Additional functions w.r.t to [Set.S]. *) let rec intersect s1 s2 = (equal s1 s2) || @@ -377,14 +377,15 @@ let from_list l = List.fold_left (fun acc e -> add e acc) empty l end -(* Have to benchmark wheter this whole include stuff is worth it *) -module Int : S with type elt = int = Make ( struct type t = int - type data = t - external hash : t -> int = "%identity" - external uid : t -> int = "%identity" - let equal : t -> t -> bool = (==) - external make : t -> int = "%identity" - external node : t -> int = "%identity" - - end - ) +module Int : S with type elt = int + = + Make ( struct type t = int + type data = t + external hash : t -> int = "%identity" + external uid : t -> int = "%identity" + let equal : t -> t -> bool = (==) + external make : t -> int = "%identity" + external node : t -> int = "%identity" + + end + )