CommonPointerSetExpression.java
package edu.udel.cis.vsl.civl.model.common.expression;
import java.util.HashSet;
import java.util.Set;
import edu.udel.cis.vsl.civl.model.IF.CIVLSource;
import edu.udel.cis.vsl.civl.model.IF.Scope;
import edu.udel.cis.vsl.civl.model.IF.expression.Expression;
import edu.udel.cis.vsl.civl.model.IF.expression.LHSExpression;
import edu.udel.cis.vsl.civl.model.IF.expression.PointerSetExpression;
import edu.udel.cis.vsl.civl.model.IF.type.CIVLType;
import edu.udel.cis.vsl.civl.model.IF.variable.Variable;
public class CommonPointerSetExpression extends CommonExpression
implements
PointerSetExpression {
private LHSExpression basePointer;
private Expression range;
public CommonPointerSetExpression(CIVLSource source, Scope hscope,
Scope lscope, CIVLType type, LHSExpression basePointer,
Expression range) {
super(source, hscope, lscope, type);
this.basePointer = basePointer;
this.range = range;
}
@Override
public ExpressionKind expressionKind() {
return ExpressionKind.POINTER_SET;
}
@Override
public Set<Variable> variableAddressedOf(Scope scope) {
Set<Variable> result = new HashSet<>(),
subResult = basePointer.variableAddressedOf(scope);
if (subResult != null)
result.addAll(subResult);
subResult = range.variableAddressedOf(scope);
if (subResult != null)
result.addAll(subResult);
if (result.isEmpty())
return null;
return result;
}
@Override
public Set<Variable> variableAddressedOf() {
Set<Variable> result = new HashSet<>(),
subResult = basePointer.variableAddressedOf();
if (subResult != null)
result.addAll(subResult);
subResult = range.variableAddressedOf();
if (subResult != null)
result.addAll(subResult);
if (result.isEmpty())
return null;
return result;
}
@Override
public LHSExpression getBasePointer() {
return basePointer;
}
@Override
public Expression getRange() {
return range;
}
@Override
protected boolean expressionEquals(Expression expression) {
if (expression instanceof PointerSetExpression) {
PointerSetExpression mem = (PointerSetExpression) expression;
if (mem.getBasePointer().equals(basePointer))
if (mem.getRange().equals(range))
return true;
}
return false;
}
@Override
public String toString() {
if (range != null)
return "{" + this.basePointer + " + " + this.range + "}";
else
return "{" + this.basePointer + "}";
}
}