VectorElementReferenceValue.java

package edu.udel.cis.vsl.tass.dynamic.impl.value;

import edu.udel.cis.vsl.tass.dynamic.IF.type.ReferenceValueTypeIF;
import edu.udel.cis.vsl.tass.dynamic.IF.value.ReferenceValueIF;
import edu.udel.cis.vsl.tass.dynamic.IF.value.VariableReferenceValueIF;
import edu.udel.cis.vsl.tass.dynamic.IF.value.VectorElementReferenceValueIF;
import edu.udel.cis.vsl.tass.dynamic.impl.type.ValueTypeFactory;
import edu.udel.cis.vsl.tass.morph.Morphic;

public class VectorElementReferenceValue extends ReferenceValue implements
		VectorElementReferenceValueIF {

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

	private int index;

	private VariableReferenceValueIF variableReference;

	public VectorElementReferenceValue(ReferenceValueIF parent, int index,
			ReferenceValueTypeIF valueType) {
		super(parent, valueType);
		this.index = index;
		variableReference = parent.variableReference();
	}

	@Override
	public int index() {
		return index;
	}

	@Override
	public String toString() {
		return parent() + "." + index;
	}

	@Override
	public VariableReferenceValueIF variableReference() {
		return variableReference;
	}

	@Override
	protected boolean computeEquals(Morphic component) {
		if (!super.computeEquals(component))
			return false;
		if (component instanceof VectorElementReferenceValue) {
			VectorElementReferenceValue that = (VectorElementReferenceValue) component;

			return index == that.index;
		}
		return false;
	}

	@Override
	public boolean isNull() {
		return false;
	}

	@Override
	protected int computeHashCode() {
		return super.computeHashCode() + classHashCode + index;
	}

	@Override
	protected void commitChildren() {
		super.commitChildren();
		variableReference.commit();
	}

	@Override
	protected void canonicalizeChildren(ValueFactory valueFactory,
			ValueTypeFactory typeFactory) {
		super.canonicalizeChildren(valueFactory, typeFactory);
		if (!variableReference.isCanonic())
			variableReference = parent().variableReference();
	}
}