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