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}