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