IntegerModulusExpression.java

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

import edu.udel.cis.vsl.tass.symbolic.NumericPrimitive;
import edu.udel.cis.vsl.tass.symbolic.IF.tree.TreeExpressionIF;
import edu.udel.cis.vsl.tass.symbolic.IF.type.SymbolicTypeIF.SymbolicTypeKind;
import edu.udel.cis.vsl.tass.symbolic.expression.SymbolicExpression;

public class IntegerModulusExpression extends SymbolicExpression implements
		NumericPrimitive {

	public final static String operator = "%";

	private TreeExpressionIF numerator;

	private TreeExpressionIF denominator;

	IntegerModulusExpression(TreeExpressionIF numerator,
			TreeExpressionIF denominator) {
		super(numerator.type());
		assert denominator != null;
		assert numerator.type().kind() == SymbolicTypeKind.INTEGER;
		assert numerator.type().equals(denominator.type());
		this.numerator = numerator;
		this.denominator = denominator;
	}

	public TreeExpressionIF numerator() {
		return numerator;
	}

	public TreeExpressionIF denominator() {
		return denominator;
	}

	protected int intrinsicHashCode() {
		return IntegerModulusExpression.class.hashCode() + numerator.hashCode()
				+ denominator.hashCode();
	}

	protected boolean intrinsicEquals(SymbolicExpression expression) {
		if (expression instanceof IntegerModulusExpression) {
			IntegerModulusExpression that = (IntegerModulusExpression) expression;

			return numerator.equals(that.numerator)
					&& denominator.equals(that.denominator);
		}
		return false;
	}

	public String toString() {
		return numerator.atomString() + operator + denominator.atomString();
	}

	public String atomString() {
		return "(" + toString() + ")";
	}

	public NumericPrimitiveKind numericPrimitiveKind() {
		return NumericPrimitiveKind.INT_MOD;
	}

	public TreeExpressionIF argument(int index) {
		switch (index) {
		case 0:
			return numerator;
		case 1:
			return denominator;
		default:
			throw new RuntimeException("numArguments=" + 2 + ", index=" + index);
		}
	}

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

	public int numArguments() {
		return 2;
	}

}