001package org.clafer.ir;
002
003import java.util.Arrays;
004import org.clafer.common.Check;
005
006/**
007 *
008 * @author jimmy
009 */
010public class IrSelectN extends IrAbstractBool implements IrBoolExpr {
011
012    private final IrBoolExpr[] bools;
013    private final IrIntExpr n;
014
015    IrSelectN(IrBoolExpr[] bools, IrIntExpr n, IrBoolDomain domain) {
016        super(domain);
017        this.bools = Check.noNulls(bools);
018        this.n = Check.notNull(n);
019    }
020
021    public IrBoolExpr[] getBools() {
022        return bools;
023    }
024
025    public IrIntExpr getN() {
026        return n;
027    }
028
029    @Override
030    public boolean isNegative() {
031        return false;
032    }
033
034    @Override
035    public IrBoolExpr negate() {
036        return new IrNot(this, getDomain().invert());
037    }
038
039    @Override
040    public <A, B> B accept(IrBoolExprVisitor<A, B> visitor, A a) {
041        return visitor.visit(this, a);
042    }
043
044    @Override
045    public <A, B> B accept(IrIntExprVisitor<A, B> visitor, A a) {
046        return visitor.visit(this, a);
047    }
048
049    @Override
050    public boolean equals(Object obj) {
051        if (obj instanceof IrSelectN) {
052            IrSelectN other = (IrSelectN) obj;
053            return Arrays.equals(bools, other.bools) && n.equals(other.n);
054        }
055        return false;
056    }
057
058    @Override
059    public int hashCode() {
060        return Arrays.hashCode(bools) ^ n.hashCode();
061    }
062
063    @Override
064    public String toString() {
065        return "selectN(" + Arrays.toString(bools) + ", " + n + ")";
066    }
067}