package data;

/**
  * Values that operate on {@link Number numbers}.
  *
  * <p>All the operations are implemented as you would expect, the implementation is given in concrete
  * subclasses.</p>
  *
  * @author Steffen Zschaler
  * @version 2.0 19/08/1999
  * @since v2.0
  */
public abstract class NumberValue implements Value {

  /**
    * The actual value.
    *
    * @serial
    */
  private Number m_nbValue;

  /**
    * Create a new NumberValue.
    *
    * @param nbValue the actual initial value.
    */
  public NumberValue (Number nbValue) {
    super();

    setValue (nbValue);
  }

  /**
    * Set the actual value of the object.
    *
    * @override Sometimes Override if you want to impose restrictions on the class of the actual value.
    *
    * @param nbValue the new actual value.
    */
  public void setValue (Number nbValue) {
    m_nbValue = nbValue;
  }

  /**
    * Get the actual value of the object.
    *
    * @override Never
    */
  public Number getValue() {
    return m_nbValue;
  }

  /**
    * @override Sometimes The default implementation returns
    * <pre>
    * (getValue().longValue() == 0)
    * </pre>
    */
  public boolean isAddZero() {
    return (getValue().longValue() == 0);
  }

  /**
    * @override Sometimes The default implementation returns
    * <pre>
    * isAddZero()
    * </pre>
    */
  public boolean isMulZero() {
    return isAddZero();
  }

  /**
    * @override Sometimes The default implementation returns
    * <pre>
    * (getValue().longValue() == 1)
    * </pre>
    */
  public boolean isMulOne() {
    return (getValue().longValue() == 1);
  }

  /**
    * @override Always
    */
  public abstract Object clone();

  /**
    * Return a {@link String} representation of the object.
    *
    * @override Sometimes The default implementation returns
    * <pre>
    * getValue().toString()
    * </pre>
    */
  public String toString() {
    return getValue().toString();
  }
}