package smtml
Source file cache.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67(* SPDX-License-Identifier: MIT *) (* Copyright (C) 2023-2024 formalsec *) (* Written by the Smtml programmers *) include Cache_intf module Strong : S = struct include Hashtbl.Make (Expr.Set) type nonrec !'a t = { data : 'a t ; hits : int Atomic.t ; misses : int Atomic.t } let hits { hits; _ } = Atomic.get hits let misses { misses; _ } = Atomic.get misses let create sz = { data = create sz; hits = Atomic.make 0; misses = Atomic.make 0 } let reset { data; _ } = reset data let copy { data; hits; misses } = { data = copy data ; hits = Atomic.(make (get hits)) ; misses = Atomic.(make (get misses)) } let add { data; _ } k v = add data k v let remove { data; _ } k = remove data k let find_opt { data; hits; misses } k = match find_opt data k with | Some _ as v -> Atomic.incr hits; v | None as v -> Atomic.incr misses; v let replace { data; _ } k v = replace data k v let mem { data; _ } k = mem data k let iter f { data; _ } = iter f data let filter_map_inplace f { data; _ } = filter_map_inplace f data let fold f { data; _ } acc = fold f data acc let length { data; _ } = length data let stats { data; _ } = stats data let to_seq { data; _ } = to_seq data let to_seq_keys { data; _ } = to_seq_keys data let to_seq_values { data; _ } = to_seq_values data let add_seq { data; _ } seq = add_seq data seq let replace_seq { data; _ } seq = replace_seq data seq end