From b60fe9936521dcf5b01619cbd90bfa72ca6f0d7f Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Wed, 30 Jan 2019 21:16:13 -0600 Subject: [PATCH] perf: annotate types in monomorphic/float/int to help specialize builtins close #245 --- src/core/CCFloat.ml | 24 ++++++++++++------------ src/core/CCInt.ml | 30 ++++++++++++++++++++++++++++-- src/monomorphic/CCMonomorphic.ml | 24 +++++++++++++++++------- 3 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/core/CCFloat.ml b/src/core/CCFloat.ml index 6edd5feb..8e189506 100644 --- a/src/core/CCFloat.ml +++ b/src/core/CCFloat.ml @@ -10,17 +10,17 @@ type fpclass = Pervasives.fpclass = | FP_nan module Infix = struct - let (=) = Pervasives.(=) - let (<>) = Pervasives.(<>) - let (<) = Pervasives.(<) - let (>) = Pervasives.(>) - let (<=) = Pervasives.(<=) - let (>=) = Pervasives.(>=) - let (~-) = Pervasives.(~-.) - let (+) = Pervasives.(+.) - let (-) = Pervasives.(-.) - let ( * ) = Pervasives.( *. ) - let (/) = Pervasives.(/.) + let (=) : t -> t -> bool = Pervasives.(=) + let (<>) : t -> t -> bool = Pervasives.(<>) + let (<) : t -> t -> bool = Pervasives.(<) + let (>) : t -> t -> bool = Pervasives.(>) + let (<=) : t -> t -> bool = Pervasives.(<=) + let (>=) : t -> t -> bool = Pervasives.(>=) + let (~-) : t -> t = Pervasives.(~-.) + let (+) : t -> t -> t = Pervasives.(+.) + let (-) : t -> t -> t = Pervasives.(-.) + let ( * ) : t -> t -> t = Pervasives.( *. ) + let (/) : t -> t -> t = Pervasives.(/.) end include Infix @@ -36,7 +36,7 @@ let max_finite_value = Pervasives.max_float let epsilon = Pervasives.epsilon_float -let is_nan x = Pervasives.classify_float x = Pervasives.FP_nan +let is_nan x = Pervasives.(classify_float x = Pervasives.FP_nan) let add = (+.) let sub = (-.) diff --git a/src/core/CCInt.ml b/src/core/CCInt.ml index c7b81a94..9d330f4d 100644 --- a/src/core/CCInt.ml +++ b/src/core/CCInt.ml @@ -2,6 +2,7 @@ (* This file is free software, part of containers. See file "license" for more details. *) type t = int +type 'a sequence = ('a -> unit) -> unit let equal (a:int) b = Pervasives.(=) a b @@ -70,7 +71,30 @@ let pow a b = pow 0 1 = 0 *) -module Infix = struct +module Infix : sig + val (=) : t -> t -> bool + val (<>) : t -> t -> bool + val (<) : t -> t -> bool + val (>) : t -> t -> bool + val (<=) : t -> t -> bool + val (>=) : t -> t -> bool + val (--) : t -> t -> t sequence + val (--^) : t -> t -> t sequence + val (+) : t -> t -> t + val (-) : t -> t -> t + val (~-) : t -> t + val ( * ) : t -> 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 +end = struct include Pervasives let (--) = range let (--^) = range' @@ -78,6 +102,9 @@ module Infix = struct end include Infix +let min : t -> t -> t = Pervasives.min +let max : t -> t -> t = Pervasives.max + let floor_div a n = if a < 0 && n >= 0 then (a + 1) / n - 1 @@ -159,7 +186,6 @@ let rem a n = type 'a printer = Format.formatter -> 'a -> unit type 'a random_gen = Random.State.t -> 'a -type 'a sequence = ('a -> unit) -> unit let random n st = Random.State.int st n let random_small = random 100 diff --git a/src/monomorphic/CCMonomorphic.ml b/src/monomorphic/CCMonomorphic.ml index 28e2ed2f..2f402823 100644 --- a/src/monomorphic/CCMonomorphic.ml +++ b/src/monomorphic/CCMonomorphic.ml @@ -1,14 +1,24 @@ (* This file is free software, part of containers. See file "license" for more details. *) -include Pervasives +let (=) : int -> int -> bool = Pervasives.(=) +let (<>) : int -> int -> bool = Pervasives.(<>) +let (<) : int -> int -> bool = Pervasives.(<) +let (>) : int -> int -> bool = Pervasives.(>) +let (<=) : int -> int -> bool = Pervasives.(<=) +let (>=) : int -> int -> bool = Pervasives.(>=) + +let compare : int -> int -> int = Pervasives.compare +let min : int -> int -> int = Pervasives.min +let max : int -> int -> int = Pervasives.max + +let (=.) : float -> float -> bool = Pervasives.(=) +let (<>.) : float -> float -> bool = Pervasives.(<>) +let (<.) : float -> float -> bool = Pervasives.(<) +let (>.) : float -> float -> bool = Pervasives.(>) +let (<=.) : float -> float -> bool = Pervasives.(<=) +let (>=.) : float -> float -> bool = Pervasives.(>=) -let (=.) : float -> float -> bool = (=) -let (<>.) : float -> float -> bool = (<>) -let (<.) : float -> float -> bool = (<) -let (>.) : float -> float -> bool = (>) -let (<=.) : float -> float -> bool = (<=) -let (>=.) : float -> float -> bool = (>=) let (==) = `Consider_using_CCEqual_physical let (!=) = `Consider_using_CCEqual_physical