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