diff --git a/src/core/CCNativeint.ml b/src/core/CCNativeint.ml new file mode 100644 index 00000000..b9692c38 --- /dev/null +++ b/src/core/CCNativeint.ml @@ -0,0 +1,51 @@ +(* This file is free software, part of containers. See file "license" for more details. *) + +include Nativeint + +let equal (x:t) y = Pervasives.(=) x y + +module Infix = struct + let (+) = add + + let (-) = sub + + let (~-) = neg + + let ( * ) = mul + + let (/) = div + + let (mod) = rem + + let (land) = logand + + let (lor) = logor + + let (lxor) = logxor + + let lnot = lognot + + let (lsl) = shift_left + + let (lsr) = shift_right_logical + + let (asr) = shift_right + + let (=) = equal + + let (<>) = Pervasives.(<>) + let (<) = Pervasives.(<) + let (<=) = Pervasives.(<=) + let (>) = Pervasives.(>) + let (>=) = Pervasives.(>=) +end +include Infix + +let hash x = Pervasives.abs (to_int x) + +(** {2 Conversion} *) + +let of_string_exn = of_string + +let of_string x = try Some (of_string_exn x) with Failure _ -> None +let of_string_opt = of_string diff --git a/src/core/CCNativeint.mli b/src/core/CCNativeint.mli new file mode 100644 index 00000000..e1e72f8d --- /dev/null +++ b/src/core/CCNativeint.mli @@ -0,0 +1,148 @@ +(* This file is free software, part of containers. See file "license" for more details. *) + +(** {1 Nativeint} + + Helpers for processor-native integers. + + This module provides operations on the type [nativeint] of signed 32-bit integers + (on 32-bit platforms) or signed 64-bit integers (on 64-bit platforms). + This integer type has exactly the same width as that of a pointer type in the C compiler. + All arithmetic operations over nativeint are taken modulo 2{^32} or 2{^64} depending + on the word size of the architecture. + + Performance notice: values of type [nativeint] occupy more memory space than values of type [int], + and arithmetic operations on [nativeint] are generally slower than those on [int]. + Use [nativeint] only when the application requires the extra bit of precision over the [int] type. + + @since NEXT_RELEASE *) + +include module type of struct include Nativeint end + +val ( + ) : t -> t -> t +(** Addition. *) + +val ( - ) : t -> t -> t +(** Subtraction. *) + +val ( ~- ) : t -> t +(** Unary negation. *) + +val ( * ) : t -> t -> t +(** Multiplication. *) + +val ( / ) : t -> t -> t +(** Integer division. Raise [Division_by_zero] if the second + argument is zero. This division rounds the real quotient of + its arguments towards zero, as specified for {!Pervasives.(/)}. *) + +val ( mod ) : t -> t -> t +(** [x mod y ] is the integer remainder. + 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 ( land ) : t -> t -> t +(** Bitwise logical and. *) + +val ( lor ) : t -> t -> t +(** Bitwise logical or. *) + +val ( lxor ) : t -> t -> t +(** Bitwise logical exclusive or. *) + +val lnot : t -> t +(** Bitwise logical negation. *) + +val ( lsl ) : t -> int -> t +(** [ x lsl y] shifts [x] to the left by [y] bits. + The result is unspecified if [y < 0] or [y >= bitsize], where [bitsize] is [32] on a 32-bit platform + and [64] on a 64-bit platform. *) + +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 >= bitsize]. *) + +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 >= bitsize]. *) + +module Infix : sig + val (+) : t -> t -> t + val (-) : t -> t -> t + val (~-) : t -> t + val ( * ) : t -> t -> t + val (/) : t -> t -> t + val (mod) : t -> t -> t + val (land) : t -> t -> t + val (lor) : t -> t -> t + val (lxor) : t -> t -> t + val lnot : t -> t + val (lsl) : t -> int -> t + val (lsr) : t -> int -> t + val (asr) : t -> int -> t + 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 + +val equal : t -> t -> bool +(** The equal function for native integers. + Like {!Pervasives.(=) x y)}. *) + +val hash : t -> int +(** Like {!Pervasives.abs (to_int x)}. *) + +(** {2 Conversion} *) + +val to_int : t -> int +(** Convert the given native integer (type [nativeint]) to an + integer (type [int]). The high-order bit is lost + during the conversion. *) + +val of_int : int -> t +(** Alias to {!Nativeint.of_int}. + Convert the given integer (type [int]) to a native integer (type [nativeint]). *) + +val to_float : t -> float +(** Convert the given native integer to a floating-point number. *) + +val of_float : float -> t +(** Alias to {!Nativeint.of_float}. + Convert the given floating-point number to a native integer, + discarding the fractional part (truncate towards 0). + The result of the conversion is undefined if, after truncation, the number + is outside the range \[{!CCNativeint.min_int}, {!CCNativeint.max_int}\]. *) + +val to_string : t -> string +(** Return the string representation of its argument, in decimal. *) + +val of_string_exn : string -> t +(** Alias to {!Nativeint.of_string}. + Convert the given string to a native integer. + 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*CCNativeint.max_int+1]]. If the input exceeds {!CCNativeint.max_int} + it is converted to the signed integer + [CCInt64.min_int + input - CCNativeint.max_int - 1]. + + Raise [Failure "Nativeint.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 [nativeint]. *) + +val of_string : string -> t option +(** Safe version of {!of_string_exn}. + Like {!of_string_exn}, but return [None] instead of raising. *) + +val of_string_opt : string -> t option +(** Alias to {!of_string}. *) diff --git a/src/core/containers.ml b/src/core/containers.ml index 7a1a1574..15945033 100644 --- a/src/core/containers.ml +++ b/src/core/containers.ml @@ -27,12 +27,13 @@ module Hashtbl = struct end module Heap = CCHeap module Int = CCInt -module Int32 = CCInt32 +module Int32 = CCInt32 module Int64 = CCInt64 module IO = CCIO module List = CCList module ListLabels = CCListLabels module Map = CCMap +module Nativeint = CCNativeint module Option = CCOpt module Ord = CCOrd module Pair = CCPair