001package org.clafer.ir; 002 003import org.clafer.common.Check; 004 005/** 006 * 007 * @author jimmy 008 */ 009public class IrXor extends IrAbstractBool implements IrBoolExpr { 010 011 private final IrBoolExpr left, right; 012 013 public IrXor(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 IrIfOnlyIf(left, right, getDomain().invert()); 030 } 031 032 @Override 033 public boolean isNegative() { 034 return true; 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 IrXor) { 050 IrXor other = (IrXor) 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}