From ca3eeb009d1e694523e16c741d04c1fad3be4f02 Mon Sep 17 00:00:00 2001 From: Stefano Zacchiroli Date: Fri, 24 Feb 2006 00:15:53 +0000 Subject: [PATCH] added a generic (yet rather trivial) module for reference counting --- helm/software/components/extlib/.depend | 2 + helm/software/components/extlib/Makefile | 5 +- helm/software/components/extlib/refCounter.ml | 49 +++++++++++++++++++ .../software/components/extlib/refCounter.mli | 31 ++++++++++++ 4 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 helm/software/components/extlib/refCounter.ml create mode 100644 helm/software/components/extlib/refCounter.mli diff --git a/helm/software/components/extlib/.depend b/helm/software/components/extlib/.depend index e2c9fc2b8..82a9d39d6 100644 --- a/helm/software/components/extlib/.depend +++ b/helm/software/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/helm/software/components/extlib/Makefile b/helm/software/components/extlib/Makefile index 4e5c9b5a9..8caad1fca 100644 --- a/helm/software/components/extlib/Makefile +++ b/helm/software/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/helm/software/components/extlib/refCounter.ml b/helm/software/components/extlib/refCounter.ml new file mode 100644 index 000000000..f5edb69f5 --- /dev/null +++ b/helm/software/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/helm/software/components/extlib/refCounter.mli b/helm/software/components/extlib/refCounter.mli new file mode 100644 index 000000000..fc5216648 --- /dev/null +++ b/helm/software/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 + -- 2.39.2