public static Primitive shrinkWrap(Object number) { if (!(number instanceof Number)) throw new InterpreterError("Can only shrink wrap Number types"); Number value = (Number) number; if ( Types.isFloatingpoint(number) ) { if ( !Double.isInfinite(value.doubleValue()) ) return new Primitive(value.doubleValue()); return new Primitive((BigDecimal) number); } BigInteger bi = number instanceof BigInteger ? (BigInteger) number : BigInteger.valueOf(value.longValue()); if ( bi.compareTo(INTEGER_MIN) >= 0 && bi.compareTo(INTEGER_MAX) <= 0 ) return new Primitive(bi.intValue()); if ( bi.compareTo(LONG_MIN) >= 0 && bi.compareTo(LONG_MAX) <= 0 ) return new Primitive(bi.longValue()); return new Primitive(bi); }
if ( number instanceof BigInteger ) return new BigDecimal((BigInteger) number).setScale(1); if ( Types.isFloatingpoint(number) ) return BigDecimal.valueOf(number.doubleValue()); return new BigDecimal(number.longValue()).setScale(1); else if (number instanceof BigDecimal) bi = ((BigDecimal) number).toBigInteger(); else if (Types.isFloatingpoint(number)) bi = BigDecimal.valueOf(number.doubleValue()).toBigInteger(); else
} else if ( rhs instanceof BigDecimal ) { lhs = Primitive.castNumber(BigDecimal.class, lnum); } else if ( Types.isFloatingpoint(lhs) || Types.isFloatingpoint(rhs)) { if ( !(lhs instanceof Double) ) lhs = Double.valueOf(lnum.doubleValue());
if ( Types.isFloatingpoint(result) && lhs.getClass() == BigDecimal.class ) return (Primitive) Primitive.wrap(result, result.getClass()); else
/** Primitives compare equal with other Primitives containing an equal wrapped value. */ public boolean equals( Object obj ) { if ( !( obj instanceof Primitive ) ) if ( wrapperMap.containsKey(obj.getClass()) ) obj = new Primitive(obj); else return false; Primitive pobj = (Primitive) obj; if ( pobj.isNumber() && this.isNumber() ) { if ( this.getType() == BigDecimal.class ) return this.value.equals(castNumber(BigDecimal.class, pobj.numberValue())); if ( pobj.getType() == BigDecimal.class ) return pobj.value.equals(castNumber(BigDecimal.class, this.numberValue())); if (Types.isFloatingpoint(this.value) || Types.isFloatingpoint(pobj.value)) return this.numberValue().doubleValue() == pobj.numberValue().doubleValue(); if ( this.getType() == BigInteger.class ) return this.value.equals(castNumber(BigInteger.class, pobj.numberValue())); if ( pobj.getType() == BigInteger.class ) return pobj.value.equals(castNumber(BigInteger.class, this.numberValue())); return this.numberValue().longValue() == pobj.numberValue().longValue(); } return this.value.equals( pobj.value ); }
@SuppressWarnings("unchecked") static <T> Object binaryOperationImpl( T lhs, T rhs, int kind ) throws UtilEvalError { if (lhs instanceof Boolean) return booleanBinaryOperation( (Boolean) lhs, (Boolean) rhs, kind ); if (COMPARABLE_OPS.contains(kind)) return comparableBinaryBooleanOperations((Comparable<T>) lhs, rhs, kind); if (lhs instanceof BigInteger) return bigIntegerBinaryOperation( (BigInteger) lhs, (BigInteger) rhs, kind ); if (lhs instanceof BigDecimal) return bigDecimalBinaryOperation( (BigDecimal) lhs, (BigDecimal) rhs, kind ); if (Types.isFloatingpoint(lhs)) return doubleBinaryOperation( (Double) lhs, (Double) rhs, kind ); if (lhs instanceof Number) return longBinaryOperation( (Long) lhs, (Long) rhs, kind ); throw new UtilEvalError("Invalid types in binary operator" ); }