mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 03:05:28 -05:00
200 lines
6.4 KiB
OCaml
200 lines
6.4 KiB
OCaml
(* This file is free software, part of containers. See file "license" for more details. *)
|
|
|
|
(** {1 Int32}
|
|
|
|
Helpers for 32-bit integers.
|
|
|
|
This module provides operations on the type int32 of signed 32-bit integers.
|
|
Unlike the built-in int type, the type int32 is guaranteed to be exactly
|
|
32-bit wide on all platforms. All arithmetic operations over int32 are taken
|
|
modulo 2{^32}.
|
|
|
|
Performance notice: values of type int32 occupy more memory space than values
|
|
of type int, and arithmetic operations on int32 are generally slower than
|
|
those on int. Use int32 only when the application requires exact 32-bit arithmetic.
|
|
|
|
@since 2.1 *)
|
|
|
|
include module type of struct include Int32 end
|
|
(** {{: https://caml.inria.fr/pub/docs/manual-ocaml/libref/Int32.html} Documentation for the standard Int32 module}*)
|
|
|
|
val min : t -> t -> t
|
|
(** [min x y] returns the minimum of the two integers [x] and [y].
|
|
@since 3.0 *)
|
|
|
|
val max : t -> t -> t
|
|
(** [max x y] returns the maximum of the two integers [x] and [y].
|
|
@since 3.0 *)
|
|
|
|
val hash : t -> int
|
|
(** [hash x] computes the hash of [x].
|
|
Like {!Stdlib.abs (to_int x)}. *)
|
|
|
|
val sign : t -> int
|
|
(** [sign x] return [0] if [x = 0], [-1] if [x < 0] and [1] if [x > 0].
|
|
Same as [compare x zero].
|
|
@since 3.0*)
|
|
|
|
val pow : t -> t -> t
|
|
(** [pow base exponent] returns [base] raised to the power of [exponent].
|
|
[pow x y = x^y] for positive integers [x] and [y].
|
|
Raises [Invalid_argument] if [x = y = 0] or [y] < 0.
|
|
@since 0.11 *)
|
|
|
|
val floor_div : t -> t -> t
|
|
(** [floor_div x n] is integer division rounding towards negative infinity.
|
|
It satisfies [x = m * floor_div x n + rem x n].
|
|
@since 3.0 *)
|
|
|
|
type 'a printer = Format.formatter -> 'a -> unit
|
|
type 'a random_gen = Random.State.t -> 'a
|
|
type 'a iter = ('a -> unit) -> unit
|
|
|
|
|
|
val range_by : step:t -> t -> t -> t iter
|
|
(** [range_by ~step i j] iterates on integers from [i] to [j] included,
|
|
where the difference between successive elements is [step].
|
|
Use a negative [step] for a decreasing list.
|
|
@raise Invalid_argument if [step=0].
|
|
@since 3.0 *)
|
|
|
|
val range : t -> t -> t iter
|
|
(** [range i j] iterates on integers from [i] to [j] included . It works
|
|
both for decreasing and increasing ranges.
|
|
@since 3.0 *)
|
|
|
|
val range' : t -> t -> t iter
|
|
(** [range' i j] is like {!range} but the second bound [j] is excluded.
|
|
For instance [range' 0 5 = Iter.of_list [0;1;2;3;4]].
|
|
@since 3.0 *)
|
|
|
|
val random : t -> t random_gen
|
|
val random_small : t random_gen
|
|
val random_range : t -> t -> t random_gen
|
|
|
|
|
|
(** {2 Conversion} *)
|
|
|
|
val of_string : string -> t option
|
|
(** [of_string s] is the safe version of {!of_string_exn}.
|
|
Like {!of_string_exn}, but return [None] instead of raising. *)
|
|
|
|
val of_string_opt : string -> t option
|
|
(** [of_string_opt s] is an alias to {!of_string}. *)
|
|
|
|
val of_string_exn : string -> t
|
|
(** [of_string_exn s] converts the given string [s] into a 32-bit integer.
|
|
Alias to {!Int32.of_string}.
|
|
The string is read in decimal (by default, or if the string
|
|
begins with [0u]) or in hexadecimal, octal or binary if the
|
|
string begins with [0x], [0o] or [0b] respectively.
|
|
|
|
The [0u] prefix reads the input as an unsigned integer in the range
|
|
[[0, 2*CCInt32.max_int+1]]. If the input exceeds {!CCInt32.max_int}
|
|
it is converted to the signed integer
|
|
[CCInt32.min_int + input - CCInt32.max_int - 1].
|
|
|
|
The [_] (underscore) character can appear anywhere in the string
|
|
and is ignored.
|
|
Raise [Failure "Int32.of_string"] if the given string is not
|
|
a valid representation of an integer, or if the integer represented
|
|
exceeds the range of integers representable in type [int32]. *)
|
|
|
|
val to_string_binary : t -> string
|
|
(** [to_string_binary x] returns the string representation of the integer [x], in binary.
|
|
@since 3.0 *)
|
|
|
|
|
|
(** {2 Printing} *)
|
|
|
|
val pp : t printer
|
|
(** [pp ppf x] prints the integer [x] on [ppf].
|
|
@since 3.0 *)
|
|
|
|
val pp_binary : t printer
|
|
(** [pp_binary ppf x] prints [x] on [ppf].
|
|
Print as "0b00101010".
|
|
@since 3.0 *)
|
|
|
|
|
|
(** {2 Infix Operators} *)
|
|
|
|
module Infix : sig
|
|
val ( + ) : t -> t -> t
|
|
(** [x + y] is the sum of [x] and [y].
|
|
Addition. *)
|
|
|
|
val ( - ) : t -> t -> t
|
|
(** [x - y] is the difference of [x] and [y].
|
|
Subtraction. *)
|
|
|
|
val ( ~- ) : t -> t
|
|
(** [~- x] is the negation of [x].
|
|
Unary negation. *)
|
|
|
|
val ( * ) : t -> t -> t
|
|
(** [ x * y] is the product of [x] and [y].
|
|
Multiplication. *)
|
|
|
|
val ( / ) : t -> t -> t
|
|
(** [x / y] is the integer quotient of [x] and [y].
|
|
Integer division. Raise [Division_by_zero] if the second
|
|
argument [y] is zero. This division rounds the real quotient of
|
|
its arguments towards zero, as specified for {!Stdlib.(/)}. *)
|
|
|
|
val ( mod ) : t -> t -> t
|
|
(** [x mod y] is the integer remainder of [x / y].
|
|
If [y <> zero], the result of [x mod y] satisfies the following properties:
|
|
[zero <= x mod y < abs y] and
|
|
[x = ((x / y) * y) + (x mod y)].
|
|
If [y = 0], [x mod y] raises [Division_by_zero]. *)
|
|
|
|
val ( ** ) : t -> t -> t
|
|
(** Alias to {!pow}
|
|
@since 3.0 *)
|
|
|
|
val (--) : t -> t -> t iter
|
|
(** Alias to {!range}.
|
|
@since 3.0 *)
|
|
|
|
val (--^) : t -> t -> t iter
|
|
(** Alias to {!range'}.
|
|
@since 3.0 *)
|
|
|
|
val ( land ) : t -> t -> t
|
|
(** [x land y] is the bitwise logical and of [x] and [y]. *)
|
|
|
|
val ( lor ) : t -> t -> t
|
|
(** [x lor y] is the bitwise logical or of [x] and [y]. *)
|
|
|
|
val ( lxor ) : t -> t -> t
|
|
(** [x lxor y] is the bitwise logical exclusive or of [x] and [y]. *)
|
|
|
|
val lnot : t -> t
|
|
(** [lnot x] is the bitwise logical negation of [x] (the bits of [x] are inverted). *)
|
|
|
|
val ( lsl ) : t -> int -> t
|
|
(** [ x lsl y] shifts [x] to the left by [y] bits, filling in with zeroes.
|
|
The result is unspecified if [y < 0] or [y >= 32]. *)
|
|
|
|
val ( lsr ) : t -> int -> t
|
|
(** [x lsr y] shifts [x] to the right by [y] bits.
|
|
This is a logical shift: zeroes are inserted in the vacated bits
|
|
regardless of the sign of [x].
|
|
The result is unspecified if [y < 0] or [y >= 32]. *)
|
|
|
|
val ( asr ) : t -> int -> t
|
|
(** [x asr y] shifts [x] to the right by [y] bits.
|
|
This is an arithmetic shift: the sign bit of [x] is replicated
|
|
and inserted in the vacated bits.
|
|
The result is unspecified if [y < 0] or [y >= 32]. *)
|
|
|
|
val (=) : t -> t -> bool
|
|
val (<>) : t -> t -> bool
|
|
val (>) : t -> t -> bool
|
|
val (>=) : t -> t -> bool
|
|
val (<=) : t -> t -> bool
|
|
val (<) : t -> t -> bool
|
|
end
|
|
|
|
include module type of Infix
|