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}