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}