From: Stefano Zacchiroli Date: Fri, 24 Feb 2006 00:15:53 +0000 (+0000) Subject: added a generic (yet rather trivial) module for reference counting X-Git-Tag: 0.4.95@7852~1622 X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=commitdiff_plain;h=2e8f609597740c63f1a88842edc9df87b0dd6cc9;p=helm.git added a generic (yet rather trivial) module for reference counting --- diff --git a/components/extlib/.depend b/components/extlib/.depend index e2c9fc2b8..82a9d39d6 100644 --- a/components/extlib/.depend +++ b/components/extlib/.depend @@ -10,3 +10,5 @@ hLog.cmo: hLog.cmi hLog.cmx: hLog.cmi trie.cmo: trie.cmi trie.cmx: trie.cmi +refCounter.cmo: refCounter.cmi +refCounter.cmx: refCounter.cmi diff --git a/components/extlib/Makefile b/components/extlib/Makefile index 4e5c9b5a9..8caad1fca 100644 --- a/components/extlib/Makefile +++ b/components/extlib/Makefile @@ -6,8 +6,9 @@ INTERFACE_FILES = \ hExtlib.mli \ hMarshal.mli \ patternMatcher.mli \ - hLog.mli \ - trie.mli \ + hLog.mli \ + trie.mli \ + refCounter.mli \ $(NULL) IMPLEMENTATION_FILES = \ $(INTERFACE_FILES:%.mli=%.ml) diff --git a/components/extlib/refCounter.ml b/components/extlib/refCounter.ml new file mode 100644 index 000000000..f5edb69f5 --- /dev/null +++ b/components/extlib/refCounter.ml @@ -0,0 +1,49 @@ +(* Copyright (C) 2006, HELM Team. + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +type 'a t = ('a, int ref) Hashtbl.t + +let create () = Hashtbl.create 113 + +let incr ~create_cb counters item = + try + let counter = Hashtbl.find counters item in + incr counter + with Not_found -> + Hashtbl.add counters item (ref 1); + create_cb item + +let decr ~delete_cb counters item = + try + let counter = Hashtbl.find counters item in + decr counter; + if !counter = 0 then begin + Hashtbl.remove counters item; + delete_cb item + end + with Not_found -> + prerr_endline "RefCounter: attempt to decrease unexistent counter"; + assert false + diff --git a/components/extlib/refCounter.mli b/components/extlib/refCounter.mli new file mode 100644 index 000000000..fc5216648 --- /dev/null +++ b/components/extlib/refCounter.mli @@ -0,0 +1,31 @@ +(* Copyright (C) 2006, HELM Team. + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +type 'a t + +val create: unit -> 'a t +val incr: create_cb:('a -> unit) -> 'a t -> 'a -> unit +val decr: delete_cb:('a -> unit) -> 'a t -> 'a -> unit +