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