(* * Copyright (c) 2017-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. *) open! IStd open! AbstractDomain.Types module F = Format module NonZeroInt = struct type t = Z.t [@@deriving compare] exception DivisionNotExact let one = Z.one let minus_one = Z.minus_one let of_big_int x = if Z.(equal x zero) then None else Some x let opt_to_big_int = function None -> Z.zero | Some i -> i let is_one = Z.equal one let is_minus_one = Z.equal minus_one let is_multiple m d = Z.(equal (m mod d) zero) let is_negative x = Z.(x < zero) let is_positive x = Z.(x > zero) let ( ~- ) = Z.( ~- ) let ( * ) = Z.( * ) let plus x y = of_big_int Z.(x + y) let exact_div_exn num den = let q, r = Z.div_rem num den in if Z.(equal r zero) then q else raise DivisionNotExact let max = Z.max let min = Z.min end module NonNegativeInt = struct type t = Z.t [@@deriving compare] let zero = Z.zero let one = Z.one let is_zero = Z.equal zero let is_one = Z.equal one let of_big_int i = if Z.(i < zero) then None else Some i let of_int_exn i = assert (i >= 0) ; Z.of_int i let of_big_int_exn i = assert (Z.(i >= zero)) ; i let ( <= ) ~lhs ~rhs = lhs <= rhs let ( + ) = Z.( + ) let ( * ) = Z.( * ) let max = Z.max let pp = Z.pp_print end module PositiveInt = struct type t = NonNegativeInt.t [@@deriving compare] let one = Z.one let of_big_int i = if Z.(i <= zero) then None else Some i let succ = Z.succ let pp = Z.pp_print end