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 Core.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, 'b) t -> Base__.Sexp.t
val create : ?growth_allowed:bool -> ?size:int -> 'a Base__.Hashtbl_intf.Key.t -> ('a, 'b) t
val of_alist : ?growth_allowed:bool -> ?size:int -> 'a Base__.Hashtbl_intf.Key.t -> ('a * 'b) list -> [ `Duplicate_key of 'a | `Ok of ('a, 'b) t ]
val of_alist_report_all_dups : ?growth_allowed:bool -> ?size:int -> 'a Base__.Hashtbl_intf.Key.t -> ('a * 'b) list -> [ `Duplicate_keys of 'a list | `Ok of ('a, 'b) t ]
val of_alist_or_error : ?growth_allowed:bool -> ?size:int -> 'a Base__.Hashtbl_intf.Key.t -> ('a * 'b) list -> ('a, 'b) t Base__.Or_error.t
val of_alist_exn : ?growth_allowed:bool -> ?size:int -> 'a Base__.Hashtbl_intf.Key.t -> ('a * 'b) list -> ('a, 'b) t
val of_alist_multi : ?growth_allowed:bool -> ?size:int -> 'a Base__.Hashtbl_intf.Key.t -> ('a * 'b) list -> ('a, 'b list) t
val create_mapped : ?growth_allowed:bool -> ?size:int -> 'a Base__.Hashtbl_intf.Key.t -> 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 -> 'a Base__.Hashtbl_intf.Key.t -> 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 -> 'a Base__.Hashtbl_intf.Key.t -> get_key:('r -> 'a) -> 'r list -> ('a, 'r) t Base__.Or_error.t
val create_with_key_exn : ?growth_allowed:bool -> ?size:int -> 'a Base__.Hashtbl_intf.Key.t -> get_key:('r -> 'a) -> 'r list -> ('a, 'r) t
val group : ?growth_allowed:bool -> ?size:int -> 'a Base__.Hashtbl_intf.Key.t -> 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 choose : ('a, 'b) t -> ('a key * 'b) option
val choose_exn : ('a, 'b) t -> 'a key * 'b
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 update_and_return : ('a, 'b) t -> 'a key -> f:('b option -> 'b) -> 'b
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 -> ('c, 'd) Base__.Either.t) -> ('a, 'c) t * ('a, 'd) t
val partition_mapi : ('a, 'b) t -> f:(key:'a key -> data:'b -> ('c, 'd) Base__.Either.t) -> ('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 find_and_call1 : ('a, 'b) t -> 'a key -> a:'d -> if_found:('b -> 'd -> 'c) -> if_not_found:('a key -> 'd -> 'c) -> 'c
val find_and_call2 : ('a, 'b) t -> 'a key -> a:'d -> b:'e -> if_found:('b -> 'd -> 'e -> 'c) -> if_not_found:('a key -> 'd -> 'e -> '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 findi_and_call1 : ('a, 'b) t -> 'a key -> a:'d -> if_found:(key:'a key -> data:'b -> 'd -> 'c) -> if_not_found:('a key -> 'd -> 'c) -> 'c
val findi_and_call2 : ('a, 'b) t -> 'a key -> a:'d -> b:'e -> if_found:(key:'a key -> data:'b -> 'd -> 'e -> 'c) -> if_not_found:('a key -> 'd -> 'e -> '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 Base__.Hashtbl_intf.Merge_into_action.t) -> 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 : ('b -> 'b -> bool) -> ('a, 'b) t -> ('a, 'b) t -> bool
val similar : ('b1 -> 'b2 -> bool) -> ('a, 'b1) t -> ('a, 'b2) t -> bool
val to_alist : ('a, 'b) t -> ('a key * 'b) list
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 -> 'key Base__.Hashtbl_intf.Key.t
val invariant : 'a Base__.Invariant_intf.inv -> 'b Base__.Invariant_intf.inv -> ('a, 'b) t Base__.Invariant_intf.inv
val validate : name:('a key -> Base.String.t) -> 'b Validate.check -> ('a, 'b) t Validate.check
module Using_hashable : sig ... end
module Poly : sig ... end
module type Key_plain = Core.Hashtbl_intf.Key_plain
module type Key = Core.Hashtbl_intf.Key
module type Key_binable = Core.Hashtbl_intf.Key_binable
module type S_plain = Core.Hashtbl_intf.S_plain with type ('a, 'b) hashtbl = ('a, 'b) t
module type S = Core.Hashtbl_intf.S with type ('a, 'b) hashtbl = ('a, 'b) t
module type S_binable = Core.Hashtbl_intf.S_binable with type ('a, 'b) hashtbl = ('a, 'b) t
module Make_plain (Key : Key_plain) : S_plain with type key = Key.t
module Make (Key : Key) : S with type key = Key.t
module Make_binable (Key : Key_binable) : S_binable with type key = Key.t
module Make_plain_with_hashable (T : sig ... end) : S_plain with type key = T.Key.t
module Make_with_hashable (T : sig ... end) : S with type key = T.Key.t
module Make_binable_with_hashable (T : sig ... end) : S_binable with type key = T.Key.t
module M (K : sig ... end) : sig ... end
module Hashable = Core.Hashtbl_intf.Hashable
module Merge_into_action = Core.Hashtbl_intf.Merge_into_action
val hashable : ('key, _) t -> 'key Hashable.t
module type For_deriving = Core.Hashtbl_intf.For_deriving
include For_deriving with type ('a, 'b) t := ('a, 'b) t
include Base.Hashtbl.For_deriving with type ('a, 'b) t := ('a, 'b) t
module type Sexp_of_m = sig ... end
module type M_of_sexp = sig ... end
module type M_sexp_grammar = sig ... end
module type Equal_m = 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 m__t_sexp_grammar : (module M_sexp_grammar with type t = 'k) -> 'v Sexplib0.Sexp_grammar.t -> ('k, 'v) t Sexplib0.Sexp_grammar.t
val equal_m__t : (module Equal_m) -> ('v -> 'v -> bool) -> ('k, 'v) t -> ('k, 'v) t -> bool
module type M_quickcheck = Core.Hashtbl_intf.M_quickcheck
val quickcheck_generator_m__t : (module M_quickcheck with type t = 'k) -> 'v Base_quickcheck.Generator.t -> ('k, 'v) t Core.Quickcheck.Generator.t
val quickcheck_observer_m__t : (module M_quickcheck with type t = 'k) -> 'v Core.Quickcheck.Observer.t -> ('k, 'v) t Core.Quickcheck.Observer.t
val quickcheck_shrinker_m__t : (module M_quickcheck with type t = 'k) -> 'v Core.Quickcheck.Shrinker.t -> ('k, 'v) t Core.Quickcheck.Shrinker.t
val resize : (_, _) t -> int -> 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 Immediate.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, 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.