emul/compact/src/main/java/java/math/SignedMutableBigInteger.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 07 Sep 2013 13:51:24 +0200
branchjdk7-b147
changeset 1258 724f3e1ea53e
permissions -rw-r--r--
Additional set of classes to make porting of lookup library more easier
     1 /*
     2  * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    25 
    26 package java.math;
    27 
    28 /**
    29  * A class used to represent multiprecision integers that makes efficient
    30  * use of allocated space by allowing a number to occupy only part of
    31  * an array so that the arrays do not have to be reallocated as often.
    32  * When performing an operation with many iterations the array used to
    33  * hold a number is only increased when necessary and does not have to
    34  * be the same size as the number it represents. A mutable number allows
    35  * calculations to occur on the same number without having to create
    36  * a new number for every step of the calculation as occurs with
    37  * BigIntegers.
    38  *
    39  * Note that SignedMutableBigIntegers only support signed addition and
    40  * subtraction. All other operations occur as with MutableBigIntegers.
    41  *
    42  * @see     BigInteger
    43  * @author  Michael McCloskey
    44  * @since   1.3
    45  */
    46 
    47 class SignedMutableBigInteger extends MutableBigInteger {
    48 
    49    /**
    50      * The sign of this MutableBigInteger.
    51      */
    52     int sign = 1;
    53 
    54     // Constructors
    55 
    56     /**
    57      * The default constructor. An empty MutableBigInteger is created with
    58      * a one word capacity.
    59      */
    60     SignedMutableBigInteger() {
    61         super();
    62     }
    63 
    64     /**
    65      * Construct a new MutableBigInteger with a magnitude specified by
    66      * the int val.
    67      */
    68     SignedMutableBigInteger(int val) {
    69         super(val);
    70     }
    71 
    72     /**
    73      * Construct a new MutableBigInteger with a magnitude equal to the
    74      * specified MutableBigInteger.
    75      */
    76     SignedMutableBigInteger(MutableBigInteger val) {
    77         super(val);
    78     }
    79 
    80    // Arithmetic Operations
    81 
    82    /**
    83      * Signed addition built upon unsigned add and subtract.
    84      */
    85     void signedAdd(SignedMutableBigInteger addend) {
    86         if (sign == addend.sign)
    87             add(addend);
    88         else
    89             sign = sign * subtract(addend);
    90 
    91     }
    92 
    93    /**
    94      * Signed addition built upon unsigned add and subtract.
    95      */
    96     void signedAdd(MutableBigInteger addend) {
    97         if (sign == 1)
    98             add(addend);
    99         else
   100             sign = sign * subtract(addend);
   101 
   102     }
   103 
   104    /**
   105      * Signed subtraction built upon unsigned add and subtract.
   106      */
   107     void signedSubtract(SignedMutableBigInteger addend) {
   108         if (sign == addend.sign)
   109             sign = sign * subtract(addend);
   110         else
   111             add(addend);
   112 
   113     }
   114 
   115    /**
   116      * Signed subtraction built upon unsigned add and subtract.
   117      */
   118     void signedSubtract(MutableBigInteger addend) {
   119         if (sign == 1)
   120             sign = sign * subtract(addend);
   121         else
   122             add(addend);
   123         if (intLen == 0)
   124              sign = 1;
   125     }
   126 
   127     /**
   128      * Print out the first intLen ints of this MutableBigInteger's value
   129      * array starting at offset.
   130      */
   131     public String toString() {
   132         return this.toBigInteger(sign).toString();
   133     }
   134 
   135 }