001    package org.codehaus.groovy.runtime.typehandling;
002    
003    /**
004     * BigInteger NumberMath operations
005     * 
006     * @author Steve Goetze
007     */
008    public class BigIntegerMath extends NumberMath {
009    
010            protected static BigIntegerMath instance = new BigIntegerMath();
011            
012            private BigIntegerMath() {}
013    
014            protected Number absImpl(Number number) {
015                    return toBigInteger(number).abs();
016            }
017            
018            protected Number addImpl(Number left, Number right) {
019                    return toBigInteger(left).add(toBigInteger(right));
020            }
021            protected Number subtractImpl(Number left, Number right) {
022                    return toBigInteger(left).subtract(toBigInteger(right));
023            }
024    
025            protected Number multiplyImpl(Number left, Number right) {
026                    return toBigInteger(left).multiply(toBigInteger(right));
027            }
028    
029            protected Number divideImpl(Number left, Number right) {
030                    return BigDecimalMath.instance.divideImpl(left, right);
031            }
032            
033            protected int compareToImpl(Number left, Number right) {
034                    return toBigInteger(left).compareTo(toBigInteger(right));
035            }
036    
037        protected Number intdivImpl(Number left, Number right) {
038            return toBigInteger(left).divide(toBigInteger(right));
039        }
040        
041        protected Number modImpl(Number left, Number right) {
042            return toBigInteger(left).mod(toBigInteger(right));
043        }
044        
045        protected Number negateImpl(Number left) {
046            return toBigInteger(left).negate();
047        }
048    
049        protected Number bitNegateImpl(Number left) {
050            return toBigInteger(left).not();
051        }
052    
053        protected Number orImpl(Number left, Number right) {
054            return toBigInteger(left).or(toBigInteger(right));
055        }
056    
057        protected Number andImpl(Number left, Number right) {
058            return toBigInteger(left).and(toBigInteger(right));
059        }
060        
061        protected Number xorImpl(Number left, Number right) {
062            return toBigInteger(left).xor(toBigInteger(right));
063        }
064    }