Module Pooled_hashtbl
A polymorphic hashtbl that uses Pool to avoid allocation.
This uses the standard linked-chain hashtable algorithm, albeit with links performed through a pool and hence avoiding caml_modify (for table manipulation), even when hashing object keys/values.
This implementation is worth exploring for your application if profiling demonstrates that garbage collection and the caml_modify write barrier are a significant part of your execution time.
include Core_kernel.Hashtbl_intf.Hashtbl
val sexp_of_t : ('a -> Base.Sexp.t) -> ('b -> Base.Sexp.t) -> ('a, 'b) t -> Base.Sexp.tval create : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> ('a, 'b) tval of_alist : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> ('a * 'b) list -> [ `Duplicate_key of 'a | `Ok of ('a, 'b) t ]val of_alist_report_all_dups : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> ('a * 'b) list -> [ `Duplicate_keys of 'a list | `Ok of ('a, 'b) t ]val of_alist_or_error : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> ('a * 'b) list -> ('a, 'b) t Base.Or_error.tval of_alist_exn : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> ('a * 'b) list -> ('a, 'b) tval of_alist_multi : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> ('a * 'b) list -> ('a, 'b list) tval create_mapped : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> get_key:('r -> 'a) -> get_data:('r -> 'b) -> 'r list -> [ `Duplicate_keys of 'a list | `Ok of ('a, 'b) t ]val create_with_key : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> get_key:('r -> 'a) -> 'r list -> [ `Duplicate_keys of 'a list | `Ok of ('a, 'r) t ]val create_with_key_or_error : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> get_key:('r -> 'a) -> 'r list -> ('a, 'r) t Base.Or_error.tval create_with_key_exn : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> get_key:('r -> 'a) -> 'r list -> ('a, 'r) tval group : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> get_key:('r -> 'a) -> get_data:('r -> 'b) -> combine:('b -> 'b -> 'b) -> 'r list -> ('a, 'b) t
val sexp_of_key : ('a, 'b) t -> 'a key -> Base.Sexp.tval clear : ('a, 'b) t -> unitval copy : ('a, 'b) t -> ('a, 'b) tval fold : ('a, 'b) t -> init:'c -> f:(key:'a key -> data:'b -> 'c -> 'c) -> 'cval iter_keys : ('a, 'b) t -> f:('a key -> unit) -> unitval iter : ('a, 'b) t -> f:('b -> unit) -> unitval iteri : ('a, 'b) t -> f:(key:'a key -> data:'b -> unit) -> unitval existsi : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> boolval exists : ('a, 'b) t -> f:('b -> bool) -> boolval for_alli : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> boolval for_all : ('a, 'b) t -> f:('b -> bool) -> boolval counti : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> intval count : ('a, 'b) t -> f:('b -> bool) -> intval length : ('a, 'b) t -> intval is_empty : ('a, 'b) t -> boolval mem : ('a, 'b) t -> 'a key -> boolval remove : ('a, 'b) t -> 'a key -> unitval set : ('a, 'b) t -> key:'a key -> data:'b -> unitval add : ('a, 'b) t -> key:'a key -> data:'b -> [ `Duplicate | `Ok ]val add_exn : ('a, 'b) t -> key:'a key -> data:'b -> unitval change : ('a, 'b) t -> 'a key -> f:('b option -> 'b option) -> unitval update : ('a, 'b) t -> 'a key -> f:('b option -> 'b) -> unitval map : ('a, 'b) t -> f:('b -> 'c) -> ('a, 'c) tval mapi : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'c) -> ('a, 'c) tval filter_map : ('a, 'b) t -> f:('b -> 'c option) -> ('a, 'c) tval filter_mapi : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'c option) -> ('a, 'c) tval filter_keys : ('a, 'b) t -> f:('a key -> bool) -> ('a, 'b) tval filter : ('a, 'b) t -> f:('b -> bool) -> ('a, 'b) tval filteri : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> ('a, 'b) tval partition_map : ('a, 'b) t -> f:('b -> [ `Fst of 'c | `Snd of 'd ]) -> ('a, 'c) t * ('a, 'd) tval partition_mapi : ('a, 'b) t -> f:(key:'a key -> data:'b -> [ `Fst of 'c | `Snd of 'd ]) -> ('a, 'c) t * ('a, 'd) tval partition_tf : ('a, 'b) t -> f:('b -> bool) -> ('a, 'b) t * ('a, 'b) tval partitioni_tf : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> ('a, 'b) t * ('a, 'b) tval find_or_add : ('a, 'b) t -> 'a key -> default:(unit -> 'b) -> 'bval findi_or_add : ('a, 'b) t -> 'a key -> default:('a key -> 'b) -> 'bval find : ('a, 'b) t -> 'a key -> 'b optionval find_exn : ('a, 'b) t -> 'a key -> 'bval find_and_call : ('a, 'b) t -> 'a key -> if_found:('b -> 'c) -> if_not_found:('a key -> 'c) -> 'cval findi_and_call : ('a, 'b) t -> 'a key -> if_found:(key:'a key -> data:'b -> 'c) -> if_not_found:('a key -> 'c) -> 'cval find_and_remove : ('a, 'b) t -> 'a key -> 'b optionval merge : ('k, 'a) t -> ('k, 'b) t -> f:(key:'k key -> [ `Both of 'a * 'b | `Left of 'a | `Right of 'b ] -> 'c option) -> ('k, 'c) t
val merge_into : src:('k, 'a) t -> dst:('k, 'b) t -> f:(key:'k key -> 'a -> 'b option -> 'b merge_into_action) -> unitval keys : ('a, 'b) t -> 'a key listval data : ('a, 'b) t -> 'b listval filter_keys_inplace : ('a, 'b) t -> f:('a key -> bool) -> unitval filter_inplace : ('a, 'b) t -> f:('b -> bool) -> unitval filteri_inplace : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> unitval map_inplace : ('a, 'b) t -> f:('b -> 'b) -> unitval mapi_inplace : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'b) -> unitval filter_map_inplace : ('a, 'b) t -> f:('b -> 'b option) -> unitval filter_mapi_inplace : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'b option) -> unitval equal : ('a, 'b) t -> ('a, 'b) t -> ('b -> 'b -> bool) -> boolval similar : ('a, 'b1) t -> ('a, 'b2) t -> ('b1 -> 'b2 -> bool) -> boolval to_alist : ('a, 'b) t -> ('a key * 'b) listval validate : name:('a key -> string) -> 'b Base.Validate.check -> ('a, 'b) t Base.Validate.checkval incr : ?by:int -> ?remove_if_zero:bool -> ('a, int) t -> 'a key -> unitval decr : ?by:int -> ?remove_if_zero:bool -> ('a, int) t -> 'a key -> unitval add_multi : ('a, 'b list) t -> key:'a key -> data:'b -> unitval remove_multi : ('a, 'b list) t -> 'a key -> unitval find_multi : ('a, 'b list) t -> 'a key -> 'b listval hashable_s : ('key, 'a) t -> (module Base__.Hashtbl_intf.Key with type t = 'key)val invariant : 'a Base__.Invariant_intf.inv -> 'b Base__.Invariant_intf.inv -> ('a, 'b) t Base__.Invariant_intf.inv
module Using_hashable : sig ... endmodule Poly : sig ... endmodule type Key_plain = Core_kernel.Hashtbl_intf.Key_plainmodule type Key = Core_kernel.Hashtbl_intf.Keymodule type Key_binable = Core_kernel.Hashtbl_intf.Key_binablemodule type S_plain : Core_kernel.Hashtbl_intf.S_plain with type ('a, 'b) hashtbl = ('a, 'b) tmodule type S : Core_kernel.Hashtbl_intf.S with type ('a, 'b) hashtbl = ('a, 'b) tmodule type S_binable : Core_kernel.Hashtbl_intf.S_binable with type ('a, 'b) hashtbl = ('a, 'b) tmodule Make_binable : functor (Key : Key_binable) -> S_binable with type key = Key.tmodule M : functor (K : Core_kernel__.T.T) -> sig ... endmodule Hashable = Core_kernel.Hashtbl_intf.Hashableval hashable : ('key, _) t -> 'key Hashable.t
module type For_deriving = Core_kernel.Hashtbl_intf.For_derivinginclude For_deriving with type ('a, 'b) For_deriving.t := ('a, 'b) t
module type Sexp_of_m = sig ... endmodule type M_of_sexp = sig ... endval sexp_of_m__t : (module Sexp_of_m with type t = 'k) -> ('v -> Base.Sexp.t) -> ('k, 'v) t -> Base.Sexp.tval m__t_of_sexp : (module M_of_sexp with type t = 'k) -> (Base.Sexp.t -> 'v) -> Base.Sexp.t -> ('k, 'v) t
val iter_vals : (_, 'b) t -> f:('b -> Core_kernel__.Import.unit) -> Core_kernel__.Import.unitval replace : ('a, 'b) t -> key:'a key -> data:'b -> Core_kernel__.Import.unitval replace_all : (_, 'b) t -> f:('b -> 'b) -> Core_kernel__.Import.unitval replace_alli : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'b) -> Core_kernel__.Import.unitval filter_replace_all : (_, 'b) t -> f:('b -> 'b Core_kernel__.Import.option) -> Core_kernel__.Import.unitval filter_replace_alli : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'b Core_kernel__.Import.option) -> Core_kernel__.Import.unit
val resize : (_, _) t -> int -> unitresize t sizeensures thattcan hold at leastsizeentries without resizing (again), provided thatthas growth enabled. This is useful for sizing global tables during application initialization, to avoid subsequent, expensive growth online. SeeImmediate.String.resize, for example.
val on_grow : before:(unit -> 'a) -> after:('a -> old_capacity:int -> new_capacity:int -> unit) -> uniton_grow ~before ~afterallows you to connect higher level loggers to the point where these hashtbls grow.beforeis called before the table grows, andafterafter it. This permits you to e.g. measure the time elapsed between the two.This is only meant for debugging and profiling, e.g. note that once a callback is installed, there is no way to remove it.