X-Git-Url: https://mattmccutchen.net/bigint/bigint.git/blobdiff_plain/83a639e66e094c683b48215a895f6d35e9d60d32..61a5a343eee6e3a0f3b533acf167dd8d0c4e5197:/BigInteger.cc diff --git a/BigInteger.cc b/BigInteger.cc index 56f30ab..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"; } }