package core_kernel

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

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__.Ppx_sexp_conv_lib.Sexp.t) -> ('b -> Base__.Ppx_sexp_conv_lib.Sexp.t) -> ('a, 'b) t -> Base__.Ppx_sexp_conv_lib.Sexp.t
val invariant : 'a Base__.Invariant_intf.inv -> 'b Base__.Invariant_intf.inv -> ('a, 'b) t Base__.Invariant_intf.inv
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
type !'a key = 'a
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
type !'a merge_into_action =
  1. | Remove
  2. | Set_to of 'a
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)
module Using_hashable : sig ... end
module Poly : sig ... end
module type Key_plain = Pooled_hashtbl.Key_plain
module type Key = Pooled_hashtbl.Key
module type Key_binable = Pooled_hashtbl.Key_binable
module type S = Pooled_hashtbl.S
module Make_plain (Key : Pooled_hashtbl.Key_plain) : sig ... end
module Make (Key : Pooled_hashtbl.Key) : sig ... end
module M (K : Base.T.T) : sig ... end
module Hashable = Hashtbl_intf.Hashable
val hashable : ('key, _) t -> 'key Hashable.t
val iter_vals : (_, 'b) t -> f:('b -> Base.Unit.t) -> Base.Unit.t
  • deprecated [since 2016-04] Use iter instead
val replace : ('a, 'b) t -> key:'a key -> data:'b -> Base.Unit.t
  • deprecated [since 2015-10] Use set instead
val replace_all : (_, 'b) t -> f:('b -> 'b) -> Base.Unit.t
  • deprecated [since 2016-02] Use map_inplace instead
val replace_alli : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'b) -> Base.Unit.t
  • deprecated [since 2016-02] Use mapi_inplace instead
val filter_replace_all : (_, 'b) t -> f:('b -> 'b Base.Option.t) -> Base.Unit.t
  • deprecated [since 2016-02] Use filter_map_inplace instead
val filter_replace_alli : ('a, 'b) t -> f:(key:'a key -> data:'b -> 'b Base.Option.t) -> Base.Unit.t
  • deprecated [since 2016-02] Use filter_mapi_inplace instead
val resize : (_, _) t -> Base.Int.t -> Base.Unit.t

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:(Base.Unit.t -> 'a) -> after: ('a -> old_capacity:Base.Int.t -> new_capacity:Base.Int.t -> Base.Unit.t) -> Base.Unit.t

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.

OCaml

Innovation. Community. Security.