package mc2
Source file Value.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(** {1 Values} *) open Solver_types module Fmt = CCFormat type t = value type view = value_view let[@inline] is_bool = function V_true | V_false -> true | V_value _ -> false let[@inline] is_true = function V_true -> true | _ -> false let[@inline] is_false = function V_false -> true | _ -> false let[@inline] as_bool = function V_true -> Some true | V_false -> Some false | _ -> None let[@inline] as_bool_exn = function V_true -> true | V_false -> false | _ -> assert false let[@inline] view v = match v with | V_true | V_false -> assert false | V_value{view;_} -> view let[@inline] tc v = match v with | V_true | V_false -> assert false | V_value{tc;_} -> tc let[@inline] equal v1 v2 = match v1, v2 with | V_true, V_true | V_false, V_false -> true | V_value {tc=tc1;view=v1}, V_value{view=v2;_} -> tc1.tcv_equal v1 v2 | V_true, _ | V_false, _ | V_value _, _ -> false let[@inline] hash v = match v with | V_true -> 10 | V_false -> 20 | V_value{view;tc} -> tc.tcv_hash view let[@inline] pp out v = match v with | V_true -> Fmt.string out "true" | V_false -> Fmt.string out "false" | V_value {view;tc} -> tc.tcv_pp out view let true_ = V_true let false_ = V_false let[@inline] of_bool b = if b then true_ else false_ let[@inline] make tc view : t = V_value { tc; view } let[@inline] bool_neg = function | V_true -> false_ | V_false -> true_ | v -> v module As_key = struct type t = value let equal = equal let hash = hash end module Tbl = CCHashtbl.Make(As_key) module TC = struct type t = tc_value let make ~pp ~equal ~hash () : t = {tcv_pp=pp; tcv_equal=equal; tcv_hash=hash} end