001package org.clafer.ir;
002
003import org.clafer.common.Check;
004
005/**
006 *
007 * @author jimmy
008 */
009public abstract class IrAbstractSet implements IrSetExpr {
010
011    private final IrDomain env, ker, card;
012
013    public IrAbstractSet(IrDomain env, IrDomain ker, IrDomain card) {
014        this.env = Check.notNull(env);
015        this.ker = Check.notNull(ker);
016        this.card = Check.notNull(card);
017
018        assert IrUtil.isSubsetOf(ker, env);
019        if (card.isEmpty()) {
020            throw new IllegalArgumentException();
021        }
022        if (card.getLowBound() > env.size()) {
023            throw new IllegalArgumentException(card.getLowBound() + " > " + env.size());
024        }
025        if (card.getHighBound() > env.size()) {
026            throw new IllegalArgumentException(card.getHighBound() + " > " + env.size());
027        }
028        if (card.getLowBound() < ker.size()) {
029            throw new IllegalArgumentException(card.getLowBound() + " < " + ker.size());
030        }
031        if (card.getHighBound() < ker.size()) {
032            throw new IllegalArgumentException(card.getHighBound() + " < " + ker.size());
033        }
034    }
035
036    /**
037     * {@inheritDoc}
038     */
039    @Override
040    public IrDomain getEnv() {
041        return env;
042    }
043
044    /**
045     * {@inheritDoc}
046     */
047    @Override
048    public IrDomain getKer() {
049        return ker;
050    }
051
052    /**
053     * {@inheritDoc}
054     */
055    @Override
056    public IrDomain getCard() {
057        return card;
058    }
059
060    @Override
061    public boolean equals(Object obj) {
062        if (obj instanceof IrAbstractSet) {
063            IrAbstractSet other = (IrAbstractSet) obj;
064            return env.equals(other.env) && ker.equals(other.ker) && card.equals(other.card);
065        }
066        return false;
067    }
068
069    @Override
070    public int hashCode() {
071        // Subclasses can choose not to callthis hashCode function since it can
072        // be expensive.
073        return env.hashCode() ^ ker.hashCode() ^ card.hashCode();
074    }
075}