001package org.clafer.ir;
002
003import org.clafer.common.Check;
004
005/**
006 *
007 * @author jimmy
008 */
009public class IrSetDifference extends IrAbstractSet {
010
011    private final IrSetExpr minuend, subtrahend;
012
013    IrSetDifference(IrSetExpr minuend, IrSetExpr subtrahend,
014            IrDomain env, IrDomain ker, IrDomain card) {
015        super(env, ker, card);
016        this.minuend = Check.notNull(minuend);
017        this.subtrahend = Check.notNull(subtrahend);
018    }
019
020    public IrSetExpr getMinuend() {
021        return minuend;
022    }
023
024    public IrSetExpr getSubtrahend() {
025        return subtrahend;
026    }
027
028    @Override
029    public <A, B> B accept(IrSetExprVisitor<A, B> visitor, A a) {
030        return visitor.visit(this, a);
031    }
032
033    @Override
034    public boolean equals(Object obj) {
035        if (obj instanceof IrSetDifference) {
036            IrSetDifference other = (IrSetDifference) obj;
037            return minuend.equals(other.minuend) && subtrahend.equals(other.subtrahend) && super.equals(other);
038        }
039        return false;
040    }
041
042    @Override
043    public int hashCode() {
044        return 7 * minuend.hashCode() * subtrahend.hashCode();
045    }
046
047    @Override
048    public String toString() {
049        return "(" + minuend + ") - (" + subtrahend + ")";
050    }
051}