FunctionValueType.java

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

import edu.udel.cis.vsl.tass.dynamic.IF.type.FunctionValueTypeIF;
import edu.udel.cis.vsl.tass.dynamic.IF.type.ValueTypeIF;

public class FunctionValueType extends ValueType implements FunctionValueTypeIF {

	public FunctionValueType(int instanceId, ValueTypeIF returnType,
			ValueTypeIF[] argumentTypes) {
		super(instanceId, true, new ValueType[1 + argumentTypes.length]);
		assert returnType != null;

		int i = 0;
		boolean commit = returnType.isCommitted();

		while (i < argumentTypes.length) {
			ValueType argument = (ValueType) argumentTypes[i];

			assert argument != null;
			setChild(i, argument);
			i++;
			commit = commit && argument.isCommitted();
		}
		setChild(i, (ValueType) returnType);
		if (commit)
			commit();
	}

	@Override
	public ValueTypeIF argumentType(int i) {
		return (ValueTypeIF) getChild(i);
	}

	@Override
	public int numArguments() {
		return numChildren() - 1;
	}

	@Override
	public ValueTypeIF returnType() {
		return (ValueTypeIF) getChild(numChildren() - 1);
	}

	@Override
	String stringRecursive() {
		String result = "Fun[";
		int numArgs = numArguments();

		setFlag(true);
		for (int i = 0; i < numArgs; i++) {
			result += ((ValueType) argumentType(i)).stringRecursive();
			if (i < numArgs - 1)
				result += ",";
		}
		result += "->" + ((ValueType) returnType()).stringRecursive() + "]";
		return result;
	}
}