001package org.clafer.ast; 002 003import java.util.Arrays; 004import org.clafer.common.Check; 005import org.clafer.common.Util; 006 007/** 008 * foldl1 op operands. 009 * 010 * @author jimmy 011 */ 012public class AstArithm implements AstSetExpr { 013 014 private final Op op; 015 private final AstSetExpr[] operands; 016 017 AstArithm(Op op, AstSetExpr[] operands) { 018 this.op = Check.notNull(op); 019 this.operands = Check.noNullsNotEmpty(operands); 020 } 021 022 public Op getOp() { 023 return op; 024 } 025 026 public AstSetExpr[] getOperands() { 027 return operands; 028 } 029 030 @Override 031 public <A, B> B accept(AstExprVisitor<A, B> visitor, A a) { 032 return visitor.visit(this, a); 033 } 034 035 @Override 036 public boolean equals(Object obj) { 037 if (obj instanceof AstArithm) { 038 AstArithm other = (AstArithm) obj; 039 return op.equals(other.op) && Arrays.equals(operands, other.operands); 040 } 041 return false; 042 } 043 044 @Override 045 public int hashCode() { 046 // op.hashCode() can change between runs which makes the output change 047 // every time. 048 return op.ordinal() ^ Arrays.hashCode(operands); 049 } 050 051 @Override 052 public String toString() { 053 return "(" + Util.intercalate(") " + op.getSyntax() + " (", operands) + ")"; 054 } 055 056 public static enum Op { 057 058 Add("+"), 059 Sub("-"), 060 Mul("*"), 061 Div("/"); 062 private final String syntax; 063 064 private Op(String syntax) { 065 this.syntax = syntax; 066 } 067 068 public String getSyntax() { 069 return syntax; 070 } 071 } 072}