diff --git a/README.md b/README.md index 9fc6098e..bcc5ba01 100644 --- a/README.md +++ b/README.md @@ -147,6 +147,7 @@ is not necessarily up-to-date. - `AbsSet`, an abstract Set data structure, a bit like `LazyGraph`. - `Automaton`, `CSM`, state machine abstractions - `Bij`, a GADT-based bijection language used to serialize/deserialize your data structures +- `Hashset`, a polymorphic imperative set on top of `PHashtbl` - `LazyGraph`, a lazy graph structure on arbitrary (hashable+eq) types, with basic graph functions that work even on infinite graphs, and printing to DOT. - `PHashtbl`, a polymorphic hashtable (with open addressing) - `RAL`, a random-access list structure, with `O(1)` cons/hd/tl and `O(ln(n))` access to elements by their index. diff --git a/_oasis b/_oasis index 9ac01b9f..e9049e20 100644 --- a/_oasis +++ b/_oasis @@ -113,7 +113,7 @@ Library "containers_pervasives" Library "containers_misc" Path: src/misc Pack: true - Modules: AbsSet, Automaton, Bij, CSM, LazyGraph, PHashtbl, + Modules: AbsSet, Automaton, Bij, CSM, Hashset, LazyGraph, PHashtbl, PrintBox, RAL, RoseTree, SmallSet, UnionFind, Univ BuildDepends: containers, containers.data FindlibName: misc diff --git a/_tags b/_tags index 417c4bff..a9392af5 100644 --- a/_tags +++ b/_tags @@ -1,5 +1,5 @@ # OASIS_START -# DO NOT EDIT (digest: 5d9eb57cbb89da8bde9292277cec7a96) +# DO NOT EDIT (digest: 2b3148849efeea95c2f260b7cce3b77e) # Ignore VCS directories, you can use the same kind of rule outside # OASIS_START/STOP if you want to exclude directories that contains # useless stuff for the build process @@ -55,6 +55,7 @@ true: annot, bin_annot "src/misc/automaton.cmx": for-pack(Containers_misc) "src/misc/bij.cmx": for-pack(Containers_misc) "src/misc/CSM.cmx": for-pack(Containers_misc) +"src/misc/hashset.cmx": for-pack(Containers_misc) "src/misc/lazyGraph.cmx": for-pack(Containers_misc) "src/misc/pHashtbl.cmx": for-pack(Containers_misc) "src/misc/printBox.cmx": for-pack(Containers_misc) diff --git a/containers.odocl b/containers.odocl index 49a6fb00..80a5be53 100644 --- a/containers.odocl +++ b/containers.odocl @@ -1,5 +1,5 @@ # OASIS_START -# DO NOT EDIT (digest: b0ee2a2a21ef35240553e6d971c8e0b3) +# DO NOT EDIT (digest: 2892d9c53521db701e90ccd56fbdc99a) src/core/CCVector src/core/CCPrint src/core/CCError @@ -23,6 +23,7 @@ src/misc/AbsSet src/misc/Automaton src/misc/Bij src/misc/CSM +src/misc/Hashset src/misc/LazyGraph src/misc/PHashtbl src/misc/PrintBox diff --git a/doc/intro.txt b/doc/intro.txt index ff7c5e99..edbad184 100644 --- a/doc/intro.txt +++ b/doc/intro.txt @@ -118,6 +118,7 @@ AbsSet Automaton Bij CSM +Hashset LazyGraph PHashtbl PrintBox diff --git a/setup.ml b/setup.ml index 1a5912fd..25d365bf 100644 --- a/setup.ml +++ b/setup.ml @@ -1,7 +1,7 @@ (* setup.ml generated for the first time by OASIS v0.4.4 *) (* OASIS_START *) -(* DO NOT EDIT (digest: 83967354b3e0f92a4064bb798b8454ab) *) +(* DO NOT EDIT (digest: 798266c533c11324b314d4c4bacd9a0c) *) (* Regenerated by OASIS v0.4.5 Visit http://oasis.forge.ocamlcore.org for more information and @@ -7409,6 +7409,7 @@ let setup_t = "Automaton"; "Bij"; "CSM"; + "Hashset"; "LazyGraph"; "PHashtbl"; "PrintBox"; @@ -7935,7 +7936,7 @@ let setup_t = }; oasis_fn = Some "_oasis"; oasis_version = "0.4.5"; - oasis_digest = Some "{v\252ox\172\235\244E\159\020\002\195\146\141\186"; + oasis_digest = Some "\164\188^\018\173\181\135}#\017\164\201S\134\171+"; oasis_exec = None; oasis_setup_args = []; setup_update = false @@ -7943,6 +7944,6 @@ let setup_t = let setup () = BaseSetup.setup setup_t;; -# 7947 "setup.ml" +# 7948 "setup.ml" (* OASIS_STOP *) let () = setup ();; diff --git a/src/misc/containers_misc.mlpack b/src/misc/containers_misc.mlpack index 25190567..80596ad7 100644 --- a/src/misc/containers_misc.mlpack +++ b/src/misc/containers_misc.mlpack @@ -1,9 +1,10 @@ # OASIS_START -# DO NOT EDIT (digest: eb7a9d2756639dc6f89797f82adff355) +# DO NOT EDIT (digest: 64ac3a98881a419a2ed1f076194542f9) AbsSet Automaton Bij CSM +Hashset LazyGraph PHashtbl PrintBox diff --git a/src/misc/hashset.ml b/src/misc/hashset.ml new file mode 100644 index 00000000..110e4994 --- /dev/null +++ b/src/misc/hashset.ml @@ -0,0 +1,75 @@ +(* +Copyright (c) 2013, Simon Cruanes +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. Redistributions in binary +form must reproduce the above copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other materials provided with +the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*) + +(** {1 Mutable polymorphic hash-set} *) + +type 'a sequence = ('a -> unit) -> unit + +type 'a t = ('a, unit) PHashtbl.t + (** A set is a hashtable, with trivial values *) + +let empty ?max_load ?eq ?hash size = + PHashtbl.create ?max_load ?eq ?hash size + +let copy set = PHashtbl.copy set + +let clear set = PHashtbl.clear set + +let cardinal set = PHashtbl.length set + +let mem set x = PHashtbl.mem set x + +let add set x = PHashtbl.add set x () + +let remove set x = PHashtbl.remove set x + +let iter f set = PHashtbl.iter (fun x () -> f x) set + +let fold f acc set = PHashtbl.fold (fun acc x () -> f acc x) acc set + +let filter p set = PHashtbl.filter (fun x () -> p x) set + +let to_seq set k = iter k set + +let of_seq set seq = + seq (fun x -> add set x) + +let union ?into (s1 : 'a t) (s2 : 'a t) = + let into = match into with + | Some s -> of_seq s (to_seq s1); s + | None -> copy s1 in + of_seq into (to_seq s2); + into + +let seq_filter p seq k = + seq (fun x -> if p x then k x) + +let inter ?into (s1 : 'a t) (s2 : 'a t) = + let into = match into with + | Some s -> s + | None -> empty ~eq:s1.PHashtbl.eq ~hash:s1.PHashtbl.hash (cardinal s1) in + (* add to [into] elements of [s1] that also belong to [s2] *) + of_seq into (seq_filter (fun x -> mem s2 x) (to_seq s1)); + into diff --git a/src/misc/hashset.mli b/src/misc/hashset.mli new file mode 100644 index 00000000..f421c557 --- /dev/null +++ b/src/misc/hashset.mli @@ -0,0 +1,64 @@ +(* +Copyright (c) 2013, Simon Cruanes +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. Redistributions in binary +form must reproduce the above copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other materials provided with +the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*) + +(** {1 Mutable polymorphic hash-set} *) + +type 'a sequence = ('a -> unit) -> unit + +type 'a t = ('a, unit) PHashtbl.t + (** A set is a hashtable, with trivial values *) + +val empty : ?max_load:float -> ?eq:('a -> 'a -> bool) -> + ?hash:('a -> int) -> int -> 'a t + (** See {!PHashtbl.create} *) + +val copy : 'a t -> 'a t + +val clear : 'a t -> unit + +val cardinal : 'a t -> int + +val mem : 'a t -> 'a -> bool + +val add : 'a t -> 'a -> unit + +val remove : 'a t -> 'a -> unit + +val iter : ('a -> unit) -> 'a t -> unit + +val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b + +val filter : ('a -> bool) -> 'a t -> unit + (** destructive filter (remove elements that do not satisfy the predicate) *) + +val to_seq : 'a t -> 'a sequence + +val of_seq : 'a t -> 'a sequence -> unit + +val union : ?into:'a t -> 'a t -> 'a t -> 'a t + (** Set union. The result is stored in [into] *) + +val inter : ?into:'a t -> 'a t -> 'a t -> 'a t + (** Set intersection. The result is stored in [into] *)