ArrayLength.java

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

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;
import edu.udel.cis.vsl.tass.symbolic.expression.SymbolicExpression;

public class ArrayLength extends SymbolicExpression implements
		NumericPrimitive, TreeExpressionIF {

	private TreeExpressionIF array;

	ArrayLength(TreeExpressionIF array, SymbolicTypeIF integerType) {
		super(integerType);
		this.array = array;
	}

	public TreeExpressionIF array() {
		return array;
	}

	@Override
	public String atomString() {
		return "length(" + array + ")";
	}

	@Override
	public SymbolicKind kind() {
		return SymbolicKind.LENGTH;
	}

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

	@Override
	public int numArguments() {
		return 1;
	}

	@Override
	public NumericPrimitiveKind numericPrimitiveKind() {
		return NumericPrimitiveKind.LENGTH;
	}

	@Override
	protected int intrinsicHashCode() {
		return ArrayRead.class.hashCode() + array.hashCode();
	}

	@Override
	protected boolean intrinsicEquals(SymbolicExpression that) {
		if (that instanceof ArrayLength) {
			return array.equals(((ArrayLength) that).array);
		}
		return false;
	}

}