package alt-ergo-lib
Source file hconsing.ml
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82(******************************************************************************) (* *) (* The Alt-Ergo theorem prover *) (* Copyright (C) 2006-2013 *) (* *) (* Sylvain Conchon *) (* Evelyne Contejean *) (* *) (* Francois Bobot *) (* Mohamed Iguernelala *) (* Stephane Lescuyer *) (* Alain Mebsout *) (* *) (* CNRS - INRIA - Universite Paris Sud *) (* *) (* This file is distributed under the terms of the Apache Software *) (* License version 2.0 *) (* *) (* ------------------------------------------------------------------------ *) (* *) (* Alt-Ergo: The SMT Solver For Software Verification *) (* Copyright (C) 2013-2018 --- OCamlPro SAS *) (* *) (* This file is distributed under the terms of the Apache Software *) (* License version 2.0 *) (* *) (******************************************************************************) [@@@ocaml.warning "-33"] open Options module type HASHED = sig type elt val eq : elt -> elt -> bool val hash : elt -> int val set_id : int -> elt -> elt val initial_size : int val disable_weaks : unit -> bool end module type S = sig type t val make : t -> t val elements : unit -> t list end module Make(Hashed : HASHED) : (S with type t = Hashed.elt) = struct type t = Hashed.elt module HWeak = Weak.Make (struct type t = Hashed.elt let equal = Hashed.eq let hash = Hashed.hash end) let storage = HWeak.create Hashed.initial_size let retain_list = ref [] let next_id = ref 0 let make d = let d = Hashed.set_id !next_id d in let o = HWeak.merge storage d in if o == d then begin incr next_id; if Hashed.disable_weaks() then (* retain a pointer to 'd' to prevent the GC from collecting the object if H.disable_weaks is set *) retain_list := d :: !retain_list end; o let elements () = let acc = ref [] in HWeak.iter (fun e -> acc := e :: !acc) storage; !acc end