package janala.interpreters;
import java.util.LinkedList;
import java.util.Map;
public final class SymbolicAndConstraint extends Constraint {
public LinkedList<Constraint> constraints;
public SymbolicAndConstraint(Constraint c) {
constraints = new LinkedList<Constraint>();
if (c != null) {
constraints.add(c);
}
}
public SymbolicAndConstraint(LinkedList<Constraint> cons) {
constraints = new LinkedList<Constraint>();
constraints.addAll(cons);
}
private SymbolicAndConstraint() {
}
@Override
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (o == this) {
return true;
}
if (o instanceof SymbolicAndConstraint) {
SymbolicAndConstraint other = (SymbolicAndConstraint) o;
return (constraints.equals(other.constraints));
} else {
return false;
}
}
public SymbolicAndConstraint AND(Constraint c) {
if (c != null) {
SymbolicAndConstraint ret = new SymbolicAndConstraint(constraints);
ret.constraints.add(c);
return ret;
} else {
return this;
}
}
@Override
public void accept(ConstraintVisitor v) {
v.visitSymbolicAnd(this);
}
@Override
public Constraint not() {
return new SymbolicNotConstraint(this);
}
@Override
public Constraint substitute(Map<String, Long> assignments) {
LinkedList<Constraint> tmp = new LinkedList<Constraint>();
Constraint c2;
if (constraints.isEmpty()) {
return SymbolicTrueConstraint.instance;
}
for (Constraint c : constraints) {
c2 = c.substitute(assignments);
if (c2 == SymbolicFalseConstraint.instance) {
return SymbolicFalseConstraint.instance;
} else if (c2 != SymbolicTrueConstraint.instance) {
tmp.add(c2);
}
}
if (!tmp.isEmpty()) {
SymbolicAndConstraint ret = new SymbolicAndConstraint();
ret.constraints = tmp;
return ret;
} else {
return SymbolicTrueConstraint.instance;
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (Constraint c : constraints) {
if (first) {
first = false;
} else {
sb.append(" && ");
}
sb.append("(");
sb.append(c);
sb.append(")");
}
return sb.toString();
}
}