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