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);
}
}