ocaml/utils/numbers.ml

89 lines
2.6 KiB
OCaml

(**************************************************************************)
(* *)
(* OCaml *)
(* *)
(* Pierre Chambart, OCamlPro *)
(* Mark Shinwell and Leo White, Jane Street Europe *)
(* *)
(* Copyright 2013--2016 OCamlPro SAS *)
(* Copyright 2014--2016 Jane Street Group LLC *)
(* *)
(* All rights reserved. This file is distributed under the terms of *)
(* the GNU Lesser General Public License version 2.1, with the *)
(* special exception on linking described in the file LICENSE. *)
(* *)
(**************************************************************************)
module Int_base = Identifiable.Make (struct
type t = int
let compare x y = x - y
let output oc x = Printf.fprintf oc "%i" x
let hash i = i
let equal (i : int) j = i = j
let print = Format.pp_print_int
end)
module Int = struct
type t = int
include Int_base
let rec zero_to_n n =
if n < 0 then Set.empty else Set.add n (zero_to_n (n-1))
let to_string n = Int.to_string n
end
module Int8 = struct
type t = int
let zero = 0
let one = 1
let of_int_exn i =
if i < -(1 lsl 7) || i > ((1 lsl 7) - 1) then
Misc.fatal_errorf "Int8.of_int_exn: %d is out of range" i
else
i
let to_int i = i
end
module Int16 = struct
type t = int
let of_int_exn i =
if i < -(1 lsl 15) || i > ((1 lsl 15) - 1) then
Misc.fatal_errorf "Int16.of_int_exn: %d is out of range" i
else
i
let lower_int64 = Int64.neg (Int64.shift_left Int64.one 15)
let upper_int64 = Int64.sub (Int64.shift_left Int64.one 15) Int64.one
let of_int64_exn i =
if Int64.compare i lower_int64 < 0
|| Int64.compare i upper_int64 > 0
then
Misc.fatal_errorf "Int16.of_int64_exn: %Ld is out of range" i
else
Int64.to_int i
let to_int t = t
end
module Float = struct
type t = float
include Identifiable.Make (struct
type t = float
let compare x y = Stdlib.compare x y
let output oc x = Printf.fprintf oc "%f" x
let hash f = Hashtbl.hash f
let equal (i : float) j = i = j
let print = Format.pp_print_float
end)
end