CommonAssignStoreExpr.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.AssignStoreExprIF;
import edu.udel.cis.vsl.abc.ast.entity.IF.Variable;
import edu.udel.cis.vsl.abc.ast.node.IF.expression.ExpressionNode;
import edu.udel.cis.vsl.abc.ast.type.IF.Type;

public class CommonAssignStoreExpr extends CommonAssignExpr
		implements
			AssignStoreExprIF {

	private ExpressionNode store = null;

	private Variable variable = null;

	CommonAssignStoreExpr(int id, ExpressionNode store, Type type) {
		super(id, type);
		this.store = store;
		assert type != null;
		assert store != null;
	}

	CommonAssignStoreExpr(int id, Variable variable, Type type) {
		super(id, type);
		this.variable = variable;
		assert type != null;
		assert variable != null;
	}

	@Override
	public AssignExprKind kind() {
		return AssignExprKind.STORE;
	}

	@Override
	public boolean isFull() {
		return false;
	}

	@Override
	public ExpressionNode store() {
		return store;
	}

	@Override
	public String toString() {
		if (isAllocation())
			return store.prettyRepresentation().toString();
		else
			return variable.getName();
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof CommonAssignStoreExpr) {
			CommonAssignStoreExpr that = (CommonAssignStoreExpr) obj;

			if (isAllocation())
				return this.type().equals(that.type())
						&& this.store.equals(that.store);
			else
				return this.type().equals(that.type())
						&& this.variable.equals(that.variable);
		}
		return false;
	}

	@Override
	public boolean isAllocation() {
		return this.store != null;
	}

	@Override
	public Variable variable() {
		return variable;
	}

	@Override
	public int hashCode() {
		if (isAllocation())
			return this.store.hashCode() * this.type().hashCode() * 7;
		else
			return this.variable.hashCode() * this.type().hashCode() * 3;
	}

	@Override
	public boolean mayEquals(AssignExprIF o) {
		return equals(o);
	}
}