This is an automated email from the ASF dual-hosted git repository. sunlan pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/groovy.git
commit ac852d6a53bcb583849cb8db8a1cbede5b097502 Author: Daniel Sun <[email protected]> AuthorDate: Thu Dec 3 12:05:07 2020 +0800 Minor tweak for `BigDecimal` and `BigInteger` --- src/main/java/groovy/lang/NumberRange.java | 13 +++++---- src/main/java/groovy/lang/ObjectRange.java | 5 ++-- .../groovy/runtime/DefaultGroovyMethods.java | 33 +++++----------------- .../typehandling/DefaultTypeTransformation.java | 14 ++------- .../collection/runtime/QueryableCollection.java | 7 +++-- 5 files changed, 23 insertions(+), 49 deletions(-) diff --git a/src/main/java/groovy/lang/NumberRange.java b/src/main/java/groovy/lang/NumberRange.java index a58dd1b..11f2ab3 100644 --- a/src/main/java/groovy/lang/NumberRange.java +++ b/src/main/java/groovy/lang/NumberRange.java @@ -21,6 +21,7 @@ package groovy.lang; import org.codehaus.groovy.runtime.InvokerHelper; import org.codehaus.groovy.runtime.IteratorClosureAdapter; import org.codehaus.groovy.runtime.RangeInfo; +import org.codehaus.groovy.runtime.typehandling.NumberMath; import java.io.Serializable; import java.math.BigDecimal; @@ -418,16 +419,16 @@ public class NumberRange extends AbstractList<Comparable> implements Range<Compa final BigInteger fromNum = new BigInteger(from.toString()); final BigInteger toTemp = new BigInteger(to.toString()); final BigInteger toNum = inclusive ? toTemp : toTemp.subtract(BigInteger.ONE); - final BigInteger sizeNum = new BigDecimal(toNum.subtract(fromNum)).divide(new BigDecimal(stepSize.longValue()), RoundingMode.DOWN).toBigInteger().add(BigInteger.ONE); + final BigInteger sizeNum = new BigDecimal(toNum.subtract(fromNum)).divide(BigDecimal.valueOf(stepSize.longValue()), RoundingMode.DOWN).toBigInteger().add(BigInteger.ONE); tempsize = sizeNum.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) < 0 ? sizeNum.intValue() : Integer.MAX_VALUE; shortcut = true; } else if (((from instanceof BigDecimal || from instanceof BigInteger) && to instanceof Number) || ((to instanceof BigDecimal || to instanceof BigInteger) && from instanceof Number)) { // let's fast calculate the size - final BigDecimal fromNum = new BigDecimal(from.toString()); - final BigDecimal toTemp = new BigDecimal(to.toString()); - final BigDecimal toNum = inclusive ? toTemp : toTemp.subtract(new BigDecimal("1.0")); - final BigInteger sizeNum = toNum.subtract(fromNum).divide(new BigDecimal(stepSize.longValue()), RoundingMode.DOWN).toBigInteger().add(BigInteger.ONE); + final BigDecimal fromNum = NumberMath.toBigDecimal((Number) from); + final BigDecimal toTemp = NumberMath.toBigDecimal((Number) to); + final BigDecimal toNum = inclusive ? toTemp : toTemp.subtract(BigDecimal.ONE); + final BigInteger sizeNum = toNum.subtract(fromNum).divide(BigDecimal.valueOf(stepSize.longValue()), RoundingMode.DOWN).toBigInteger().add(BigInteger.ONE); tempsize = sizeNum.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) < 0 ? sizeNum.intValue() : Integer.MAX_VALUE; shortcut = true; } @@ -452,7 +453,7 @@ public class NumberRange extends AbstractList<Comparable> implements Range<Compa } private boolean isIntegral(Number stepSize) { - BigDecimal tempStepSize = new BigDecimal(stepSize.toString()); + BigDecimal tempStepSize = NumberMath.toBigDecimal(stepSize); return tempStepSize.equals(new BigDecimal(tempStepSize.toBigInteger())); } diff --git a/src/main/java/groovy/lang/ObjectRange.java b/src/main/java/groovy/lang/ObjectRange.java index de42c17..c430aa4 100644 --- a/src/main/java/groovy/lang/ObjectRange.java +++ b/src/main/java/groovy/lang/ObjectRange.java @@ -23,6 +23,7 @@ import org.codehaus.groovy.runtime.InvokerHelper; import org.codehaus.groovy.runtime.IteratorClosureAdapter; import org.codehaus.groovy.runtime.ScriptBytecodeAdapter; import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; +import org.codehaus.groovy.runtime.typehandling.NumberMath; import java.math.BigDecimal; import java.math.BigInteger; @@ -301,8 +302,8 @@ public class ObjectRange extends AbstractList<Comparable> implements Range<Compa } else if (((from instanceof BigDecimal || from instanceof BigInteger) && to instanceof Number) || ((to instanceof BigDecimal || to instanceof BigInteger) && from instanceof Number)) { // let's fast calculate the size - final BigDecimal fromNum = new BigDecimal(from.toString()); - final BigDecimal toNum = new BigDecimal(to.toString()); + final BigDecimal fromNum = NumberMath.toBigDecimal((Number) from); + final BigDecimal toNum = NumberMath.toBigDecimal((Number) to); final BigInteger sizeNum = toNum.subtract(fromNum).add(BigDecimal.ONE).toBigInteger(); tempsize = sizeNum.intValue(); if (!BigInteger.valueOf(tempsize).equals(sizeNum)) { diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java index 79ac33b..e6be4f3 100644 --- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java +++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java @@ -15766,7 +15766,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { throw new GroovyRuntimeException("The argument (" + to + ") to upto() cannot be less than the value (" + self + ") it's called on."); } else { - BigDecimal to1 = new BigDecimal(to.toString()); + BigDecimal to1 = NumberMath.toBigDecimal(to); if (self.compareTo(to1) <= 0) { for (BigDecimal i = self; i.compareTo(to1) <= 0; i = i.add(one)) { closure.call(i); @@ -15998,7 +15998,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { } else throw new GroovyRuntimeException("The argument (" + to + ") to downto() cannot be greater than the value (" + self + ") it's called on."); } else { - BigDecimal to1 = new BigDecimal(to.toString()); + BigDecimal to1 = NumberMath.toBigDecimal(to); if (self.compareTo(to1) >= 0) { for (BigDecimal i = self; i.compareTo(to1) >= 0; i = i.subtract(one)) { closure.call(i); @@ -16027,9 +16027,9 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { public static void step(Number self, Number to, Number stepNumber, Closure closure) { if (self instanceof BigDecimal || to instanceof BigDecimal || stepNumber instanceof BigDecimal) { final BigDecimal zero = BigDecimal.valueOf(0, 1); // Same as "0.0". - BigDecimal self1 = (self instanceof BigDecimal) ? (BigDecimal) self : new BigDecimal(self.toString()); - BigDecimal to1 = (to instanceof BigDecimal) ? (BigDecimal) to : new BigDecimal(to.toString()); - BigDecimal stepNumber1 = (stepNumber instanceof BigDecimal) ? (BigDecimal) stepNumber : new BigDecimal(stepNumber.toString()); + BigDecimal self1 = NumberMath.toBigDecimal(self); + BigDecimal to1 = NumberMath.toBigDecimal(to); + BigDecimal stepNumber1 = NumberMath.toBigDecimal(stepNumber); if (stepNumber1.compareTo(zero) > 0 && to1.compareTo(self1) > 0) { for (BigDecimal i = self1; i.compareTo(to1) < 0; i = i.add(stepNumber1)) { closure.call(i); @@ -16463,16 +16463,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { * @since 1.0 */ public static BigDecimal toBigDecimal(Number self) { - // Quick method for scalars. - if ((self instanceof Long) - || (self instanceof Integer) - || (self instanceof Short) - || (self instanceof Byte)) - { - return BigDecimal.valueOf(self.longValue()); - } - - return new BigDecimal(self.toString()); + return NumberMath.toBigDecimal(self); } /** @@ -16512,17 +16503,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { * @since 1.0 */ public static BigInteger toBigInteger(Number self) { - if (self instanceof BigInteger) { - return (BigInteger) self; - } else if (self instanceof BigDecimal) { - return ((BigDecimal) self).toBigInteger(); - } else if (self instanceof Double) { - return new BigDecimal((Double)self).toBigInteger(); - } else if (self instanceof Float) { - return new BigDecimal((Float)self).toBigInteger(); - } else { - return new BigInteger(Long.toString(self.longValue())); - } + return NumberMath.toBigInteger(self); } // Boolean based methods diff --git a/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java b/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java index d2e72c2..ec42a9d 100644 --- a/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java +++ b/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java @@ -309,20 +309,10 @@ public class DefaultTypeTransformation { return answer; } if (type == BigDecimal.class) { - if (n instanceof Float || n instanceof Double) { - return new BigDecimal(n.doubleValue()); - } - return new BigDecimal(n.toString()); + return NumberMath.toBigDecimal(n); } if (type == BigInteger.class) { - if (object instanceof Float || object instanceof Double) { - BigDecimal bd = new BigDecimal(n.doubleValue()); - return bd.toBigInteger(); - } - if (object instanceof BigDecimal) { - return ((BigDecimal) object).toBigInteger(); - } - return new BigInteger(n.toString()); + return NumberMath.toBigInteger(n); } } diff --git a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollection.java b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollection.java index 18fc04d..83f5b4d 100644 --- a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollection.java +++ b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollection.java @@ -21,6 +21,7 @@ package org.apache.groovy.ginq.provider.collection.runtime; import groovy.lang.Tuple2; import groovy.transform.Internal; import org.codehaus.groovy.runtime.DefaultGroovyMethods; +import org.codehaus.groovy.runtime.typehandling.NumberMath; import java.io.Serializable; import java.math.BigDecimal; @@ -238,7 +239,7 @@ class QueryableCollection<T> implements Queryable<T>, Serializable { Number n = mapper.apply(e); if (null == n) return BigDecimal.ZERO; - return n instanceof BigDecimal ? (BigDecimal) n : new BigDecimal(n.toString()); + return NumberMath.toBigDecimal(n); }).reduce(BigDecimal.ZERO, BigDecimal::add)); } @@ -247,7 +248,7 @@ class QueryableCollection<T> implements Queryable<T>, Serializable { Object[] result = agg(q -> this.stream() .map(mapper::apply) .filter(Objects::nonNull) - .map(n -> n instanceof BigDecimal ? (BigDecimal) n : new BigDecimal(n.toString())) + .map(n -> NumberMath.toBigDecimal(n)) .reduce(new Object[] {0L, BigDecimal.ZERO}, (r, e) -> { r[0] = (Long) r[0] + 1; r[1] = ((BigDecimal) r[1]).add(e); @@ -255,7 +256,7 @@ class QueryableCollection<T> implements Queryable<T>, Serializable { }, (o1, o2) -> o1) ); - return ((BigDecimal) result[1]).divide(new BigDecimal((Long) result[0]), 16, RoundingMode.HALF_UP); + return ((BigDecimal) result[1]).divide(BigDecimal.valueOf((Long) result[0]), 16, RoundingMode.HALF_UP); } @Override
