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    }