001 /*
002 * Created on Mar 5, 2004
003 *
004 */
005 package org.codehaus.groovy.runtime.typehandling;
006
007
008 /**
009 * Integer NumberMath operations
010 *
011 * @author Steve Goetze
012 */
013 public class IntegerMath extends NumberMath {
014
015 protected static IntegerMath instance = new IntegerMath();
016
017 private IntegerMath() {}
018
019 protected Number absImpl(Number number) {
020 return new Integer(Math.abs(number.intValue()));
021 }
022
023 protected Number addImpl(Number left, Number right) {
024 return new Integer(left.intValue() + right.intValue());
025 }
026
027 protected Number subtractImpl(Number left, Number right) {
028 return new Integer(left.intValue() - right.intValue());
029 }
030
031 protected Number multiplyImpl(Number left, Number right) {
032 return new Integer(left.intValue() * right.intValue());
033 }
034
035 protected Number divideImpl(Number left, Number right) {
036 return BigDecimalMath.instance.divideImpl(left, right);
037 }
038
039 protected int compareToImpl(Number left, Number right) {
040 int leftVal = left.intValue();
041 int rightVal = right.intValue();
042 return (leftVal<rightVal ? -1 : (leftVal==rightVal ? 0 : 1));
043 }
044
045 protected Number orImpl(Number left, Number right) {
046 return new Integer(left.intValue() | right.intValue());
047 }
048
049 protected Number andImpl(Number left, Number right) {
050 return new Integer(left.intValue() & right.intValue());
051 }
052
053 protected Number xorImpl(Number left, Number right) {
054 return new Integer(left.intValue() ^ right.intValue());
055 }
056
057 protected Number intdivImpl(Number left, Number right) {
058 return new Integer(left.intValue() / right.intValue());
059 }
060
061 protected Number modImpl(Number left, Number right) {
062 return new Integer(left.intValue() % right.intValue());
063 }
064
065 protected Number negateImpl(Number left) {
066 return new Integer(-left.intValue());
067 }
068
069 protected Number bitNegateImpl(Number left) {
070 return new Integer(~left.intValue());
071 }
072
073 protected Number leftShiftImpl(Number left, Number right) {
074 return new Integer(left.intValue() << right.intValue());
075 }
076
077 protected Number rightShiftImpl(Number left, Number right) {
078 return new Integer(left.intValue() >> right.intValue());
079 }
080
081 protected Number rightShiftUnsignedImpl(Number left, Number right) {
082 return new Integer(left.intValue() >>> right.intValue());
083 }
084 }