CommonOperatorValue.java

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

import java.util.Arrays;

import edu.udel.cis.vsl.abc.ast.node.IF.expression.OperatorNode.Operator;
import edu.udel.cis.vsl.abc.ast.type.IF.Type;
import edu.udel.cis.vsl.abc.ast.value.IF.OperatorValue;
import edu.udel.cis.vsl.abc.ast.value.IF.Value;
import edu.udel.cis.vsl.abc.ast.value.IF.ValueFactory.Answer;

public class CommonOperatorValue extends CommonValue implements OperatorValue {

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

	private Operator operator;

	private Value[] arguments;

	public CommonOperatorValue(Type type, Operator operator, Value[] arguments) {
		super(type);
		assert operator != null;
		assert arguments != null;
		this.operator = operator;
		this.arguments = arguments;
	}

	@Override
	public Operator getOperator() {
		return operator;
	}

	@Override
	public int getNumberOfArguments() {
		return arguments.length;
	}

	@Override
	public Value getArgument(int index) {
		return arguments[index];
	}

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

			return getType().equals(that.getType())
					&& operator == that.operator
					&& Arrays.equals(arguments, that.arguments);
		}
		return false;
	}

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

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

	@Override
	public String toString() {
		return operator + "[" + arguments + "]";
	}

}