/**************************************************************************************
* Copyright (C) 2008 EsperTech, Inc. All rights reserved. *
* http://esper.codehaus.org *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package com.espertech.esper.util;
import java.math.BigInteger;
import java.math.BigDecimal;
/**
* Factory for conversion/coercion and widening implementations for numbers.
*/
public class SimpleNumberCoercerFactory
{
private static SimpleNumberCoercerNull nullCoerce = new SimpleNumberCoercerNull();
private static SimpleNumberCoercerDouble doubleCoerce = new SimpleNumberCoercerDouble();
private static SimpleNumberCoercerLong longCoerce = new SimpleNumberCoercerLong();
private static SimpleNumberCoercerFloat floatCoerce = new SimpleNumberCoercerFloat();
private static SimpleNumberCoercerInt intCoerce = new SimpleNumberCoercerInt();
private static SimpleNumberCoercerShort shortCoerce = new SimpleNumberCoercerShort();
private static SimpleNumberCoercerByte byteCoerce = new SimpleNumberCoercerByte();
private static SimpleNumberCoercerBigInt bigIntCoerce = new SimpleNumberCoercerBigInt();
private static SimpleNumberCoercerBigIntNull bigIntCoerceNull = new SimpleNumberCoercerBigIntNull();
private static SimpleNumberCoercerBigDecLong bigDecCoerceLong = new SimpleNumberCoercerBigDecLong();
private static SimpleNumberCoercerBigDecDouble bigDecCoerceDouble = new SimpleNumberCoercerBigDecDouble();
private static SimpleNumberCoercerBigDecNull bigDecCoerceNull = new SimpleNumberCoercerBigDecNull();
/**
* Returns a coercer/widener to BigDecimal for a given type.
* @param fromType to widen
* @return widener
*/
public static SimpleNumberBigDecimalCoercer getCoercerBigDecimal(Class fromType)
{
if (fromType == BigDecimal.class)
{
return bigDecCoerceNull;
}
if (JavaClassHelper.isFloatingPointClass(fromType))
{
return bigDecCoerceDouble;
}
return bigDecCoerceLong;
}
/**
* Returns a coercer/widener to BigInteger for a given type.
* @param fromType to widen
* @return widener
*/
public static SimpleNumberBigIntegerCoercer getCoercerBigInteger(Class fromType)
{
if (fromType == BigInteger.class)
{
return bigIntCoerceNull;
}
return bigIntCoerce;
}
/**
* Returns a coercer/widener/narrower to a result number type from a given type.
* @param fromType to widen/narrow, can be null to indicate that no shortcut-coercer is used
* @param resultBoxedType type to widen/narrow to
* @return widener/narrower
*/
public static SimpleNumberCoercer getCoercer(Class fromType, Class resultBoxedType)
{
if (fromType == resultBoxedType)
{
return nullCoerce;
}
if (resultBoxedType == Double.class)
{
return doubleCoerce;
}
if (resultBoxedType == Long.class)
{
return longCoerce;
}
if (resultBoxedType == Float.class)
{
return floatCoerce;
}
if (resultBoxedType == Integer.class)
{
return intCoerce;
}
if (resultBoxedType == Short.class)
{
return shortCoerce;
}
if (resultBoxedType == Byte.class)
{
return byteCoerce;
}
if (resultBoxedType == BigInteger.class)
{
return bigIntCoerce;
}
if (resultBoxedType == BigDecimal.class)
{
if (JavaClassHelper.isFloatingPointClass(fromType))
{
return bigDecCoerceDouble;
}
return bigDecCoerceLong;
}
throw new IllegalArgumentException("Cannot coerce to number subtype " + resultBoxedType.getName());
}
private static class SimpleNumberCoercerNull implements SimpleNumberCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return numToCoerce;
}
}
private static class SimpleNumberCoercerDouble implements SimpleNumberCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return numToCoerce.doubleValue();
}
}
private static class SimpleNumberCoercerLong implements SimpleNumberCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return numToCoerce.longValue();
}
}
private static class SimpleNumberCoercerInt implements SimpleNumberCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return numToCoerce.intValue();
}
}
private static class SimpleNumberCoercerFloat implements SimpleNumberCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return numToCoerce.floatValue();
}
}
private static class SimpleNumberCoercerShort implements SimpleNumberCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return numToCoerce.shortValue();
}
}
private static class SimpleNumberCoercerByte implements SimpleNumberCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return numToCoerce.byteValue();
}
}
private static class SimpleNumberCoercerBigInt implements SimpleNumberCoercer, SimpleNumberBigIntegerCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return BigInteger.valueOf(numToCoerce.longValue());
}
public BigInteger coerceBoxedBigInt(Number numToCoerce)
{
return BigInteger.valueOf(numToCoerce.longValue());
}
}
private static class SimpleNumberCoercerBigDecLong implements SimpleNumberCoercer, SimpleNumberBigDecimalCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return new BigDecimal(numToCoerce.longValue());
}
public BigDecimal coerceBoxedBigDec(Number numToCoerce)
{
return new BigDecimal(numToCoerce.longValue());
}
}
private static class SimpleNumberCoercerBigDecDouble implements SimpleNumberCoercer, SimpleNumberBigDecimalCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return new BigDecimal(numToCoerce.doubleValue());
}
public BigDecimal coerceBoxedBigDec(Number numToCoerce)
{
return new BigDecimal(numToCoerce.doubleValue());
}
}
private static class SimpleNumberCoercerBigIntNull implements SimpleNumberCoercer, SimpleNumberBigIntegerCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return numToCoerce;
}
public BigInteger coerceBoxedBigInt(Number numToCoerce)
{
return (BigInteger) numToCoerce;
}
}
private static class SimpleNumberCoercerBigDecNull implements SimpleNumberCoercer, SimpleNumberBigDecimalCoercer
{
public Number coerceBoxed(Number numToCoerce)
{
return numToCoerce;
}
public BigDecimal coerceBoxedBigDec(Number numToCoerce)
{
return (BigDecimal) numToCoerce;
}
}
}