ReferenceValue.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.impl.type.ValueTypeFactory;
import edu.udel.cis.vsl.tass.morph.Morphic;

public abstract class ReferenceValue extends Value implements ReferenceValueIF {

	private ReferenceValueIF parent;

	public ReferenceValue(ReferenceValueIF parent,
			ReferenceValueTypeIF valueType) {
		super(valueType);
		this.parent = parent;
	}

	@Override
	public ReferenceValueTypeIF valueType() {
		return (ReferenceValueTypeIF) super.valueType();
	}

	@Override
	protected int computeHashCode() {
		int result = super.computeHashCode();

		if (parent != null)
			result += parent.hashCode();
		return result;
	}

	@Override
	protected boolean computeEquals(Morphic component) {
		if (component instanceof ReferenceValue) {
			ReferenceValue that = (ReferenceValue) component;

			return super.computeEquals(that)
					&& (parent == null ? that.parent == null : parent
							.equals(that.parent));
		}
		return false;
	}

	public ReferenceValueIF parent() {
		return parent;
	}

	protected void setParent(ReferenceValueIF reference) {
		parent = reference;
	}

	@Override
	protected void commitChildren() {
		super.commitChildren();
		if (parent != null)
			parent.commit();
	}

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