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