package org.checkerframework.common.value.util; public abstract class NumberMath<T extends Number> { public static NumberMath<?> getNumberMath(Number number) { if (number instanceof Byte) { return new ByteMath(number.byteValue()); } if (number instanceof Double) { return new DoubleMath(number.doubleValue()); } if (number instanceof Float) { return new FloatMath(number.floatValue()); } if (number instanceof Integer) { return new IntegerMath(number.intValue()); } if (number instanceof Long) { return new LongMath(number.longValue()); } if (number instanceof Short) { return new ShortMath(number.shortValue()); } return null; } public abstract Number plus(Number right); public abstract Number minus(Number right); public abstract Number times(Number right); /** * Returns the result of dividing the {@code this} by {@code right}. If {@code right} is zero * and this is an integer division, {@code null} is returned. */ public abstract Number divide(Number right); /** * Returns the result of {@code this % right}. If {@code right} is zero and this is an integer * remainder, {@code null} is returned. */ public abstract Number remainder(Number right); public abstract Number shiftLeft(Number right); public abstract Number signedShiftRight(Number right); public abstract Number unsignedShiftRight(Number right); public abstract Number bitwiseAnd(Number right); public abstract Number bitwiseOr(Number right); public abstract Number bitwiseXor(Number right); public abstract Number unaryPlus(); public abstract Number unaryMinus(); public abstract Number bitwiseComplement(); public abstract Boolean equalTo(Number right); public abstract Boolean notEqualTo(Number right); public abstract Boolean greaterThan(Number right); public abstract Boolean greaterThanEq(Number right); public abstract Boolean lessThan(Number right); public abstract Boolean lessThanEq(Number right); public static boolean isIntegralZero(Number number) { if (number instanceof Byte) { return number.byteValue() == 0; } else if (number instanceof Integer) { return number.intValue() == 0; } else if (number instanceof Long) { return number.longValue() == 0; } else if (number instanceof Short) { return number.shortValue() == 0; } return false; } }