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}