forked from MLstate/opalang
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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
Showing
3 changed files
with
110 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |