CommonAssignSubscriptExpr.java
package edu.udel.cis.vsl.abc.analysis.pointsTo.common;
import edu.udel.cis.vsl.abc.analysis.pointsTo.IF.AssignExprIF;
import edu.udel.cis.vsl.abc.analysis.pointsTo.IF.AssignOffsetIF;
import edu.udel.cis.vsl.abc.analysis.pointsTo.IF.AssignSubscriptExprIF;
import edu.udel.cis.vsl.abc.ast.type.IF.Type;
public class CommonAssignSubscriptExpr extends CommonAssignExpr
implements
AssignSubscriptExprIF {
private AssignExprIF array;
private AssignOffsetIF index;
CommonAssignSubscriptExpr(int id, Type type, AssignExprIF array,
AssignOffsetIF index) {
super(id, type);
this.array = array;
this.index = index;
assert type != null;
assert array != null;
assert index != null;
}
@Override
public AssignExprIF array() {
return array;
}
@Override
public AssignOffsetIF index() {
return index;
}
@Override
public AssignExprKind kind() {
return AssignExprKind.SUBSCRIPT;
}
@Override
public boolean isFull() {
return false;
}
@Override
public AssignExprIF root() {
return this.array.root();
}
@Override
public String toString() {
String arrayStr = array.toString();
String indexStr = index().toString();
if (array.kind() == AssignExprKind.OFFSET)
arrayStr = "(" + arrayStr + ")";
return arrayStr + "[" + indexStr + "]";
}
@Override
public boolean equals(Object obj) {
if (obj instanceof CommonAssignSubscriptExpr) {
CommonAssignSubscriptExpr that = (CommonAssignSubscriptExpr) obj;
return that.type().equals(this.type())
&& that.array.equals(this.array)
&& that.index.equals(this.index);
}
return false;
}
@Override
public int hashCode() {
int hashCode = ((type().hashCode() * array.hashCode()) / 3 + 1)
+ index.hashCode();
return hashCode;
}
@Override
public boolean mayEquals(AssignExprIF o) {
if (o.kind() == AssignExprKind.SUBSCRIPT) {
AssignSubscriptExprIF other = (AssignSubscriptExprIF) o;
if (array.mayEquals(other.array())) {
if (index.hasConstantValue())
return other.index().hasConstantValue()
? index.constantValue()
.equals(other.index().constantValue())
: true;
else
return true;
}
}
return false;
}
}