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