Frame.java

package edu.udel.cis.vsl.tass.state.impl;

import edu.udel.cis.vsl.tass.model.IF.FunctionIF;
import edu.udel.cis.vsl.tass.model.IF.location.LocationIF;
import edu.udel.cis.vsl.tass.morph.Morphic;
import edu.udel.cis.vsl.tass.morph.MorphicObject;
import edu.udel.cis.vsl.tass.morph.MorphicVector;
import edu.udel.cis.vsl.tass.morph.MorphicVectorFactory;
import edu.udel.cis.vsl.tass.state.IF.FrameIF;
import edu.udel.cis.vsl.tass.state.IF.ScopeStateIF;

public class Frame extends MorphicObject implements FrameIF {

	private LocationIF location;

	private MorphicVector<ScopeStateIF> scopeStates;

	public Frame(LocationIF location, MorphicVector<ScopeStateIF> scopeStates) {
		assert location != null;
		this.location = location;
		assert scopeStates != null;
		this.scopeStates = scopeStates;
	}

	@Override
	public MorphicVector<ScopeStateIF> scopeStates() {
		return scopeStates;
	}

	public void setScopeStates(MorphicVector<ScopeStateIF> scopeStates) {
		assert !isCommitted();
		this.scopeStates = scopeStates;
	}

	public void push(ScopeStateIF scopeState) {
		scopeStates.push(scopeState);
	}

	public ScopeStateIF pop() {
		return scopeStates.pop();
	}

	public int numScopes() {
		return scopeStates.size();
	}

	public ScopeStateIF scopeState(int index) {
		return scopeStates.get(index);
	}

	public ScopeStateIF peek() {
		return scopeStates.peek();
	}

	@Override
	public LocationIF location() {
		return location;
	}

	public void setLocation(LocationIF location) {
		assert !isCommitted();
		this.location = location;
	}

	@Override
	public FunctionIF function() {
		return location.function();
	}

	@Override
	protected boolean computeEquals(Morphic component) {
		if (this == component)
			return true;
		if (component instanceof Frame) {
			Frame that = (Frame) component;

			return location.equals(that.location)
					&& scopeStates.equals(that.scopeStates);
		}
		return false;
	}

	@Override
	protected int computeHashCode() {
		return location.hashCode() + scopeStates.hashCode();
	}

	void canonicalizeChildren(MorphicVectorFactory<ScopeStateIF> vectorFactory) {
		scopeStates = vectorFactory.canonic(scopeStates);
	}

	@Override
	protected void commitChildren() {
		scopeStates.commit();
	}

}