Module Core_kernel.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 Hashtbl_intf.Hashtbl
val hash : 'a ‑> int
val hash_param : int ‑> int ‑> 'a ‑> int
type ('a, 'b) t
val sexp_of_t : ('a ‑> Base.Sexp.t) ‑> ('b ‑> Base.Sexp.t) ‑> ('a'bt ‑> Base.Sexp.t
val create : ?⁠growth_allowed:bool ‑> ?⁠size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> ('a'bt
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'bt ]
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'bt ]
val of_alist_or_error : ?⁠growth_allowed:bool ‑> ?⁠size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> ('a * 'b) list ‑> ('a'bt 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'bt
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'bt ]
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'rt ]
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'rt 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'rt
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'bt
type 'a key = 'a
val sexp_of_key : ('a'bt ‑> 'a key ‑> Base.Sexp.t
val clear : ('a'bt ‑> unit
val copy : ('a'bt ‑> ('a'bt
val fold : ('a'bt ‑> init:'c ‑> f:(key:'a key ‑> data:'b ‑> 'c ‑> 'c) ‑> 'c
val iter_keys : ('a'bt ‑> f:('a key ‑> unit) ‑> unit
val iter : ('a'bt ‑> f:('b ‑> unit) ‑> unit
val iteri : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> unit) ‑> unit
val existsi : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> bool) ‑> bool
val exists : ('a'bt ‑> f:('b ‑> bool) ‑> bool
val for_alli : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> bool) ‑> bool
val for_all : ('a'bt ‑> f:('b ‑> bool) ‑> bool
val counti : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> bool) ‑> int
val count : ('a'bt ‑> f:('b ‑> bool) ‑> int
val length : ('a'bt ‑> int
val is_empty : ('a'bt ‑> bool
val mem : ('a'bt ‑> 'a key ‑> bool
val remove : ('a'bt ‑> 'a key ‑> unit
val set : ('a'bt ‑> key:'a key ‑> data:'b ‑> unit
val add : ('a'bt ‑> key:'a key ‑> data:'b ‑> [ `Duplicate | `Ok ]
val add_exn : ('a'bt ‑> key:'a key ‑> data:'b ‑> unit
val change : ('a'bt ‑> 'a key ‑> f:('b option ‑> 'b option) ‑> unit
val update : ('a'bt ‑> 'a key ‑> f:('b option ‑> 'b) ‑> unit
val map : ('a'bt ‑> f:('b ‑> 'c) ‑> ('a'ct
val mapi : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> 'c) ‑> ('a'ct
val filter_map : ('a'bt ‑> f:('b ‑> 'c option) ‑> ('a'ct
val filter_mapi : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> 'c option) ‑> ('a'ct
val filter_keys : ('a'bt ‑> f:('a key ‑> bool) ‑> ('a'bt
val filter : ('a'bt ‑> f:('b ‑> bool) ‑> ('a'bt
val filteri : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> bool) ‑> ('a'bt
val partition_map : ('a'bt ‑> f:('b ‑> [ `Fst of 'c | `Snd of 'd ]) ‑> ('a'ct * ('a'dt
val partition_mapi : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> [ `Fst of 'c | `Snd of 'd ]) ‑> ('a'ct * ('a'dt
val partition_tf : ('a'bt ‑> f:('b ‑> bool) ‑> ('a'bt * ('a'bt
val partitioni_tf : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> bool) ‑> ('a'bt * ('a'bt
val find_or_add : ('a'bt ‑> 'a key ‑> default:(unit ‑> 'b) ‑> 'b
val findi_or_add : ('a'bt ‑> 'a key ‑> default:('a key ‑> 'b) ‑> 'b
val find : ('a'bt ‑> 'a key ‑> 'b option
val find_exn : ('a'bt ‑> 'a key ‑> 'b
val find_and_call : ('a'bt ‑> 'a key ‑> if_found:('b ‑> 'c) ‑> if_not_found:('a key ‑> 'c) ‑> 'c
val findi_and_call : ('a'bt ‑> 'a key ‑> if_found:(key:'a key ‑> data:'b ‑> 'c) ‑> if_not_found:('a key ‑> 'c) ‑> 'c
val find_and_remove : ('a'bt ‑> 'a key ‑> 'b option
val merge : ('k'at ‑> ('k'bt ‑> f:(key:'k key ‑> [ `Both of 'a * 'b | `Left of 'a | `Right of 'b ] ‑> 'c option) ‑> ('k'ct
type 'a merge_into_action =
| Remove
| Set_to of 'a
val merge_into : src:('k'at ‑> dst:('k'bt ‑> f:(key:'k key ‑> 'a ‑> 'b option ‑> 'b merge_into_action) ‑> unit
val keys : ('a'bt ‑> 'a key list
val data : ('a'bt ‑> 'b list
val filter_keys_inplace : ('a'bt ‑> f:('a key ‑> bool) ‑> unit
val filter_inplace : ('a'bt ‑> f:('b ‑> bool) ‑> unit
val filteri_inplace : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> bool) ‑> unit
val map_inplace : ('a'bt ‑> f:('b ‑> 'b) ‑> unit
val mapi_inplace : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> 'b) ‑> unit
val filter_map_inplace : ('a'bt ‑> f:('b ‑> 'b option) ‑> unit
val filter_mapi_inplace : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> 'b option) ‑> unit
val equal : ('a'bt ‑> ('a'bt ‑> ('b ‑> 'b ‑> bool) ‑> bool
val similar : ('a'b1t ‑> ('a'b2t ‑> ('b1 ‑> 'b2 ‑> bool) ‑> bool
val to_alist : ('a'bt ‑> ('a key * 'b) list
val validate : name:('a key ‑> string) ‑> 'b Base.Validate.check ‑> ('a'bt 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'at ‑> (module Base__.Hashtbl_intf.Key with type t = 'key)
module Using_hashable : sig ... end
module Poly : sig ... end
module type Key_plain = Hashtbl_intf.Key_plain
module type Key = Hashtbl_intf.Key
module type S_plain : Hashtbl_intf.S_plain with type ('a, 'b) hashtbl = ('a'bt
module type S : Hashtbl_intf.S with type ('a, 'b) hashtbl = ('a'bt
module type S_binable : Hashtbl_intf.S_binable with type ('a, 'b) hashtbl = ('a'bt
module Make_plain : functor (Key : Key_plain) -> S_plain with type key = Key.t
module Make : functor (Key : Key) -> S with type key = Key.t
module Make_binable : functor (Key : Key_binable) -> S_binable with type key = Key.t
module M : functor (K : Base.T.T) -> sig ... end
module Hashable = Hashtbl_intf.Hashable
val hashable : ('key_t ‑> 'key Hashable.t
val iter_vals : (_'bt ‑> f:('b ‑> Core_kernel__.Import.unit) ‑> Core_kernel__.Import.unit
  • Deprecated [since 2016-04] Use iter instead
val replace : ('a'bt ‑> key:'a key ‑> data:'b ‑> Core_kernel__.Import.unit
  • Deprecated [since 2015-10] Use set instead
val replace_all : (_'bt ‑> f:('b ‑> 'b) ‑> Core_kernel__.Import.unit
  • Deprecated [since 2016-02] Use map_inplace instead
val replace_alli : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> 'b) ‑> Core_kernel__.Import.unit
  • Deprecated [since 2016-02] Use mapi_inplace instead
val filter_replace_all : (_'bt ‑> f:('b ‑> 'b Core_kernel__.Import.option) ‑> Core_kernel__.Import.unit
  • Deprecated [since 2016-02] Use filter_map_inplace instead
val filter_replace_alli : ('a'bt ‑> f:(key:'a key ‑> data:'b ‑> 'b Core_kernel__.Import.option) ‑> Core_kernel__.Import.unit
  • Deprecated [since 2016-02] Use filter_mapi_inplace instead
val resize : (__t ‑> Core_kernel__.Import.int ‑> Core_kernel__.Import.unit

resize t size ensures that t can hold at least size entries without resizing (again), provided that t has growth enabled. This is useful for sizing global tables during application initialization, to avoid subsequent, expensive growth online. See Zero.Immediate.String.resize, for example.

val on_grow : before:(Core_kernel__.Import.unit ‑> 'a) ‑> after:('a ‑> old_capacity:Core_kernel__.Import.int ‑> new_capacity:Core_kernel__.Import.int ‑> Core_kernel__.Import.unit) ‑> Core_kernel__.Import.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, and after 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.