ocaml-containers/src/core/CCInt.ml
2016-02-20 23:24:24 +01:00

55 lines
1.2 KiB
OCaml

(* This file is free software, part of containers. See file "license" for more details. *)
type t = int
let equal (a:int) b = a=b
let compare (a:int) b = Pervasives.compare a b
let hash i = i land max_int
let sign i =
if i < 0 then -1
else if i>0 then 1
else 0
let neg i = -i
let pow a b =
let rec aux acc = function
| 1 -> acc
| n ->
if n mod 2 = 0
then aux (acc*acc) (n/2)
else acc * (aux (acc*acc) (n/2))
in
match b with
| 0 -> if a = 0 then raise (Invalid_argument "pow: undefined value 0^0") else 1
| b when b < 0 -> raise (Invalid_argument "pow: can't raise int to negative power")
| b -> aux a b
(*$T
pow 2 10 = 1024
pow 2 15 = 32768
pow 10 5 = 100000
pow 1 0 = 1
pow 0 1 = 0
*)
type 'a printer = Buffer.t -> 'a -> unit
type 'a formatter = Format.formatter -> 'a -> unit
type 'a random_gen = Random.State.t -> 'a
let random n st = Random.State.int st n
let random_small = random 100
let random_range i j st = i + random (j-i) st
let pp buf = Printf.bprintf buf "%d"
let print fmt = Format.pp_print_int fmt
let to_string = string_of_int
let of_string s =
try Some (int_of_string s)
with _ -> None