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;
  }
}
