001package org.clafer.ir;
002
003import org.clafer.common.Check;
004
005/**
006 * dividend / divisor
007 * 
008 * @author jimmy
009 */
010public class IrDiv extends IrAbstractInt {
011
012    /**
013     * Division is internally represented as a binary operation unlike
014     * addition and subtraction. The reason is that this makes optimizing for
015     * Choco easier.
016     */
017    private final IrIntExpr dividend, divisor;
018
019    IrDiv(IrIntExpr dividend, IrIntExpr divisor, IrDomain domain) {
020        super(domain);
021        this.dividend = Check.notNull(dividend);
022        this.divisor = Check.notNull(divisor);
023    }
024
025    public IrIntExpr getDividend() {
026        return dividend;
027    }
028
029    public IrIntExpr getDivisor() {
030        return divisor;
031    }
032
033    @Override
034    public <A, B> B accept(IrIntExprVisitor< A, B> visitor, A a) {
035        return visitor.visit(this, a);
036    }
037
038    @Override
039    public boolean equals(Object obj) {
040        if (obj instanceof IrDiv) {
041            IrDiv other = (IrDiv) obj;
042            return dividend.equals(other.dividend) && divisor.equals(other.divisor);
043        }
044        return false;
045    }
046
047    @Override
048    public int hashCode() {
049        return dividend.hashCode() ^ divisor.hashCode();
050    }
051
052    @Override
053    public String toString() {
054        return "(" + dividend + ") / (" + divisor + ")";
055    }
056}