X-Git-Url: https://mattmccutchen.net/bigint/bigint.git/blobdiff_plain/3e1327901d299a537a8d932c49dd330f87ac3bda..c17afa550d0a00498301454195699120e2bf58c5:/BigInteger.cc diff --git a/BigInteger.cc b/BigInteger.cc index 2651ab7..3b23aa1 100644 --- a/BigInteger.cc +++ b/BigInteger.cc @@ -13,11 +13,18 @@ void BigInteger::operator =(const BigInteger &x) { BigInteger::BigInteger(const Blk *b, Index blen, Sign s) : mag(b, blen) { switch (s) { case zero: + if (!mag.isZero()) + throw "BigInteger::BigInteger(const Blk *, Index, Sign): Cannot use a sign of zero with a nonzero magnitude"; + sign = zero; + break; case positive: case negative: + // If the magnitude is zero, force the sign to zero. sign = mag.isZero() ? zero : s; break; default: + /* g++ seems to be optimizing out this case on the assumption + * that the sign is a valid member of the enumeration. Oh well. */ throw "BigInteger::BigInteger(const Blk *, Index, Sign): Invalid sign"; } } @@ -25,12 +32,19 @@ BigInteger::BigInteger(const Blk *b, Index blen, Sign s) : mag(b, blen) { BigInteger::BigInteger(const BigUnsigned &x, Sign s) : mag(x) { switch (s) { case zero: + if (!mag.isZero()) + throw "BigInteger::BigInteger(const BigUnsigned &, Sign): Cannot use a sign of zero with a nonzero magnitude"; + sign = zero; + break; case positive: case negative: + // If the magnitude is zero, force the sign to zero. sign = mag.isZero() ? zero : s; break; default: - throw "BigInteger::BigInteger(Blk *, Index, Sign): Invalid sign"; + /* g++ seems to be optimizing out this case on the assumption + * that the sign is a valid member of the enumeration. Oh well. */ + throw "BigInteger::BigInteger(const BigUnsigned &, Sign): Invalid sign"; } } @@ -39,15 +53,9 @@ BigInteger::BigInteger(const BigUnsigned &x, Sign s) : mag(x) { * negative BigInteger instead of an exception. */ // Done longhand to let us use initialization. -BigInteger::BigInteger(unsigned long x) : mag(x) { - sign = mag.isZero() ? zero : positive; -} -BigInteger::BigInteger(unsigned int x) : mag(x) { - sign = mag.isZero() ? zero : positive; -} -BigInteger::BigInteger(unsigned short x) : mag(x) { - sign = mag.isZero() ? zero : positive; -} +BigInteger::BigInteger(unsigned long x) : mag(x) { sign = mag.isZero() ? zero : positive; } +BigInteger::BigInteger(unsigned int x) : mag(x) { sign = mag.isZero() ? zero : positive; } +BigInteger::BigInteger(unsigned short x) : mag(x) { sign = mag.isZero() ? zero : positive; } // For signed input, determine the desired magnitude and sign separately. @@ -66,12 +74,9 @@ namespace { } } -BigInteger::BigInteger(long x) : sign(signOf(x)), - mag(magOf(x)) {} -BigInteger::BigInteger(int x) : sign(signOf(x)), - mag(magOf(x)) {} -BigInteger::BigInteger(short x) : sign(signOf(x)), - mag(magOf(x)) {} +BigInteger::BigInteger(long x) : sign(signOf(x)), mag(magOf(x)) {} +BigInteger::BigInteger(int x) : sign(signOf(x)), mag(magOf(x)) {} +BigInteger::BigInteger(short x) : sign(signOf(x)), mag(magOf(x)) {} // CONVERSION TO PRIMITIVE INTEGERS @@ -119,24 +124,12 @@ X BigInteger::convertToSignedPrimitive() const { "Value is too big to fit in the requested type"; } -unsigned long BigInteger::toUnsignedLong() const { - return convertToUnsignedPrimitive(); -} -unsigned int BigInteger::toUnsignedInt() const { - return convertToUnsignedPrimitive(); -} -unsigned short BigInteger::toUnsignedShort() const { - return convertToUnsignedPrimitive(); -} -long BigInteger::toLong() const { - return convertToSignedPrimitive(); -} -int BigInteger::toInt() const { - return convertToSignedPrimitive(); -} -short BigInteger::toShort() const { - return convertToSignedPrimitive(); -} +unsigned long BigInteger::toUnsignedLong () const { return convertToUnsignedPrimitive (); } +unsigned int BigInteger::toUnsignedInt () const { return convertToUnsignedPrimitive (); } +unsigned short BigInteger::toUnsignedShort() const { return convertToUnsignedPrimitive (); } +long BigInteger::toLong () const { return convertToSignedPrimitive (); } +int BigInteger::toInt () const { return convertToSignedPrimitive (); } +short BigInteger::toShort () const { return convertToSignedPrimitive (); } // COMPARISON BigInteger::CmpRes BigInteger::compareTo(const BigInteger &x) const {