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.t
val create : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> ('a, 'b) t
val 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.t
val of_alist_exn : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> ('a * 'b) list -> ('a, 'b) t
val of_alist_multi : ?growth_allowed:bool -> ?size:int -> (module Base__.Hashtbl_intf.Key with type t = 'a) -> ('a * 'b) list -> ('a, 'b list) t
val 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.t
val 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) t
val 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.t
val clear : ('a, 'b) t -> unit
val copy : ('a, 'b) t -> ('a, 'b) t
val fold : ('a, 'b) t -> init:'c -> f:(key:'a key -> data:'b -> 'c -> 'c) -> 'c
val iter_keys : ('a, 'b) t -> f:('a key -> unit) -> unit
val iter : ('a, 'b) t -> f:('b -> unit) -> unit
val iteri : ('a, 'b) t -> f:(key:'a key -> data:'b -> unit) -> unit
val existsi : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> bool
val exists : ('a, 'b) t -> f:('b -> bool) -> bool
val for_alli : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> bool
val for_all : ('a, 'b) t -> f:('b -> bool) -> bool
val counti : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> int
val count : ('a, 'b) t -> f:('b -> bool) -> int
val length : ('a, 'b) t -> int
val is_empty : ('a, 'b) t -> bool
val mem : ('a, 'b) t -> 'a key -> bool
val remove : ('a, 'b) t -> 'a key -> unit
val set : ('a, 'b) t -> key:'a key -> data:'b -> unit
val add : ('a, 'b) t -> key:'a key -> data:'b -> [ `Duplicate | `Ok ]
val add_exn : ('a, 'b) t -> key:'a key -> data:'b -> unit
val change : ('a, 'b) t -> 'a key -> f:('b option -> 'b option) -> unit
val update : ('a, 'b) t -> 'a key -> f:('b option -> 'b) -> unit
val map : ('a, 'b) t -> f:('b -> 'c) -> ('a, 'c) t
val mapi : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'c) -> ('a, 'c) t
val filter_map : ('a, 'b) t -> f:('b -> 'c option) -> ('a, 'c) t
val filter_mapi : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'c option) -> ('a, 'c) t
val filter_keys : ('a, 'b) t -> f:('a key -> bool) -> ('a, 'b) t
val filter : ('a, 'b) t -> f:('b -> bool) -> ('a, 'b) t
val filteri : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> ('a, 'b) t
val partition_map : ('a, 'b) t -> f:('b -> [ `Fst of 'c | `Snd of 'd ]) -> ('a, 'c) t * ('a, 'd) t
val partition_mapi : ('a, 'b) t -> f:(key:'a key -> data:'b -> [ `Fst of 'c | `Snd of 'd ]) -> ('a, 'c) t * ('a, 'd) t
val partition_tf : ('a, 'b) t -> f:('b -> bool) -> ('a, 'b) t * ('a, 'b) t
val partitioni_tf : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> ('a, 'b) t * ('a, 'b) t
val find_or_add : ('a, 'b) t -> 'a key -> default:(unit -> 'b) -> 'b
val findi_or_add : ('a, 'b) t -> 'a key -> default:('a key -> 'b) -> 'b
val find : ('a, 'b) t -> 'a key -> 'b option
val find_exn : ('a, 'b) t -> 'a key -> 'b
val find_and_call : ('a, 'b) t -> 'a key -> if_found:('b -> 'c) -> if_not_found:('a key -> 'c) -> 'c
val findi_and_call : ('a, 'b) t -> 'a key -> if_found:(key:'a key -> data:'b -> 'c) -> if_not_found:('a key -> 'c) -> 'c
val find_and_remove : ('a, 'b) t -> 'a key -> 'b option
val 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) -> unit
val keys : ('a, 'b) t -> 'a key list
val data : ('a, 'b) t -> 'b list
val filter_keys_inplace : ('a, 'b) t -> f:('a key -> bool) -> unit
val filter_inplace : ('a, 'b) t -> f:('b -> bool) -> unit
val filteri_inplace : ('a, 'b) t -> f:(key:'a key -> data:'b -> bool) -> unit
val map_inplace : ('a, 'b) t -> f:('b -> 'b) -> unit
val mapi_inplace : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'b) -> unit
val filter_map_inplace : ('a, 'b) t -> f:('b -> 'b option) -> unit
val filter_mapi_inplace : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'b option) -> unit
val equal : ('a, 'b) t -> ('a, 'b) t -> ('b -> 'b -> bool) -> bool
val similar : ('a, 'b1) t -> ('a, 'b2) t -> ('b1 -> 'b2 -> bool) -> bool
val to_alist : ('a, 'b) t -> ('a key * 'b) list
val validate : name:('a key -> string) -> 'b Base.Validate.check -> ('a, 'b) t Base.Validate.check
val incr : ?by:int -> ?remove_if_zero:bool -> ('a, int) t -> 'a key -> unit
val decr : ?by:int -> ?remove_if_zero:bool -> ('a, int) t -> 'a key -> unit
val add_multi : ('a, 'b list) t -> key:'a key -> data:'b -> unit
val remove_multi : ('a, 'b list) t -> 'a key -> unit
val find_multi : ('a, 'b list) t -> 'a key -> 'b list
val 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 ... end
module Poly : sig ... end
module type Key_plain = Core_kernel.Hashtbl_intf.Key_plain
module type Key = Core_kernel.Hashtbl_intf.Key
module type Key_binable = Core_kernel.Hashtbl_intf.Key_binable
module type S_plain : Core_kernel.Hashtbl_intf.S_plain with type ('a, 'b) hashtbl = ('a, 'b) t
module type S : Core_kernel.Hashtbl_intf.S with type ('a, 'b) hashtbl = ('a, 'b) t
module type S_binable : Core_kernel.Hashtbl_intf.S_binable with type ('a, 'b) hashtbl = ('a, 'b) t
module Make_binable : functor (Key : Key_binable) -> S_binable with type key = Key.t
module M : functor (K : Core_kernel__.T.T) -> sig ... end
module Hashable = Core_kernel.Hashtbl_intf.Hashable
val hashable : ('key, _) t -> 'key Hashable.t
module type For_deriving = Core_kernel.Hashtbl_intf.For_deriving
include For_deriving with type ('a, 'b) For_deriving.t := ('a, 'b) t
module type Sexp_of_m = sig ... end
module type M_of_sexp = sig ... end
val sexp_of_m__t : (module Sexp_of_m with type t = 'k) -> ('v -> Base.Sexp.t) -> ('k, 'v) t -> Base.Sexp.t
val 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.unit
val replace : ('a, 'b) t -> key:'a key -> data:'b -> Core_kernel__.Import.unit
val replace_all : (_, 'b) t -> f:('b -> 'b) -> Core_kernel__.Import.unit
val replace_alli : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'b) -> Core_kernel__.Import.unit
val filter_replace_all : (_, 'b) t -> f:('b -> 'b Core_kernel__.Import.option) -> Core_kernel__.Import.unit
val 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 -> unit
resize t size
ensures thatt
can hold at leastsize
entries without resizing (again), provided thatt
has 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) -> unit
on_grow ~before ~after
allows you to connect higher level loggers to the point where these hashtbls grow.before
is called before the table grows, andafter
after 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.