001package org.clafer.ir;
002
003import java.util.Arrays;
004import org.clafer.common.Check;
005import org.clafer.common.Util;
006
007/**
008 * offset + foldl (+) addends
009 *
010 * @author jimmy
011 */
012public class IrAdd extends IrAbstractInt {
013
014    private final IrIntExpr[] addends;
015    private final int offset;
016
017    IrAdd(IrIntExpr[] addends, int offset, IrDomain domain) {
018        super(domain);
019        this.addends = Check.noNullsNotEmpty(addends);
020        this.offset = offset;
021    }
022
023    public IrIntExpr[] getAddends() {
024        return addends;
025    }
026
027    public int getOffset() {
028        return offset;
029    }
030
031    @Override
032    public <A, B> B accept(IrIntExprVisitor< A, B> visitor, A a) {
033        return visitor.visit(this, a);
034    }
035
036    @Override
037    public boolean equals(Object obj) {
038        if (obj instanceof IrAdd) {
039            IrAdd other = (IrAdd) obj;
040            return Arrays.equals(addends, other.addends) && offset == other.offset && super.equals(other);
041        }
042        return false;
043    }
044
045    @Override
046    public int hashCode() {
047        return Arrays.hashCode(addends) ^ offset;
048    }
049
050    @Override
051    public String toString() {
052        return "(" + Util.intercalate(") + (", getAddends()) + ")" + (offset == 0 ? "" : " + "
053                + offset);
054    }
055}