package expressions; import common.prettyprinter.PrettyStringBuilder; /** * Represents a tuple expression. * * @author Benedikt Meurer * @version $Id$ */ public final class Tuple extends Expression { /** * Allocates a new tuple with the given <code>expressions</code>. * * @param expressions a non-empty array of {@link Expression}s. */ public Tuple(Expression[] expressions) { // validate the expressions assert (expressions.length > 0); for (Expression expression : expressions) assert (expression instanceof Expression); // apply the list of expressions this.expressions = expressions; } /** * Checks if all sub expressions of the tuple are * values and returns <code>true</code>. <code>false</code> * is returned if atleast one expression is not a value. * * @return <code>true</code> if all sub expressions are * values. * * @see expressions.Expression#isValue() */ @Override public boolean isValue() { for (Expression expression : this.expressions) if (!expression.isValue()) return false; return true; } /** * {@inheritDoc} * * @see expressions.Expression#substitute(java.lang.String, expressions.Expression) */ @Override public Expression substitute(String id, Expression e) { // substitute all subexpressions Expression[] expressions = new Expression[this.expressions.length]; for (int n = 0; n < expressions.length; ++n) expressions[n] = this.expressions[n].substitute(id, e); return new Tuple(expressions); } /** * {@inheritDoc} * * @see expressions.Expression#toPrettyStringBuilder() */ @Override protected PrettyStringBuilder toPrettyStringBuilder() { PrettyStringBuilder builder = new PrettyStringBuilder(this, 6); builder.appendText("("); for (int n = 0; n < this.expressions.length; ++n) { if (n > 0) { builder.appendText(", "); builder.appendBreak(); } builder.appendBuilder(this.expressions[n].toPrettyStringBuilder(), 0); } builder.appendText(")"); return builder; } // // Accessors // /** * Returns the arity of the tuple. * * @return the arity of the tuple. */ public int getArity() { return this.expressions.length; } /** * Returns the sub expressions of the tuple. * * @return the sub expressions of the tuple. */ public Expression[] getExpressions() { return this.expressions; } /** * Returns the sub expression at the given <code>index</code>. * * @param index the index of the sub expression to return. * * @return the sub expression at the given <code>index</code>. * * @throws ArrayIndexOutOfBoundsException if the <code>index</code> * is out of bounds. * * @see #getExpressions() */ public Expression getExpressions(int index) { return this.expressions[index]; } // member attributes private Expression[] expressions; }