001package org.clafer.ir;
002
003import java.util.Arrays;
004import org.clafer.common.Check;
005
006/**
007 *
008 * @author jimmy
009 */
010public class IrAcyclic extends IrAbstractBool implements IrBoolExpr {
011
012    private final IrIntExpr[] edges;
013
014    public IrAcyclic(IrIntExpr[] edges, IrBoolDomain domain) {
015        super(domain);
016        this.edges = Check.noNullsNotEmpty(edges);
017    }
018
019    public IrIntExpr[] getEdges() {
020        return edges;
021    }
022
023    @Override
024    public IrBoolExpr negate() {
025        return new IrNot(this, getDomain().invert());
026    }
027
028    @Override
029    public boolean isNegative() {
030        return false;
031    }
032
033    @Override
034    public <A, B> B accept(IrBoolExprVisitor<A, B> visitor, A a) {
035        return visitor.visit(this, a);
036    }
037
038    @Override
039    public <A, B> B accept(IrIntExprVisitor<A, B> visitor, A a) {
040        return visitor.visit(this, a);
041    }
042
043    @Override
044    public boolean equals(Object obj) {
045        if (obj instanceof IrAcyclic) {
046            IrAcyclic other = (IrAcyclic) obj;
047            return Arrays.equals(edges, other.edges) && super.equals(other);
048        }
049        return false;
050    }
051
052    @Override
053    public int hashCode() {
054        return 739 * Arrays.hashCode(edges);
055    }
056
057    @Override
058    public String toString() {
059        return "acyclic(" + Arrays.toString(edges) + ")";
060    }
061}