versions happy.
* BigInteger::convertToUnsignedPrimitive to avoid requiring BigUnsigned to
* declare BigInteger. */
template <class X>
-inline X convertBigUnsignedToPrimitiveAccess(const BigUnsigned &a) {
- return a.convertToPrimitive<X>();
+inline X convertBigUnsignedToPrimitiveAccess(const BigUnsigned &a, X dummyX) {
+ return a.convertToPrimitive(dummyX);
}
template <class X>
-X BigInteger::convertToUnsignedPrimitive() const {
+X BigInteger::convertToUnsignedPrimitive(X dummyX) const {
if (sign == negative)
throw "BigInteger::to<Primitive>: "
"Cannot convert a negative integer to an unsigned type";
else
- return convertBigUnsignedToPrimitiveAccess<X>(mag);
+ return convertBigUnsignedToPrimitiveAccess(mag, dummyX);
}
/* Similar to BigUnsigned::convertToPrimitive, but split into two cases for
* nonnegative and negative numbers. */
template <class X, class UX>
-X BigInteger::convertToSignedPrimitive() const {
+X BigInteger::convertToSignedPrimitive(X /*dummyX*/, UX /*dummyUX*/) const {
if (sign == zero)
return 0;
else if (mag.getLength() == 1) {
"Value is too big to fit in the requested type";
}
-unsigned long BigInteger::toUnsignedLong () const { return convertToUnsignedPrimitive<unsigned long > (); }
-unsigned int BigInteger::toUnsignedInt () const { return convertToUnsignedPrimitive<unsigned int > (); }
-unsigned short BigInteger::toUnsignedShort() const { return convertToUnsignedPrimitive<unsigned short> (); }
-long BigInteger::toLong () const { return convertToSignedPrimitive <long , unsigned long> (); }
-int BigInteger::toInt () const { return convertToSignedPrimitive <int , unsigned int> (); }
-short BigInteger::toShort () const { return convertToSignedPrimitive <short, unsigned short>(); }
+unsigned long BigInteger::toUnsignedLong () const { return convertToUnsignedPrimitive((unsigned long )0) ; }
+unsigned int BigInteger::toUnsignedInt () const { return convertToUnsignedPrimitive((unsigned int )0) ; }
+unsigned short BigInteger::toUnsignedShort() const { return convertToUnsignedPrimitive((unsigned short)0) ; }
+long BigInteger::toLong () const { return convertToSignedPrimitive ((long )0, (unsigned long )0); }
+int BigInteger::toInt () const { return convertToSignedPrimitive ((int )0, (unsigned int )0); }
+short BigInteger::toShort () const { return convertToSignedPrimitive ((short)0, (unsigned short)0); }
// COMPARISON
BigInteger::CmpRes BigInteger::compareTo(const BigInteger &x) const {
short toShort () const;
protected:
// Helper
- template <class X> X convertToUnsignedPrimitive() const;
- template <class X, class UX> X convertToSignedPrimitive() const;
+ template <class X> X convertToUnsignedPrimitive(X dummyX) const;
+ template <class X, class UX> X convertToSignedPrimitive(X dummyX, UX dummyUX) const;
public:
// ACCESSORS
BigUnsigned::BigUnsigned( int x) { initFromSignedPrimitive(x); }
BigUnsigned::BigUnsigned( short x) { initFromSignedPrimitive(x); }
-unsigned long BigUnsigned::toUnsignedLong () const { return convertToPrimitive <unsigned long >(); }
-unsigned int BigUnsigned::toUnsignedInt () const { return convertToPrimitive <unsigned int >(); }
-unsigned short BigUnsigned::toUnsignedShort() const { return convertToPrimitive <unsigned short>(); }
-long BigUnsigned::toLong () const { return convertToSignedPrimitive< long >(); }
-int BigUnsigned::toInt () const { return convertToSignedPrimitive< int >(); }
-short BigUnsigned::toShort () const { return convertToSignedPrimitive< short>(); }
+unsigned long BigUnsigned::toUnsignedLong () const { return convertToPrimitive ((unsigned long )0); }
+unsigned int BigUnsigned::toUnsignedInt () const { return convertToPrimitive ((unsigned int )0); }
+unsigned short BigUnsigned::toUnsignedShort() const { return convertToPrimitive ((unsigned short)0); }
+long BigUnsigned::toLong () const { return convertToSignedPrimitive(( long )0); }
+int BigUnsigned::toInt () const { return convertToSignedPrimitive(( int )0); }
+short BigUnsigned::toShort () const { return convertToSignedPrimitive(( short)0); }
// BIT/BLOCK ACCESSORS
short toShort () const;
protected:
// Helpers
- template <class X> X convertToSignedPrimitive() const;
- template <class X> X convertToPrimitive () const;
+ template <class X> X convertToSignedPrimitive(X dummyX) const;
+ template <class X> X convertToPrimitive (X dummyX) const;
public:
// BIT/BLOCK ACCESSORS
// See BigInteger.cc.
template <class X>
- friend X convertBigUnsignedToPrimitiveAccess(const BigUnsigned &a);
+ friend X convertBigUnsignedToPrimitiveAccess(const BigUnsigned &a, X dummyX);
};
/* Implementing the return-by-value and assignment operators in terms of the
* slower than the previous version with the masks, but it's much shorter and
* clearer, which is the library's stated goal. */
template <class X>
-X BigUnsigned::convertToPrimitive() const {
+X BigUnsigned::convertToPrimitive(X /*dummyX*/) const {
if (len == 0)
// The number is zero; return zero.
return 0;
* one. (E.g., catch incorrect conversion of 2^31 to the long -2^31.) Again,
* separated to avoid a g++ warning. */
template <class X>
-X BigUnsigned::convertToSignedPrimitive() const {
- X x = convertToPrimitive<X>();
+X BigUnsigned::convertToSignedPrimitive(X dummyX) const {
+ X x = convertToPrimitive(dummyX);
if (x >= 0)
return x;
else