001package org.clafer.ir;
002
003import org.clafer.common.Check;
004
005/**
006 * multiplicant * multiplier
007 * 
008 * @author jimmy
009 */
010public class IrMul extends IrAbstractInt {
011
012    /**
013     * Multiplication 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 multiplicand, multiplier;
018
019    IrMul(IrIntExpr multiplicand, IrIntExpr multiplier, IrDomain domain) {
020        super(domain);
021        this.multiplicand = Check.notNull(multiplicand);
022        this.multiplier = Check.notNull(multiplier);
023    }
024
025    public IrIntExpr getMultiplicand() {
026        return multiplicand;
027    }
028
029    public IrIntExpr getMultiplier() {
030        return multiplier;
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 IrMul) {
041            IrMul other = (IrMul) obj;
042            return multiplicand.equals(other.multiplicand) && multiplier.equals(other.multiplier);
043        }
044        return false;
045    }
046
047    @Override
048    public int hashCode() {
049        return multiplicand.hashCode() ^ multiplier.hashCode();
050    }
051
052    @Override
053    public String toString() {
054        return "(" + multiplicand + ") * (" + multiplier + ")";
055    }
056}