CommonStructureValue.java

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

import java.util.Arrays;

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.StructureValue;
import edu.udel.cis.vsl.abc.ast.value.IF.Value;
import edu.udel.cis.vsl.abc.ast.value.IF.ValueFactory.Answer;

public class CommonStructureValue extends CommonValue implements StructureValue {

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

	private Value[] members;

	public CommonStructureValue(StructureOrUnionType type) {
		super(type);
		assert type.isStruct();
		assert type.isComplete();
		members = new Value[type.getNumFields()];
	}

	@Override
	public Value getMember(Field field) {
		return members[field.getMemberIndex()];
	}

	@Override
	public Value getMember(int fieldIndex) {
		return members[fieldIndex];
	}

	@Override
	public void setMember(Field field, Value memberValue) {
		members[field.getMemberIndex()] = memberValue;
	}

	@Override
	public void setMember(int index, Value memberValue) {
		members[index] = memberValue;
	}

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

			return getType().equals(that.getType())
					&& Arrays.equals(members, that.members);
		}
		return false;
	}

	@Override
	public int hashCode() {
		return classCode + getType().hashCode() + Arrays.hashCode(members);
	}

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

	@Override
	public Answer isZero() {
		throw new RuntimeException("Cannot ask if structure is 0");
	}

	@Override
	public String toString() {
		return members.toString();
	}

}