EvaluatedFunctionExpression.java

package edu.udel.cis.vsl.tass.model.impl.expression;

import java.util.Arrays;

import edu.udel.cis.vsl.tass.model.IF.AbstractFunctionIF;
import edu.udel.cis.vsl.tass.model.IF.ModelFactoryIF;
import edu.udel.cis.vsl.tass.model.IF.expression.EvaluatedFunctionExpressionIF;
import edu.udel.cis.vsl.tass.model.IF.expression.ExpressionIF;

public class EvaluatedFunctionExpression extends Expression implements
		EvaluatedFunctionExpressionIF {

	protected AbstractFunctionIF function;
	protected ExpressionIF[] arguments;

	public EvaluatedFunctionExpression(ModelFactoryIF factory,
			AbstractFunctionIF function, ExpressionIF[] arguments) {
		super(factory, ExpressionKind.FUNCTION);
		type = function.returnType();
		this.function = function;
		this.arguments = new ExpressionIF[arguments.length];
		for(int i = 0; i < arguments.length; i++) {
			this.arguments[i] = arguments[i];
		}
	}

	public boolean equals(Object object) {
		if (object instanceof EvaluatedFunctionExpression) {
			EvaluatedFunctionExpression that = (EvaluatedFunctionExpression) object;

			if (function.equals(that.function)) {
				if (!Arrays.equals(arguments, that.arguments)) {
					return false;
				}
				return true;
			}
		}
		return false;
	}

	public int hashCode() {
		return function.hashCode() + Arrays.hashCode(arguments);
	}

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

	public String toString() {
		String result = function.name() + "(";

		for (int i = 0; i < arguments.length; i++) {
			if (i != 0) {
				result += ", ";
			}
			result += arguments[i].toString();
		}
		result += ")";
		return result;
	}

	public AbstractFunctionIF function() {
		return function;
	}

	public ExpressionIF getArgument(int i) {
		return arguments[i];
	}

}