From 855aefa86ea4929dde5bf7e79541a11a014b3706 Mon Sep 17 00:00:00 2001 From: Alexander Taggart Date: Mon, 25 Apr 2011 17:11:09 -0700 Subject: [PATCH] CLJ-771: Move unchecked casts to clojure.unchecked namespace --- build.xml | 1 + src/clj/clojure/core.clj | 43 --------------------- src/clj/clojure/unchecked.clj | 47 ++++++++++++++++++++++ test/clojure/test_clojure/numbers.clj | 73 ++++++++++++++++++----------------- 4 files changed, 86 insertions(+), 78 deletions(-) create mode 100644 src/clj/clojure/unchecked.clj diff --git a/build.xml b/build.xml index 9b9f6a0..613688d 100644 --- a/build.xml +++ b/build.xml @@ -53,6 +53,7 @@ + diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index f03c638..2aa8288 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -3163,49 +3163,6 @@ :added "1.0"} [x] (clojure.lang.RT/booleanCast x)) -(defn unchecked-byte - "Coerce to byte. Subject to rounding or truncation." - {:inline (fn [x] `(. clojure.lang.RT (uncheckedByteCast ~x))) - :added "1.3"} - [^Number x] (clojure.lang.RT/uncheckedByteCast x)) - -(defn unchecked-short - "Coerce to short. Subject to rounding or truncation." - {:inline (fn [x] `(. clojure.lang.RT (uncheckedShortCast ~x))) - :added "1.3"} - [^Number x] (clojure.lang.RT/uncheckedShortCast x)) - -(defn unchecked-char - "Coerce to char. Subject to rounding or truncation." - {:inline (fn [x] `(. clojure.lang.RT (uncheckedCharCast ~x))) - :added "1.3"} - [x] (. clojure.lang.RT (uncheckedCharCast x))) - -(defn unchecked-int - "Coerce to int. Subject to rounding or truncation." - {:inline (fn [x] `(. clojure.lang.RT (uncheckedIntCast ~x))) - :added "1.3"} - [^Number x] (clojure.lang.RT/uncheckedIntCast x)) - -(defn unchecked-long - "Coerce to long. Subject to rounding or truncation." - {:inline (fn [x] `(. clojure.lang.RT (uncheckedLongCast ~x))) - :added "1.3"} - [^Number x] (clojure.lang.RT/uncheckedLongCast x)) - -(defn unchecked-float - "Coerce to float. Subject to rounding." - {:inline (fn [x] `(. clojure.lang.RT (uncheckedFloatCast ~x))) - :added "1.3"} - [^Number x] (clojure.lang.RT/uncheckedFloatCast x)) - -(defn unchecked-double - "Coerce to double. Subject to rounding." - {:inline (fn [x] `(. clojure.lang.RT (uncheckedDoubleCast ~x))) - :added "1.3"} - [^Number x] (clojure.lang.RT/uncheckedDoubleCast x)) - - (defn number? "Returns true if x is a Number" {:added "1.0" diff --git a/src/clj/clojure/unchecked.clj b/src/clj/clojure/unchecked.clj new file mode 100644 index 0000000..3b95ed9 --- /dev/null +++ b/src/clj/clojure/unchecked.clj @@ -0,0 +1,47 @@ +(ns + ^{:doc "Unchecked versions of clojure/core functions."} + clojure.unchecked + (:import clojure.lang.RT) + (:refer-clojure :exclude [byte short char int long float double])) + +(defn byte + "Coerce to byte. Subject to rounding or truncation." + {:inline (fn [x] `(RT/uncheckedByteCast ~x)) + :added "1.3"} + [x] (RT/uncheckedByteCast x)) + +(defn short + "Coerce to short. Subject to rounding or truncation." + {:inline (fn [x] `(RT/uncheckedShortCast ~x)) + :added "1.3"} + [x] (RT/uncheckedShortCast x)) + +(defn char + "Coerce to char. Subject to rounding or truncation." + {:inline (fn [x] `(RT/uncheckedCharCast ~x)) + :added "1.3"} + [x] (RT/uncheckedCharCast x)) + +(defn int + "Coerce to int. Subject to rounding or truncation." + {:inline (fn [x] `(RT/uncheckedIntCast ~x)) + :added "1.3"} + [x] (RT/uncheckedIntCast x)) + +(defn long + "Coerce to long. Subject to rounding or truncation." + {:inline (fn [x] `(RT/uncheckedLongCast ~x)) + :added "1.3"} + [x] (RT/uncheckedLongCast x)) + +(defn float + "Coerce to float. Subject to rounding." + {:inline (fn [x] `(RT/uncheckedFloatCast ~x)) + :added "1.3"} + [x] (RT/uncheckedFloatCast x)) + +(defn double + "Coerce to double. Subject to rounding." + {:inline (fn [x] `(RT/uncheckedDoubleCast ~x)) + :added "1.3"} + [x] (RT/uncheckedDoubleCast x)) diff --git a/test/clojure/test_clojure/numbers.clj b/test/clojure/test_clojure/numbers.clj index a040cc2..c96a322 100644 --- a/test/clojure/test_clojure/numbers.clj +++ b/test/clojure/test_clojure/numbers.clj @@ -15,7 +15,8 @@ (:use clojure.test [clojure.test.generative :exclude (is)] clojure.template) - (:require [clojure.data.generators :as gen])) + (:require [clojure.data.generators :as gen] + [clojure.unchecked :as uc])) ; TODO: @@ -52,19 +53,19 @@ (Float. Float/MAX_VALUE) (Double. Double/MAX_VALUE)) byte-array - unchecked-byte + uc/byte short-array - unchecked-short + uc/short char-array - unchecked-char + uc/char int-array - unchecked-int + uc/int long-array - unchecked-long + uc/long float-array - unchecked-float + uc/float double-array - unchecked-double)) + uc/double)) (deftest unchecked-cast-num-prim (do-template [prim-array cast] @@ -78,52 +79,54 @@ Float/MAX_VALUE Double/MAX_VALUE) byte-array - unchecked-byte + uc/byte short-array - unchecked-short + uc/short char-array - unchecked-char + uc/char int-array - unchecked-int + uc/int long-array - unchecked-long + uc/long float-array - unchecked-float + uc/float double-array - unchecked-double)) + uc/double)) (deftest unchecked-cast-char ; in keeping with the checked cast functions, char and Character can only be cast to int - (is (unchecked-int (char 0xFFFF))) - (is (let [c (char 0xFFFF)] (unchecked-int c)))) ; force primitive char + (is (uc/int (char 0xFFFF))) + (is (let [c (char 0xFFFF)] (uc/int c)))) ; force primitive char (def expected-casts [ - [:input [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE Long/MAX_VALUE Float/MAX_VALUE Double/MAX_VALUE]] - [char [:error (char 0) (char 1) (char 127) (char 32767) :error :error :error :error]] - [unchecked-char [(char 65535) (char 0) (char 1) (char 127) (char 32767) (char 65535) (char 65535) (char 65535) (char 65535)]] - [byte [-1 0 1 Byte/MAX_VALUE :error :error :error :error :error]] - [unchecked-byte [-1 0 1 Byte/MAX_VALUE -1 -1 -1 -1 -1]] - [short [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE :error :error :error :error]] - [unchecked-short [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE -1 -1 -1 -1]] - [int [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE :error :error :error]] - [unchecked-int [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE -1 Integer/MAX_VALUE Integer/MAX_VALUE]] - [long [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE Long/MAX_VALUE :error :error]] - [unchecked-long [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE Long/MAX_VALUE Long/MAX_VALUE Long/MAX_VALUE]] + [:input [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE Long/MAX_VALUE Float/MAX_VALUE Double/MAX_VALUE]] + [#'char [:error (char 0) (char 1) (char 127) (char 32767) :error :error :error :error]] + [#'uc/char [(char 65535) (char 0) (char 1) (char 127) (char 32767) (char 65535) (char 65535) (char 65535) (char 65535)]] + [#'byte [-1 0 1 Byte/MAX_VALUE :error :error :error :error :error]] + [#'uc/byte [-1 0 1 Byte/MAX_VALUE -1 -1 -1 -1 -1]] + [#'short [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE :error :error :error :error]] + [#'uc/short [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE -1 -1 -1 -1]] + [#'int [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE :error :error :error]] + [#'uc/int [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE -1 Integer/MAX_VALUE Integer/MAX_VALUE]] + [#'long [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE Long/MAX_VALUE :error :error]] + [#'uc/long [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE Long/MAX_VALUE Long/MAX_VALUE Long/MAX_VALUE]] ;; 2.14748365E9 if when float/double conversion is avoided... - [float [-1.0 0.0 1.0 127.0 32767.0 2.147483648E9 9.223372036854776E18 Float/MAX_VALUE :error]] - [unchecked-float [-1.0 0.0 1.0 127.0 32767.0 2.147483648E9 9.223372036854776E18 Float/MAX_VALUE Float/POSITIVE_INFINITY]] - [double [-1.0 0.0 1.0 127.0 32767.0 2.147483647E9 9.223372036854776E18 Float/MAX_VALUE Double/MAX_VALUE]] - [unchecked-double [-1.0 0.0 1.0 127.0 32767.0 2.147483647E9 9.223372036854776E18 Float/MAX_VALUE Double/MAX_VALUE]]]) + [#'float [-1.0 0.0 1.0 127.0 32767.0 2.147483648E9 9.223372036854776E18 Float/MAX_VALUE :error]] + [#'uc/float [-1.0 0.0 1.0 127.0 32767.0 2.147483648E9 9.223372036854776E18 Float/MAX_VALUE Float/POSITIVE_INFINITY]] + [#'double [-1.0 0.0 1.0 127.0 32767.0 2.147483647E9 9.223372036854776E18 Float/MAX_VALUE Double/MAX_VALUE]] + [#'uc/double [-1.0 0.0 1.0 127.0 32767.0 2.147483647E9 9.223372036854776E18 Float/MAX_VALUE Double/MAX_VALUE]]]) (deftest test-expected-casts (let [[[_ inputs] & expectations] expected-casts] - (doseq [[f vals] expectations] - (let [wrapped (fn [x] + (doseq [[fvar vals] expectations] + (let [f (deref fvar) + wrapped (fn [x] (try (f x) (catch IllegalArgumentException e :error)))] - (is (= vals (map wrapped inputs))))))) + (testing (str "Casting with " fvar) + (is (= vals (map wrapped inputs)))))))) ;; *** Functions *** -- 1.8.0