1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
(*
Title: Standard Basis Library: Int32 Structure
Author: Vesa Karvonen
Copyright David Matthews 1999, 2016
Vesa Karvonen 2007
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License version 2.1 as published by the Free Software Foundation.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*)
(*
This is a hacked version of Int32 - a 32bit Int implementation for
PolyML 5. It's neither well tested nor efficiently implemented.
*)
structure Int32 :> INTEGER =
struct
open LargeInt (* We need LargeInt on 32-bits. *)
val precision:Int.int = 32
val minInt = ~(IntInf.<< (1, Word.fromInt (Int.- (precision, 1))))
val maxInt = ~1-minInt
fun check i =
if i < minInt orelse maxInt < i
then raise Overflow
else i
val precision = SOME precision
val minInt = SOME minInt
val maxInt = SOME maxInt
val fromLarge = check o fromLarge
val fromInt = check o fromInt
val ~ = check o ~
val op * = check o op *
val op + = check o op +
val op - = check o op -
val op div = check o op div
val op mod = check o op mod
val quot = check o quot
val rem = check o rem
val abs = check o abs
fun scan' r g s =
case scan r g s
of NONE => NONE
| SOME (i, s) => SOME (check i, s)
val scan = scan'
val fromString = Option.map check o fromString
end;
local
fun convInt s = let
val radix =
if String.size s >= 3 andalso String.substring(s, 0, 2) = "0x"
orelse String.size s >= 4 andalso String.substring(s, 0, 3) = "~0x"
then StringCvt.HEX else StringCvt.DEC
in
case StringCvt.scanString (Int32.scan radix) s of
NONE => raise RunCall.Conversion "Invalid integer constant"
| SOME res => res
end
fun pretty _ _ x = PolyML.PrettyString (Int32.toString x)
in
val () = RunCall.addOverload convInt "convInt"
val () = PolyML.addPrettyPrinter pretty
end;
val () = RunCall.addOverload Int32.~ "~";
val () = RunCall.addOverload Int32.+ "+";
val () = RunCall.addOverload Int32.- "-";
val () = RunCall.addOverload Int32.* "*";
val () = RunCall.addOverload Int32.div "div";
val () = RunCall.addOverload Int32.mod "mod";
val () = RunCall.addOverload Int32.< "<";
val () = RunCall.addOverload Int32.> ">";
val () = RunCall.addOverload Int32.<= "<=";
val () = RunCall.addOverload Int32.>= ">=";
val () = RunCall.addOverload Int32.abs "abs";
|