/**
 * 
 */
package soottocfg.cfg.variable;

import java.io.Serializable;

import com.google.common.base.Preconditions;

import soottocfg.cfg.SourceLocation;
import soottocfg.cfg.expression.IdentifierExpression;
import soottocfg.cfg.type.Type;

/**
 * @author schaef
 *
 */
public class Variable implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2599846473306218710L;

	protected final String variableName;
	protected Type type; //don't make the type final because java.lang.Class is recursive
	protected final boolean constant, unique;

	public Variable(String name, Type t) {
		this(name, t, false, false);
	}

	public Variable(String name, Type t, boolean constant, boolean unique) {
		Preconditions.checkNotNull(t);
		this.variableName = name;
		this.type = t;
		this.constant = constant;
		this.unique = unique;
	}

	public IdentifierExpression mkExp(SourceLocation loc) {
		return new IdentifierExpression(loc, this);
	}
	
	public String getName() {
		return this.variableName;
	}

	public Type getType() {
		return this.type;
	}

	public boolean isConstant() {
		return constant;
	}

	public boolean isUnique() {
		return unique;
	}

	public String toString() {
//		return this.variableName + "/" + this.type;
		return this.type + " " + this.variableName;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Variable) {
			Variable other = (Variable) obj;
			return this.variableName.equals(other.variableName) &&	this.type.equals(other.type);
		}
		return false;
	}
	
	@Override
	public int hashCode() {
		int result = 42;
		result = 37 * result + this.variableName.hashCode();
		result = 37 * result + this.type.hashCode();
		return result;
	}
}
