SharedVariable.java

package edu.udel.cis.vsl.tass.model.impl.variable;

import edu.udel.cis.vsl.tass.model.IF.ModelIF;
import edu.udel.cis.vsl.tass.model.IF.SyntaxException;
import edu.udel.cis.vsl.tass.model.IF.expression.ExpressionIF;
import edu.udel.cis.vsl.tass.model.IF.type.TypeIF;
import edu.udel.cis.vsl.tass.model.IF.variable.SharedVariableIF;
import edu.udel.cis.vsl.tass.model.impl.scope.ModelScope;

public class SharedVariable extends Variable implements SharedVariableIF {

	public enum SharedKind {
		INPUT, OUTPUT, GENERAL
	};

	private SharedKind kind;

	private ExpressionIF assumption = null;

	private SharedVariableIF correspondingVariable = null;

	public SharedVariable(String name, TypeIF type, SharedKind kind,
			ModelScope scope) {
		super(name, type, scope);
		this.kind = kind;
	}

	public ModelScope scope() {
		return (ModelScope) super.scope();
	}

	public boolean isInput() {
		return kind == SharedKind.INPUT;
	}

	public boolean isOutput() {
		return kind == SharedKind.OUTPUT;
	}

	public void setAssumption(ExpressionIF assumption) {
		this.assumption = assumption;
	}

	public ExpressionIF assumption() {
		return assumption;
	}

	public void setCorrespondingVariable(SharedVariableIF correspondingVariable) {
		this.correspondingVariable = correspondingVariable;
	}

	/**
	 * Returns the variable that corresponds to this one, if there is one, else
	 * returns null. The corresponding variable is set using the
	 * setCorrespondingVariable method of class ModelIF.
	 * 
	 * @return
	 */
	public SharedVariableIF correspondingVariable() {
		return correspondingVariable;
	}

	public void setInitializationExpression(ExpressionIF expression)
			throws SyntaxException {
		if (isInput() || isOutput()) {
			throw new SyntaxException(this,
					"Cannot assign initial value to input or output variable");
		}
		super.setInitializationExpression(expression);
	}

	@Override
	public ModelIF model() {
		return scope().model();
	}

}