blob: a3efe9ac23723c425414b4b6e73451838fc06182 [file] [log] [blame]
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;
}
}