001package org.clafer.ir;
002
003import java.util.Arrays;
004import org.clafer.common.Check;
005import org.clafer.common.Util;
006
007/**
008 *
009 * @author jimmy
010 */
011public class IrArrayToSet extends IrAbstractSet {
012
013    private final IrIntExpr[] array;
014    private final Integer globalCardinality;
015
016    IrArrayToSet(IrIntExpr[] array, IrDomain env, IrDomain ker, IrDomain card, Integer globalCardinality) {
017        super(env, ker, card);
018        this.array = Check.noNullsNotEmpty(array);
019        if (ker.size() > array.length) {
020            throw new IllegalArgumentException();
021        }
022        this.globalCardinality = globalCardinality;
023    }
024
025    public IrIntExpr[] getArray() {
026        return array;
027    }
028
029    public boolean hasGlobalCardinality() {
030        return globalCardinality != null;
031    }
032
033    public Integer getGlobalCardinality() {
034        return globalCardinality;
035    }
036
037    @Override
038    public <A, B> B accept(IrSetExprVisitor<A, B> visitor, A a) {
039        return visitor.visit(this, a);
040    }
041
042    @Override
043    public boolean equals(Object obj) {
044        if (obj instanceof IrArrayToSet) {
045            IrArrayToSet other = (IrArrayToSet) obj;
046            return Arrays.equals(array, other.array) && Util.equals(globalCardinality, other.globalCardinality) && super.equals(other);
047        }
048        return false;
049    }
050
051    @Override
052    public int hashCode() {
053        return Arrays.hashCode(array) ^ Util.hashCode(globalCardinality);
054    }
055
056    @Override
057    public String toString() {
058        return '{' + Util.commaSeparate(array)
059                + (hasGlobalCardinality() ? " with global cardinality " + getGlobalCardinality() : "")
060                + '}';
061    }
062}