FunctionType.java

package edu.udel.cis.vsl.tass.model.impl.type;

import java.util.Arrays;
import java.util.Set;

import edu.udel.cis.vsl.tass.model.IF.type.FunctionTypeIF;
import edu.udel.cis.vsl.tass.model.IF.type.TypeIF;

public class FunctionType extends Type implements FunctionTypeIF {

	private TypeIF[] inputTypes;

	private TypeIF outputType;

	public FunctionType(TypeIF[] inputTypes, TypeIF outputType) {
		super(TypeKind.FUNCTION);
		this.inputTypes = inputTypes;
		this.outputType = outputType;
	}

	@Override
	public String longName(Set<Type> stack) {
		return shortName();
	}

	public TypeIF[] inputTypes() {
		return inputTypes;
	}

	public TypeIF outputType() {
		return outputType;
	}

	public boolean isNumeric() {
		/* Does it seem reasonable to return true if the return type is numeric? */
		return outputType.isNumeric();
	}

	public boolean isSubtypeOf(TypeIF type) {
		return false;
	}

	public String shortName() {
		String result = "Fun[";
		int numArgs = inputTypes.length;

		for (int i = 0; i < numArgs; i++) {
			result += inputTypes[i].shortName();
			if (i < numArgs - 1)
				result += ",";
		}
		result += "->" + outputType.shortName() + "]";
		return result;
	}

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

			return outputType.equals(that.outputType)
					&& Arrays.equals(inputTypes, that.inputTypes);
		}
		return false;
	}

	public int hashCode() {
		int result = 32768 * outputType.hashCode();

		for (TypeIF type : inputTypes)
			result += type.hashCode();
		return result;
	}
}