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