001package org.clafer.ir; 002 003import java.util.Arrays; 004import org.clafer.common.Check; 005 006/** 007 * 008 * @author jimmy 009 */ 010public class IrFilterString extends IrAbstractBool implements IrBoolExpr { 011 012 private final IrSetExpr set; 013 private final int offset; 014 private final IrIntExpr[] string; 015 private final IrIntExpr[] result; 016 017 public IrFilterString(IrSetExpr set, int offset, IrIntExpr[] string, IrIntExpr[] result, IrBoolDomain domain) { 018 super(domain); 019 if (offset < 0) { 020 throw new IllegalArgumentException(); 021 } 022 this.set = set; 023 this.offset = offset; 024 this.string = Check.noNullsNotEmpty(string); 025 this.result = Check.noNullsNotEmpty(result); 026 } 027 028 public IrSetExpr getSet() { 029 return set; 030 } 031 032 public int getOffset() { 033 return offset; 034 } 035 036 public IrIntExpr[] getString() { 037 return string; 038 } 039 040 public IrIntExpr[] getResult() { 041 return result; 042 } 043 044 @Override 045 public IrBoolExpr negate() { 046 return new IrNot(this, getDomain().invert()); 047 } 048 049 @Override 050 public boolean isNegative() { 051 return false; 052 } 053 054 @Override 055 public <A, B> B accept(IrBoolExprVisitor<A, B> visitor, A a) { 056 return visitor.visit(this, a); 057 } 058 059 @Override 060 public <A, B> B accept(IrIntExprVisitor<A, B> visitor, A a) { 061 return visitor.visit(this, a); 062 } 063 064 @Override 065 public boolean equals(Object obj) { 066 if (obj instanceof IrFilterString) { 067 IrFilterString other = (IrFilterString) obj; 068 return set.equals(other.set) 069 && Arrays.equals(string, other.string) 070 && Arrays.equals(result, other.result) 071 && super.equals(other); 072 } 073 return false; 074 } 075 076 @Override 077 public int hashCode() { 078 return set.hashCode() ^ Arrays.deepHashCode(string) ^ Arrays.hashCode(result); 079 } 080 081 @Override 082 public String toString() { 083 return "filterString(" + set + " >> " + offset + ", " + Arrays.toString(string) + ", " + Arrays.toString(result) + ")"; 084 } 085}