001package org.clafer.ir;
002
003import org.clafer.common.Check;
004
005/**
006 *
007 * @author jimmy
008 */
009public class IrIfOnlyIf extends IrAbstractBool implements IrBoolExpr {
010
011    private final IrBoolExpr left, right;
012
013    IrIfOnlyIf(IrBoolExpr left, IrBoolExpr right, IrBoolDomain domain) {
014        super(domain);
015        this.left = Check.notNull(left);
016        this.right = Check.notNull(right);
017    }
018
019    public IrBoolExpr getLeft() {
020        return left;
021    }
022
023    public IrBoolExpr getRight() {
024        return right;
025    }
026
027    @Override
028    public IrBoolExpr negate() {
029        return new IrXor(left, right, 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 IrIfOnlyIf) {
050            IrIfOnlyIf other = (IrIfOnlyIf) obj;
051            return left.equals(other.left) && right.equals(other.right) && super.equals(other);
052        }
053        return false;
054    }
055
056    @Override
057    public int hashCode() {
058        return left.hashCode() ^ right.hashCode();
059    }
060
061    @Override
062    public String toString() {
063        return left + " <=> " + right;
064    }
065}