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