Tuple.java

package edu.udel.cis.vsl.tass.symbolic.tuple;

import java.util.Arrays;

import edu.udel.cis.vsl.tass.symbolic.IF.tree.TreeExpressionIF;
import edu.udel.cis.vsl.tass.symbolic.IF.type.SymbolicTupleTypeIF;
import edu.udel.cis.vsl.tass.symbolic.expression.SymbolicExpression;

public class Tuple extends SymbolicExpression implements TreeExpressionIF {

	private TreeExpressionIF[] components;

	public Tuple(SymbolicTupleTypeIF tupleType, TreeExpressionIF[] components) {
		super(tupleType);
		this.components = components;
	}

	public SymbolicTupleTypeIF type() {
		return (SymbolicTupleTypeIF) super.type();
	}

	@Override
	protected boolean intrinsicEquals(SymbolicExpression expression) {
		if (expression instanceof Tuple) {
			Tuple that = (Tuple) expression;

			return type().equals(that.type())
					&& Arrays.equals(components, that.components);
		}
		return false;
	}

	@Override
	protected int intrinsicHashCode() {
		return type().hashCode() + Arrays.hashCode(components);
	}

	public String atomString() {
		String result = "<";

		for (int i = 0; i < components.length; i++) {
			TreeExpressionIF component = components[i];

			if (i > 0)
				result += ",";
			result += component;
		}
		result += ">";
		return result;
	}

	public String toString() {
		return atomString();
	}

	public TreeExpressionIF[] components() {
		return components;
	}

	public TreeExpressionIF argument(int index) {
		return components[index];
	}

	public SymbolicKind kind() {
		return SymbolicKind.CONCRETE_TUPLE;
	}

	public int numArguments() {
		return components.length;
	}

}