(***********************************************************************) (* *) (* TAToo *) (* *) (* Kim Nguyen, LRI UMR8623 *) (* Université Paris-Sud & CNRS *) (* *) (* Copyright 2010-2012 Université Paris-Sud and Centre National de la *) (* Recherche Scientifique. All rights reserved. This file is *) (* distributed under the terms of the GNU Lesser General Public *) (* License, with the special exception on linking described in file *) (* ../LICENSE. *) (* *) (***********************************************************************) include Hcons_sig module type TableBuilder = functor (H : Common_sig.HashedType) -> Common_sig.HashSet with type data = H.t module Builder (TB : TableBuilder) (H : Common_sig.HashedType) = struct type data = H.t type t = { id : Uid.t; hash : int; node : data } let uid_make = ref (Uid.make_maker()) let node t = t.node let uid t = t.id let hash t = t.hash let equal t1 t2 = t1 == t2 module HN = struct type _t = t type t = _t let hash = hash let equal x y = x == y || H.equal x.node y.node end module T = TB(HN) let pool = T.create 101 let init () = T.clear pool; uid_make := Uid.make_maker () let dummy x = { id = Uid.dummy; hash = H.hash x; node = x } let make x = let cell = dummy x in try T.find pool cell with | Not_found -> let cell = { cell with id = !uid_make(); } in T.add pool cell; cell end module Make = Builder (Misc.HashSet) module Weak = Builder (Weak.Make) module PosInt = struct type data = int type t = int let make v = if v < 0 then raise (Invalid_argument "Hcons.PosInt.make") else v let node v = v let hash v = v let uid v = Uid.of_int v let dummy _ = ~-1 let equal x y = x == y let init () = () end