ConditionalExpression.java
package edu.udel.cis.vsl.tass.symbolic.cond;
import edu.udel.cis.vsl.tass.symbolic.NumericPrimitive;
import edu.udel.cis.vsl.tass.symbolic.IF.tree.TreeExpressionIF;
import edu.udel.cis.vsl.tass.symbolic.expression.SymbolicExpression;
public class ConditionalExpression extends SymbolicExpression implements
NumericPrimitive {
private TreeExpressionIF predicate;
private TreeExpressionIF trueValue;
private TreeExpressionIF falseValue;
ConditionalExpression(TreeExpressionIF predicate,
TreeExpressionIF trueValue, TreeExpressionIF falseValue) {
super(trueValue.type());
assert type().equals(falseValue.type());
assert predicate.type().isBoolean();
this.predicate = predicate;
this.trueValue = trueValue;
this.falseValue = falseValue;
}
public TreeExpressionIF predicate() {
return predicate;
}
public TreeExpressionIF trueValue() {
return trueValue;
}
public TreeExpressionIF falseValue() {
return falseValue;
}
@Override
protected boolean intrinsicEquals(SymbolicExpression expression) {
if (expression instanceof ConditionalExpression) {
ConditionalExpression that = (ConditionalExpression) expression;
return predicate.equals(that.predicate)
&& trueValue.equals(that.trueValue)
&& falseValue.equals(that.falseValue);
}
return false;
}
@Override
protected int intrinsicHashCode() {
return predicate.hashCode() + trueValue.hashCode()
+ falseValue.hashCode();
}
public String toString() {
return "(" + predicate + " ? " + trueValue + " : " + falseValue + ")";
}
public String atomString() {
return toString();
}
public NumericPrimitiveKind numericPrimitiveKind() {
return NumericPrimitiveKind.COND;
}
public TreeExpressionIF argument(int index) {
switch (index) {
case 0:
return predicate;
case 1:
return trueValue;
case 2:
return falseValue;
default:
throw new RuntimeException("numArguments=" + 3 + ", index=" + index);
}
}
public SymbolicKind kind() {
return SymbolicKind.COND;
}
public int numArguments() {
return 3;
}
}