Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

[feature] Int.t: introducing 64-bit integer type.

This type provides 64-bits (not 63, like int); also on 32-bit
architectures. It should be used instead of int for all values
that may exceed 32-bits to ensure that everything works fine
for the 32-bit port of Opa.
  • Loading branch information...
commit 4c151a992ec84644020fac79f05b80f12c801d92 1 parent 44d0185
Adam Koprowski akoprow authored
Showing with 110 additions and 0 deletions.
  1. +1 −0  libbase/_tags
  2. +59 −0 libbase/int.ml
  3. +50 −0 libbase/int.mli
1  libbase/_tags
View
@@ -9,6 +9,7 @@
<sgzip.ml> : use_zip
<xml.ml>: with_mlstate_debug
<time.ml>: with_mlstate_debug
+<int.ml>: with_mlstate_debug
# This warnings are generated by the preprocessor : what a shame !
<indexer.ml>: warn_z
59 libbase/int.ml
View
@@ -0,0 +1,59 @@
+(*
+ Copyright © 2011 MLstate
+
+ This file is part of OPA.
+
+ OPA is free software: you can redistribute it and/or modify it under the
+ terms of the GNU Affero General Public License, version 3, as published by
+ the Free Software Foundation.
+
+ OPA is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
+ more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with OPA. If not, see <http://www.gnu.org/licenses/>.
+*)
+
+#<Ifstatic:OCAML_WORD_SIZE 64>
+
+type t = Nativeint.t
+
+let ( + ) = Nativeint.add
+let ( - ) = Nativeint.sub
+let ( * ) = Nativeint.mul
+let ( / ) = Nativeint.div
+
+exception Overflow
+let of_int = Nativeint.of_int
+let to_int v =
+ let res = Nativeint.to_int v in
+ (* make sure that we don't loose the representation during the conversion *)
+ if v == of_int res then
+ res
+ else
+ raise Overflow
+
+#<Else>
+
+type t = Int64.t
+
+let ( + ) = Int64.add
+let ( - ) = Int64.sub
+let ( * ) = Int64.mul
+let ( / ) = Int64.div
+
+let of_int v =
+ Int64.of_nativeint (Nativeint.of_int v)
+
+exception Overflow
+let to_int v =
+ let res = Nativeint.to_int (Int64.to_nativeint v) in
+ (* make sure that we don't loose the representation during the conversion *)
+ if v == of_int res then
+ res
+ else
+ raise Overflow
+
+#<End>
50 libbase/int.mli
View
@@ -0,0 +1,50 @@
+(*
+ Copyright © 2011 MLstate
+
+ This file is part of OPA.
+
+ OPA is free software: you can redistribute it and/or modify it under the
+ terms of the GNU Affero General Public License, version 3, as published by
+ the Free Software Foundation.
+
+ OPA is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
+ more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with OPA. If not, see <http://www.gnu.org/licenses/>.
+*)
+
+(**
+ * This module provides 64-bit signed integers. It should be used in place
+ * of [int] when this extra bit is required (int's are 63-bit) *and* to make
+ * sure everything works on 32-bit platforms (where this type will still provide
+ * 64-bits).
+ * In short this should be used in place of int's when dealing with values
+ * that may exceed 31 bits.
+ * Performance notice: value of type Int.t will occupy more space and
+ * operations on them will generally be slower than over the int type.
+ *)
+
+ (** A 64-bit integer (also on 32-bit platforms). *)
+type t
+
+ (** Addition *)
+val ( + ): t -> t -> t
+
+ (** Subtraction *)
+val ( - ): t -> t -> t
+
+ (** Multiplication *)
+val ( * ): t -> t -> t
+
+ (** Integer division *)
+val ( / ): t -> t -> t
+
+ (** Conversion from native integer *)
+val of_int: int -> t
+
+exception Overflow
+ (** Conversion to native integer; throws Overflow if the value does not fit *)
+val to_int: t -> int
Please sign in to comment.
Something went wrong with that request. Please try again.