ArrayValueType.java

package edu.udel.cis.vsl.tass.dynamic.impl.type;

import edu.udel.cis.vsl.tass.dynamic.IF.type.ArrayValueTypeIF;
import edu.udel.cis.vsl.tass.dynamic.IF.type.ValueTypeIF;
import edu.udel.cis.vsl.tass.dynamic.IF.value.ArrayValueIF;
import edu.udel.cis.vsl.tass.dynamic.IF.value.ValueIF;
import edu.udel.cis.vsl.tass.dynamic.impl.value.Value;
import edu.udel.cis.vsl.tass.morph.Morphic;

public class ArrayValueType extends ValueType implements ArrayValueTypeIF {

	private int dimension;

	// TODO: if lengths is null, you don't know dimension! assume 1.

	public ArrayValueType(int instanceId, ValueTypeIF baseType, ValueIF lengths) {
		super(instanceId, true, new Morphic[] { (ValueType) baseType,
				(Value) lengths });
		this.dimension = (lengths == null || lengths.valueType().isInteger() ? 1
				: ((ArrayValueIF) lengths).valueType().dimension() + 1);
	}

	/** To be called only in the case dimension = 1, i.e., rectangular array. */
	private String dimString(String initString) {
		String result = initString
				+ (extent() == null ? "[]" : "[" + extent() + "]");
		ValueTypeIF elementType = baseType();

		if (elementType instanceof ArrayValueType
				&& ((ArrayValueType) elementType).dimension == 1) {
			result = ((ArrayValueType) baseType()).dimString(result);
		} else {
			result = elementType.toString() + result;
		}
		return result;
	}

	@Override
	String stringRecursive() {
		if (getFlag())
			return "...";
		setFlag(true);
		if (dimension > 1) {
			return baseType() + "<" + dimension + "," + lengthVector() + ">";
		} else {
			return dimString("");
		}
	}

	@Override
	public ValueTypeIF baseType() {
		return (ValueTypeIF) getChild(0);
	}

	@Override
	public int dimension() {
		return dimension;
	}

	@Override
	public ValueIF extent() {
		return (dimension == 1 ? lengthVector()
				: ((ArrayValueTypeIF) lengthVector().valueType()).extent());
	}

	@Override
	public ValueIF lengthVector() {
		return (ValueIF) getChild(1);
	}
}