CommonUnionValue.java

package edu.udel.cis.vsl.abc.ast.value.common;

import edu.udel.cis.vsl.abc.ast.type.IF.Field;
import edu.udel.cis.vsl.abc.ast.type.IF.StructureOrUnionType;
import edu.udel.cis.vsl.abc.ast.value.IF.UnionValue;
import edu.udel.cis.vsl.abc.ast.value.IF.Value;
import edu.udel.cis.vsl.abc.ast.value.IF.ValueFactory.Answer;

public class CommonUnionValue extends CommonValue implements UnionValue {

	private final static int classCode = CommonUnionValue.class.hashCode();

	private Field field;

	private Value memberValue;

	public CommonUnionValue(StructureOrUnionType unionType, Field field,
			Value memberValue) {
		super(unionType);
		assert unionType.isUnion();
		assert field != null;
		assert memberValue != null;
		this.field = field;
		this.memberValue = memberValue;
	}

	@Override
	public Field getField() {
		return field;
	}

	@Override
	public Value getMemberValue() {
		return memberValue;
	}

	@Override
	public StructureOrUnionType getType() {
		return (StructureOrUnionType) super.getType();
	}

	@Override
	public boolean equals(Object object) {
		if (this == object)
			return true;
		if (object instanceof CommonUnionValue) {
			CommonUnionValue that = (CommonUnionValue) object;

			return getType().equals(that.getType())
					&& field.equals(that.getField())
					&& memberValue.equals(that.memberValue);
		}
		return false;
	}

	@Override
	public int hashCode() {
		return classCode + field.hashCode() + memberValue.hashCode();
	}

	@Override
	public boolean isScalar() {
		return memberValue.isScalar();
	}

	@Override
	public Answer isZero() {
		return memberValue.isZero();
	}

	@Override
	public String toString() {
		return field.getName() + ":" + memberValue;
	}

}