ScopeState.java

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

import edu.udel.cis.vsl.tass.dynamic.IF.value.ValueIF;
import edu.udel.cis.vsl.tass.model.IF.scope.ScopeIF;
import edu.udel.cis.vsl.tass.morph.Morphic;
import edu.udel.cis.vsl.tass.morph.MorphicArray;
import edu.udel.cis.vsl.tass.morph.MorphicArrayFactory;
import edu.udel.cis.vsl.tass.morph.MorphicObject;
import edu.udel.cis.vsl.tass.state.IF.ScopeStateIF;

public class ScopeState extends MorphicObject implements ScopeStateIF {

	private ScopeIF scope;

	private MorphicArray<ValueIF> values;

	public ScopeState(ScopeIF scope, MorphicArray<ValueIF> values) {
		assert scope != null;
		assert values != null;
		this.scope = scope;
		this.values = values;
	}

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

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

			return scope.equals(that.scope) && values.equals(that.values);
		}
		return false;
	}

	@Override
	protected int computeHashCode() {
		return scope.hashCode() + values.hashCode();
	}

	@Override
	public ScopeIF scope() {
		return scope;
	}

	@Override
	public MorphicArray<ValueIF> values() {
		return values;
	}

	public void setValues(MorphicArray<ValueIF> values) {
		assert !isCommitted();
		this.values = values;
	}

	public void setValue(int index, ValueIF value) {
		values.set(index, value);
	}

	void canonicalizeChildren(MorphicArrayFactory<ValueIF> arrayFactory) {
		values = arrayFactory.canonic(values);
	}

}