package jayhorn.solver;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Stack;
public class ProverTupleType implements ProverType {
/**
* Eliminate tuple types by expanding them.
*/
public static ProverType[] flatten(ProverType[] types) {
ArrayList<ProverType> res = new ArrayList<ProverType>();
Stack<ProverType> todo = new Stack<ProverType>();
for (int i = types.length - 1; i >= 0; --i)
todo.push(types[i]);
while (!todo.isEmpty()) {
ProverType next = todo.pop();
if (next instanceof ProverTupleType) {
ProverTupleType tnext = (ProverTupleType)next;
for (int i = tnext.getArity() - 1; i >= 0; --i)
todo.push(tnext.getSubType(i));
} else {
res.add(next);
}
}
return res.toArray(new ProverType[0]);
}
private final ProverType[] subTypes;
public ProverTupleType(ProverType[] subTypes) {
this.subTypes = subTypes.clone();
}
public int getArity() {
return subTypes.length;
}
public ProverType getSubType(int ind) {
return subTypes[ind];
}
public ProverType[] getSubTypes() {
return subTypes.clone();
}
@Override
public String toString() {
StringBuffer res = new StringBuffer();
res.append("[ ");
String sep = " ";
for (int i = 0; i < getArity(); ++i) {
res.append(getSubType(i));
res.append(sep);
sep = " , ";
}
res.append(" ]");
return res.toString();
}
@Override
public int hashCode() {
return 12345 * Arrays.hashCode(subTypes);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ProverTupleType other = (ProverTupleType) obj;
return Arrays.equals(this.subTypes, other.subTypes);
}
}