SymbolicFunctionType.java
package edu.udel.cis.vsl.tass.symbolic.type;
import java.util.Arrays;
import edu.udel.cis.vsl.tass.symbolic.IF.type.SymbolicFunctionTypeIF;
import edu.udel.cis.vsl.tass.symbolic.IF.type.SymbolicTypeIF;
public class SymbolicFunctionType extends SymbolicType implements
SymbolicFunctionTypeIF {
SymbolicTypeIF[] inputTypes;
SymbolicTypeIF outputType;
SymbolicFunctionType(SymbolicTypeIF[] inputTypes, SymbolicTypeIF outputType) {
super(SymbolicTypeKind.FUNCTION);
assert inputTypes != null;
assert outputType != null;
int numInputs = inputTypes.length;
this.inputTypes = new SymbolicTypeIF[numInputs];
for (int i = 0; i < numInputs; i++) {
assert inputTypes[i] != null;
this.inputTypes[i] = inputTypes[i];
}
this.outputType = outputType;
}
@Override
boolean intrinsicEquals(SymbolicType thatType) {
if (thatType instanceof SymbolicFunctionType) {
SymbolicFunctionType that = (SymbolicFunctionType) thatType;
return that.outputType.equals(outputType)
&& Arrays.equals(inputTypes, that.inputTypes);
}
return false;
}
@Override
int intrinsicHashCode() {
return SymbolicFunctionType.class.hashCode() + outputType.hashCode()
+ Arrays.hashCode(inputTypes);
}
public SymbolicTypeIF inputType(int index) {
return inputTypes[index];
}
public int numInputs() {
return inputTypes.length;
}
public SymbolicTypeIF outputType() {
return outputType;
}
public String toString() {
String result = "(";
int numInputs = numInputs();
for (int i = 0; i < numInputs; i++) {
if (i > 0)
result += ",";
result += inputType(i);
}
result += ")->" + outputType;
return result;
}
}