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