NumericConcreteExpression.java

package edu.udel.cis.vsl.tass.symbolic.concrete;

import edu.udel.cis.vsl.tass.number.IF.IntegerNumberIF;
import edu.udel.cis.vsl.tass.number.IF.NumberIF;
import edu.udel.cis.vsl.tass.number.IF.RationalNumberIF;
import edu.udel.cis.vsl.tass.symbolic.IF.tree.NumericConcreteExpressionIF;
import edu.udel.cis.vsl.tass.symbolic.IF.tree.TreeExpressionIF;
import edu.udel.cis.vsl.tass.symbolic.IF.type.SymbolicTypeIF;
import edu.udel.cis.vsl.tass.symbolic.expression.SymbolicExpression;

public class NumericConcreteExpression extends SymbolicExpression implements
		NumericConcreteExpressionIF {

	private NumberIF value;

	private static int classHashCode = NumericConcreteExpression.class
			.hashCode();

	NumericConcreteExpression(SymbolicTypeIF numericType, NumberIF value) {
		super(numericType);
		assert value != null;
		this.value = value;
	}

	public NumberIF value() {
		return value;
	}

	protected int intrinsicHashCode() {
		return classHashCode + value.hashCode();
	}

	protected boolean intrinsicEquals(SymbolicExpression that) {
		return that instanceof NumericConcreteExpression
				&& ((NumericConcreteExpression) that).value.equals(value);
	}

	public int signum() {
		return value.signum();
	}

	public String toString() {
		return value.toString();
	}

	public String atomString() {
		return value.atomString();
	}

	public boolean isZero() {
		return value.signum() == 0;
	}

	public boolean isOne() {
		return value.isOne();
	}

	public boolean isInteger() {
		return value instanceof IntegerNumberIF;
	}

	public boolean isReal() {
		return value instanceof RationalNumberIF;
	}

	public TreeExpressionIF argument(int index) {
		throw new IllegalArgumentException("0 arguments");
	}

	public SymbolicKind kind() {
		return SymbolicKind.CONCRETE_NUMBER;
	}

	public int numArguments() {
		return 0;
	}
}