diff --git a/include/boost/multiprecision/cpp_int.hpp b/include/boost/multiprecision/cpp_int.hpp index 17d97b72..ba68478c 100644 --- a/include/boost/multiprecision/cpp_int.hpp +++ b/include/boost/multiprecision/cpp_int.hpp @@ -1063,7 +1063,8 @@ public: } return result; } - int compare(const cpp_int_backend& o)const BOOST_NOEXCEPT + template + int compare(const cpp_int_backend& o)const BOOST_NOEXCEPT { if(this->sign() != o.sign()) return this->sign() ? -1 : 1; @@ -1075,7 +1076,8 @@ public: result = -result; return result; } - int compare_unsigned(const cpp_int_backend& o)const BOOST_NOEXCEPT + template + int compare_unsigned(const cpp_int_backend& o)const BOOST_NOEXCEPT { if(this->size() != o.size()) { @@ -1090,8 +1092,8 @@ public: } return 0; } - template - BOOST_FORCEINLINE typename enable_if, int>::type compare(Arithmatic i)const BOOST_NOEXCEPT + template + BOOST_FORCEINLINE typename enable_if, int>::type compare(Arithmetic i)const BOOST_NOEXCEPT { // braindead version: cpp_int_backend t; @@ -1377,8 +1379,8 @@ public: result = -result; return result; } - template - BOOST_FORCEINLINE typename enable_if, int>::type compare(Arithmatic i)const BOOST_NOEXCEPT + template + BOOST_FORCEINLINE typename enable_if, int>::type compare(Arithmetic i)const BOOST_NOEXCEPT { // braindead version: cpp_int_backend t; @@ -1394,6 +1396,13 @@ BOOST_FORCEINLINE bool eval_eq(const cpp_int_backend +BOOST_FORCEINLINE bool eval_eq(const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT +{ + return (a.sign() == b.sign()) + && (a.size() == b.size()) + && std::equal(a.limbs(), a.limbs() + a.size(), b.limbs()); +} template BOOST_FORCEINLINE bool eval_eq(const cpp_int_backend& a, limb_type b) BOOST_NOEXCEPT { @@ -1504,13 +1513,13 @@ BOOST_FORCEINLINE bool eval_gt(const cpp_int_backend 0 : eval_gt(a, static_cast(b)); // Use bit pattern of b for comparison. } -template -BOOST_FORCEINLINE void eval_add(cpp_int_backend& result, const cpp_int_backend& o) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_add(cpp_int_backend& result, const cpp_int_backend& o) BOOST_NOEXCEPT_IF(boost::is_void::value) { eval_add(result, result, o); } -template -inline void add_unsigned(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +inline void add_unsigned(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT_IF(boost::is_void::value) { using std::swap; @@ -1528,10 +1537,10 @@ inline void add_unsigned(cpp_int_backend& res return; } result.resize(x); - typename cpp_int_backend::const_limb_pointer pa = a.limbs(); - typename cpp_int_backend::const_limb_pointer pb = b.limbs(); - typename cpp_int_backend::limb_pointer pr = result.limbs(); - typename cpp_int_backend::limb_pointer pr_end = pr + m; + typename cpp_int_backend::const_limb_pointer pa = a.limbs(); + typename cpp_int_backend::const_limb_pointer pb = b.limbs(); + typename cpp_int_backend::limb_pointer pr = result.limbs(); + typename cpp_int_backend::limb_pointer pr_end = pr + m; if(as < bs) swap(pa, pb); @@ -1541,7 +1550,7 @@ inline void add_unsigned(cpp_int_backend& res { carry += static_cast(*pa) + static_cast(*pb); *pr = static_cast(carry); - carry >>= cpp_int_backend::limb_bits; + carry >>= cpp_int_backend::limb_bits; ++pr, ++pa, ++pb; } pr_end += x - m; @@ -1556,21 +1565,21 @@ inline void add_unsigned(cpp_int_backend& res } carry += static_cast(*pa); *pr = static_cast(carry); - carry >>= cpp_int_backend::limb_bits; + carry >>= cpp_int_backend::limb_bits; ++pr, ++pa; } if(carry) { result.resize(x + 1); // We overflowed, need to add one more limb: - if(cpp_int_backend::variable || (result.size() > x)) + if(cpp_int_backend::variable || (result.size() > x)) result.limbs()[x] = static_cast(carry); } result.normalize(); result.sign(a.sign()); } -template -inline void eval_add(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +inline void eval_add(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT_IF(boost::is_void::value) { if(a.sign() != b.sign()) { @@ -1580,22 +1589,22 @@ inline void eval_add(cpp_int_backend& result, add_unsigned(result, a, b); } -template -inline void add_unsigned(cpp_int_backend& result, const cpp_int_backend& a, const limb_type& o) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +inline void add_unsigned(cpp_int_backend& result, const cpp_int_backend& a, const limb_type& o) BOOST_NOEXCEPT_IF(boost::is_void::value) { // Addition using modular arithmatic. // Nothing fancy, just let uintmax_t take the strain: if(&result != &a) result.resize(a.size()); double_limb_type carry = o; - typename cpp_int_backend::limb_pointer pr = result.limbs(); - typename cpp_int_backend::const_limb_pointer pa = a.limbs(); + typename cpp_int_backend::limb_pointer pr = result.limbs(); + typename cpp_int_backend::const_limb_pointer pa = a.limbs(); unsigned i = 0; for(; carry && (i < result.size()); ++i) { carry += static_cast(pa[i]); pr[i] = static_cast(carry); - carry >>= cpp_int_backend::limb_bits; + carry >>= cpp_int_backend::limb_bits; } if(&a != &result) { @@ -1607,7 +1616,7 @@ inline void add_unsigned(cpp_int_backend& res unsigned x = result.size(); result.resize(x + 1); // We overflowed, need to add one more limb: - if(cpp_int_backend::variable || (result.size() > x)) + if(cpp_int_backend::variable || (result.size() > x)) result.limbs()[x] = static_cast(carry); } result.normalize(); @@ -1623,8 +1632,8 @@ BOOST_FORCEINLINE void eval_add(cpp_int_backend -BOOST_FORCEINLINE void eval_add(cpp_int_backend& result, const cpp_int_backend& a, const limb_type& o) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_add(cpp_int_backend& result, const cpp_int_backend& a, const limb_type& o) BOOST_NOEXCEPT_IF(boost::is_void::value) { if(a.sign()) { @@ -1642,8 +1651,8 @@ BOOST_FORCEINLINE void eval_add(cpp_int_backend 0) eval_add(result, static_cast(o)); } -template -BOOST_FORCEINLINE void eval_add(cpp_int_backend& result, const cpp_int_backend& a, const signed_limb_type& o) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_add(cpp_int_backend& result, const cpp_int_backend& a, const signed_limb_type& o) BOOST_NOEXCEPT_IF(boost::is_void::value) { if(o < 0) eval_subtract(result, a, static_cast(-o)); @@ -1692,8 +1701,8 @@ BOOST_FORCEINLINE void eval_subtract(cpp_int_backend -BOOST_FORCEINLINE void eval_subtract(cpp_int_backend& result, const cpp_int_backend& a, const limb_type& o) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_subtract(cpp_int_backend& result, const cpp_int_backend& a, const limb_type& o) BOOST_NOEXCEPT_IF(boost::is_void::value) { if(a.sign()) { @@ -1716,8 +1725,8 @@ BOOST_FORCEINLINE void eval_subtract(cpp_int_backend(o)); } } -template -BOOST_FORCEINLINE void eval_subtract(cpp_int_backend& result, const cpp_int_backend& a, const signed_limb_type& o) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_subtract(cpp_int_backend& result, const cpp_int_backend& a, const signed_limb_type& o) BOOST_NOEXCEPT_IF(boost::is_void::value) { if(o) { @@ -1751,13 +1760,13 @@ BOOST_FORCEINLINE void eval_decrement(cpp_int_backend -BOOST_FORCEINLINE void eval_subtract(cpp_int_backend& result, const cpp_int_backend& o) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_subtract(cpp_int_backend& result, const cpp_int_backend& o) BOOST_NOEXCEPT_IF(boost::is_void::value) { eval_subtract(result, result, o); } -template -inline void subtract_unsigned(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +inline void subtract_unsigned(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT_IF(boost::is_void::value) { using std::swap; @@ -1788,9 +1797,9 @@ inline void subtract_unsigned(cpp_int_backend // Set up the result vector: result.resize(x); // Now that a, b, and result are stable, get pointers to their limbs: - typename cpp_int_backend::const_limb_pointer pa = a.limbs(); - typename cpp_int_backend::const_limb_pointer pb = b.limbs(); - typename cpp_int_backend::limb_pointer pr = result.limbs(); + typename cpp_int_backend::const_limb_pointer pa = a.limbs(); + typename cpp_int_backend::const_limb_pointer pb = b.limbs(); + typename cpp_int_backend::limb_pointer pr = result.limbs(); bool swapped = false; if(c < 0) { @@ -1809,7 +1818,7 @@ inline void subtract_unsigned(cpp_int_backend { borrow = static_cast(pa[i]) - static_cast(pb[i]) - borrow; pr[i] = static_cast(borrow); - borrow = (borrow >> cpp_int_backend::limb_bits) & 1u; + borrow = (borrow >> cpp_int_backend::limb_bits) & 1u; ++i; } // Now where only a has digits, only as long as we've borrowed: @@ -1817,7 +1826,7 @@ inline void subtract_unsigned(cpp_int_backend { borrow = static_cast(pa[i]) - borrow; pr[i] = static_cast(borrow); - borrow = (borrow >> cpp_int_backend::limb_bits) & 1u; + borrow = (borrow >> cpp_int_backend::limb_bits) & 1u; ++i; } // Any remaining digits are the same as those in pa: @@ -1833,8 +1842,8 @@ inline void subtract_unsigned(cpp_int_backend if(swapped) result.negate(); } -template -BOOST_FORCEINLINE void eval_subtract(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_subtract(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT_IF(boost::is_void::value) { if(a.sign() != b.sign()) { @@ -1843,8 +1852,8 @@ BOOST_FORCEINLINE void eval_subtract(cpp_int_backend -inline void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +inline void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT_IF(boost::is_void::value) { // Very simple long multiplication, only usable for small numbers of limb_type's // but that's the typical use case for this type anyway: @@ -1853,8 +1862,8 @@ inline void eval_multiply(cpp_int_backend& re // unsigned as = a.size(); unsigned bs = b.size(); - typename cpp_int_backend::const_limb_pointer pa = a.limbs(); - typename cpp_int_backend::const_limb_pointer pb = b.limbs(); + typename cpp_int_backend::const_limb_pointer pa = a.limbs(); + typename cpp_int_backend::const_limb_pointer pb = b.limbs(); if(as == 1) { bool s = b.sign() != a.sign(); @@ -1879,21 +1888,21 @@ inline void eval_multiply(cpp_int_backend& re return; } - if(&result == &a) + if((void*)&result == (void*)&a) { - cpp_int_backend t(a); + cpp_int_backend t(a); eval_multiply(result, t, b); return; } - if(&result == &b) + if((void*)&result == (void*)&b) { - cpp_int_backend t(b); + cpp_int_backend t(b); eval_multiply(result, a, t); return; } result.resize(as + bs); - typename cpp_int_backend::limb_pointer pr = result.limbs(); + typename cpp_int_backend::limb_pointer pr = result.limbs(); static const double_limb_type limb_max = ~static_cast(0u); static const double_limb_type double_limb_max = ~static_cast(0u); @@ -1903,19 +1912,22 @@ inline void eval_multiply(cpp_int_backend& re std::memset(pr, 0, result.size() * sizeof(limb_type)); for(unsigned i = 0; i < as; ++i) { - unsigned inner_limit = cpp_int_backend::variable ? bs : (std::min)(result.size() - i, bs); + unsigned inner_limit = cpp_int_backend::variable ? bs : (std::min)(result.size() - i, bs); for(unsigned j = 0; j < inner_limit; ++j) { BOOST_ASSERT(i+j < result.size()); - BOOST_ASSERT(!std::numeric_limits::is_specialized || ((std::numeric_limits::max)() - carry > static_cast(cpp_int_backend::max_limb_value) * static_cast(cpp_int_backend::max_limb_value))); + BOOST_ASSERT(!std::numeric_limits::is_specialized + || ((std::numeric_limits::max)() - carry + > + static_cast(cpp_int_backend::max_limb_value) * static_cast(cpp_int_backend::max_limb_value))); carry += static_cast(pa[i]) * static_cast(pb[j]); BOOST_ASSERT(!std::numeric_limits::is_specialized || ((std::numeric_limits::max)() - carry >= pr[i+j])); carry += pr[i + j]; pr[i + j] = static_cast(carry); - carry >>= cpp_int_backend::limb_bits; - BOOST_ASSERT(carry <= (cpp_int_backend::max_limb_value)); + carry >>= cpp_int_backend::limb_bits; + BOOST_ASSERT(carry <= (cpp_int_backend::max_limb_value)); } - if(cpp_int_backend::variable || (i + bs < result.size())) + if(cpp_int_backend::variable || (i + bs < result.size())) pr[i + bs] = static_cast(carry); carry = 0; } @@ -1925,41 +1937,41 @@ inline void eval_multiply(cpp_int_backend& re // result.sign(a.sign() != b.sign()); } -template -BOOST_FORCEINLINE void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a) BOOST_NOEXCEPT_IF(boost::is_void::value) { eval_multiply(result, result, a); } -template -inline void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a, const limb_type& val) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +inline void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a, const limb_type& val) BOOST_NOEXCEPT_IF(boost::is_void::value) { if(!val) { result = static_cast(0); return; } - if(&a != &result) + if((void*)&a != (void*)&result) result.resize(a.size()); double_limb_type carry = 0; - typename cpp_int_backend::limb_pointer p = result.limbs(); - typename cpp_int_backend::limb_pointer pe = result.limbs() + result.size(); - typename cpp_int_backend::const_limb_pointer pa = a.limbs(); + typename cpp_int_backend::limb_pointer p = result.limbs(); + typename cpp_int_backend::limb_pointer pe = result.limbs() + result.size(); + typename cpp_int_backend::const_limb_pointer pa = a.limbs(); while(p != pe) { carry += static_cast(*pa) * static_cast(val); *p = static_cast(carry); - carry >>= cpp_int_backend::limb_bits; + carry >>= cpp_int_backend::limb_bits; ++p, ++pa; } if(carry) { unsigned i = result.size(); result.resize(i + 1); - if(cpp_int_backend::variable || (result.size() > i)) + if(cpp_int_backend::variable || (result.size() > i)) result.limbs()[i] = static_cast(carry); } result.sign(a.sign()); - if(!cpp_int_backend::variable) + if(!cpp_int_backend::variable) result.normalize(); } template @@ -1967,8 +1979,8 @@ BOOST_FORCEINLINE void eval_multiply(cpp_int_backend -BOOST_FORCEINLINE void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a, const double_limb_type& val) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a, const double_limb_type& val) BOOST_NOEXCEPT_IF(boost::is_void::value) { if(val <= (std::numeric_limits::max)()) { @@ -1976,7 +1988,7 @@ BOOST_FORCEINLINE void eval_multiply(cpp_int_backend t(val); + cpp_int_backend t(val); eval_multiply(result, a, t); } } @@ -1985,8 +1997,8 @@ BOOST_FORCEINLINE void eval_multiply(cpp_int_backend -BOOST_FORCEINLINE void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a, const signed_limb_type& val) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a, const signed_limb_type& val) BOOST_NOEXCEPT_IF(boost::is_void::value) { if(val > 0) eval_multiply(result, a, static_cast(val)); @@ -2001,8 +2013,8 @@ BOOST_FORCEINLINE void eval_multiply(cpp_int_backend -inline void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a, const signed_double_limb_type& val) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +inline void eval_multiply(cpp_int_backend& result, const cpp_int_backend& a, const signed_double_limb_type& val) BOOST_NOEXCEPT_IF(boost::is_void::value) { if(val > 0) { @@ -2018,7 +2030,7 @@ inline void eval_multiply(cpp_int_backend& re result.negate(); return; } - cpp_int_backend t(val); + cpp_int_backend t(val); eval_multiply(result, a, t); } template @@ -2027,18 +2039,21 @@ BOOST_FORCEINLINE void eval_multiply(cpp_int_backend -void divide_unsigned_helper(cpp_int_backend* result, const cpp_int_backend& x, const cpp_int_backend& y, cpp_int_backend& r) +template +void divide_unsigned_helper(cpp_int_backend* result, + const cpp_int_backend& x, + const cpp_int_backend& y, + cpp_int_backend& r) { - if((result == &x) || (&r == &x)) + if(((void*)result == (void*)&x) || ((void*)&r == (void*)&x)) { - cpp_int_backend t(x); + cpp_int_backend t(x); divide_unsigned_helper(result, t, y, r); return; } - if((result == &y) || (&r == &y)) + if(((void*)result == (void*)&y) || ((void*)&r == (void*)&y)) { - cpp_int_backend t(y); + cpp_int_backend t(y); divide_unsigned_helper(result, x, t, r); return; } @@ -2066,7 +2081,7 @@ void divide_unsigned_helper(cpp_int_backend* if(result == &r) { - cpp_int_backend rem; + cpp_int_backend rem; divide_unsigned_helper(result, x, y, rem); r = rem; return; @@ -2088,8 +2103,8 @@ void divide_unsigned_helper(cpp_int_backend* return; } - typename cpp_int_backend::const_limb_pointer px = x.limbs(); - typename cpp_int_backend::const_limb_pointer py = y.limbs(); + typename cpp_int_backend::const_limb_pointer px = x.limbs(); + typename cpp_int_backend::const_limb_pointer py = y.limbs(); limb_type r_order = x.size() - 1; if((r_order == 0) && (*px == 0)) @@ -2118,7 +2133,7 @@ void divide_unsigned_helper(cpp_int_backend* } } - cpp_int_backend t; + cpp_int_backend t; bool r_neg = false; // @@ -2134,9 +2149,9 @@ void divide_unsigned_helper(cpp_int_backend* else if(r_order == 1) { double_limb_type a, b; - a = (static_cast(px[1]) << cpp_int_backend::limb_bits) | px[0]; + a = (static_cast(px[1]) << cpp_int_backend::limb_bits) | px[0]; b = y_order ? - (static_cast(py[1]) << cpp_int_backend::limb_bits) | py[0] + (static_cast(py[1]) << cpp_int_backend::limb_bits) | py[0] : py[0]; if(result) *result = a / b; @@ -2148,9 +2163,10 @@ void divide_unsigned_helper(cpp_int_backend* // if(result) result->resize(1 + r_order - y_order); - typename cpp_int_backend::const_limb_pointer prem = r.limbs(); + typename cpp_int_backend::const_limb_pointer prem = r.limbs(); // This is initialised just to keep the compiler from emitting useless warnings later on: - typename cpp_int_backend::limb_pointer pr = typename cpp_int_backend::limb_pointer(); + typename cpp_int_backend::limb_pointer pr + = typename cpp_int_backend::limb_pointer(); if(result) { pr = result->limbs(); @@ -2168,10 +2184,10 @@ void divide_unsigned_helper(cpp_int_backend* if((prem[r_order] <= py[y_order]) && (r_order > 0)) { double_limb_type a, b, v; - a = (static_cast(prem[r_order]) << cpp_int_backend::limb_bits) | prem[r_order - 1]; + a = (static_cast(prem[r_order]) << cpp_int_backend::limb_bits) | prem[r_order - 1]; b = py[y_order]; v = a / b; - if(v > cpp_int_backend::max_limb_value) + if(v > cpp_int_backend::max_limb_value) guess = 1; else { @@ -2186,8 +2202,8 @@ void divide_unsigned_helper(cpp_int_backend* else { double_limb_type a, b, v; - a = (static_cast(prem[r_order]) << cpp_int_backend::limb_bits) | prem[r_order - 1]; - b = (y_order > 0) ? (static_cast(py[y_order]) << cpp_int_backend::limb_bits) | py[y_order - 1] : (static_cast(py[y_order]) << cpp_int_backend::limb_bits); + a = (static_cast(prem[r_order]) << cpp_int_backend::limb_bits) | prem[r_order - 1]; + b = (y_order > 0) ? (static_cast(py[y_order]) << cpp_int_backend::limb_bits) | py[y_order - 1] : (static_cast(py[y_order]) << cpp_int_backend::limb_bits); v = a / b; guess = static_cast(v); } @@ -2211,7 +2227,7 @@ void divide_unsigned_helper(cpp_int_backend* eval_subtract(*result, t); } } - else if(cpp_int_backend::max_limb_value - pr[shift] > guess) + else if(cpp_int_backend::max_limb_value - pr[shift] > guess) pr[shift] += guess; else { @@ -2228,15 +2244,15 @@ void divide_unsigned_helper(cpp_int_backend* // double_limb_type carry = 0; t.resize(y.size() + shift + 1); - bool truncated_t = !cpp_int_backend::variable && (t.size() != y.size() + shift + 1); - typename cpp_int_backend::limb_pointer pt = t.limbs(); + bool truncated_t = !cpp_int_backend::variable && (t.size() != y.size() + shift + 1); + typename cpp_int_backend::limb_pointer pt = t.limbs(); for(unsigned i = 0; i < shift; ++i) pt[i] = 0; for(unsigned i = 0; i < y.size(); ++i) { carry += static_cast(py[i]) * static_cast(guess); pt[i + shift] = static_cast(carry); - carry >>= cpp_int_backend::limb_bits; + carry >>= cpp_int_backend::limb_bits; } if(carry && !truncated_t) { @@ -2294,19 +2310,23 @@ void divide_unsigned_helper(cpp_int_backend* BOOST_ASSERT(r.compare_unsigned(y) < 0); // remainder must be less than the divisor or our code has failed } -template -void divide_unsigned_helper(cpp_int_backend* result, const cpp_int_backend& x, limb_type y, cpp_int_backend& r) +template +void divide_unsigned_helper( + cpp_int_backend* result, + const cpp_int_backend& x, + limb_type y, + cpp_int_backend& r) { - if((result == &x) || (&r == &x)) + if(((void*)result == (void*)&x) || ((void*)&r == (void*)&x)) { - cpp_int_backend t(x); + cpp_int_backend t(x); divide_unsigned_helper(result, t, y, r); return; } if(result == &r) { - cpp_int_backend rem; + cpp_int_backend rem; divide_unsigned_helper(result, x, y, rem); r = rem; return; @@ -2330,7 +2350,7 @@ void divide_unsigned_helper(cpp_int_backend* // r = x; r.sign(false); - typename cpp_int_backend::limb_pointer pr = r.limbs(); + typename cpp_int_backend::limb_pointer pr = r.limbs(); if((r_order == 0) && (*pr == 0)) { @@ -2365,7 +2385,7 @@ void divide_unsigned_helper(cpp_int_backend* else if(r_order == 1) { double_limb_type a; - a = (static_cast(pr[r_order]) << cpp_int_backend::limb_bits) | pr[0]; + a = (static_cast(pr[r_order]) << cpp_int_backend::limb_bits) | pr[0]; if(result) { *result = a / y; @@ -2377,7 +2397,7 @@ void divide_unsigned_helper(cpp_int_backend* } // This is initialised just to keep the compiler from emitting useless warnings later on: - typename cpp_int_backend::limb_pointer pres = typename cpp_int_backend::limb_pointer(); + typename cpp_int_backend::limb_pointer pres = typename cpp_int_backend::limb_pointer(); if(result) { result->resize(r_order + 1); @@ -2394,7 +2414,7 @@ void divide_unsigned_helper(cpp_int_backend* if((pr[r_order] < y) && r_order) { double_limb_type a, b; - a = (static_cast(pr[r_order]) << cpp_int_backend::limb_bits) | pr[r_order - 1]; + a = (static_cast(pr[r_order]) << cpp_int_backend::limb_bits) | pr[r_order - 1]; b = a % y; r.resize(r.size() - 1); --r_order; @@ -2438,32 +2458,36 @@ void divide_unsigned_helper(cpp_int_backend* BOOST_ASSERT(r.compare(y) < 0); // remainder must be less than the divisor or our code has failed } -template -BOOST_FORCEINLINE void eval_divide(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) +template +BOOST_FORCEINLINE void eval_divide(cpp_int_backend& result, + const cpp_int_backend& a, const cpp_int_backend& b) { - cpp_int_backend r; + cpp_int_backend r; divide_unsigned_helper(&result, a, b, r); result.sign(a.sign() != b.sign()); } -template -BOOST_FORCEINLINE void eval_divide(cpp_int_backend& result, const cpp_int_backend& a, limb_type& b) +template +BOOST_FORCEINLINE void eval_divide(cpp_int_backend& result, + const cpp_int_backend& a, limb_type& b) { - cpp_int_backend r; + cpp_int_backend r; divide_unsigned_helper(&result, a, b, r); } -template -BOOST_FORCEINLINE void eval_divide(cpp_int_backend& result, const cpp_int_backend& a, signed_limb_type& b) +template +BOOST_FORCEINLINE void eval_divide(cpp_int_backend& result, + const cpp_int_backend& a, signed_limb_type& b) { - cpp_int_backend r; + cpp_int_backend r; divide_unsigned_helper(&result, a, std::abs(b), r); if(b < 0) result.negate(); } -template -BOOST_FORCEINLINE void eval_divide(cpp_int_backend& result, const cpp_int_backend& b) +template +BOOST_FORCEINLINE void eval_divide(cpp_int_backend& result, + const cpp_int_backend& b) { // There is no in place divide: - cpp_int_backend a(result); + cpp_int_backend a(result); eval_divide(result, a, b); } template @@ -2480,27 +2504,32 @@ BOOST_FORCEINLINE void eval_divide(cpp_int_backend a(result); eval_divide(result, a, b); } -template -BOOST_FORCEINLINE void eval_modulus(cpp_int_backend& result, const cpp_int_backend& a, const cpp_int_backend& b) +template +BOOST_FORCEINLINE void eval_modulus(cpp_int_backend& result, + const cpp_int_backend& a, + const cpp_int_backend& b) { - divide_unsigned_helper(static_cast* >(0), a, b, result); + divide_unsigned_helper(static_cast* >(0), a, b, result); result.sign(a.sign()); } -template -BOOST_FORCEINLINE void eval_modulus(cpp_int_backend& result, const cpp_int_backend& a, limb_type b) +template +BOOST_FORCEINLINE void eval_modulus(cpp_int_backend& result, + const cpp_int_backend& a, limb_type b) { - divide_unsigned_helper(static_cast* >(0), a, b, result); + divide_unsigned_helper(static_cast* >(0), a, b, result); } -template -BOOST_FORCEINLINE void eval_modulus(cpp_int_backend& result, const cpp_int_backend& a, signed_limb_type b) +template +BOOST_FORCEINLINE void eval_modulus(cpp_int_backend& result, + const cpp_int_backend& a, signed_limb_type b) { - divide_unsigned_helper(static_cast* >(0), a, static_cast(std::abs(b)), result); + divide_unsigned_helper(static_cast* >(0), a, static_cast(std::abs(b)), result); } -template -BOOST_FORCEINLINE void eval_modulus(cpp_int_backend& result, const cpp_int_backend& b) +template +BOOST_FORCEINLINE void eval_modulus(cpp_int_backend& result, + const cpp_int_backend& b) { // There is no in place divide: - cpp_int_backend a(result); + cpp_int_backend a(result); eval_modulus(result, a, b); } template @@ -2517,8 +2546,11 @@ BOOST_FORCEINLINE void eval_modulus(cpp_int_backend a(result); eval_modulus(result, a, b); } -template -void bitwise_op(cpp_int_backend& result, const cpp_int_backend& o, Op op) BOOST_NOEXCEPT +template +void bitwise_op( + cpp_int_backend& result, + const cpp_int_backend& o, + Op op) BOOST_NOEXCEPT { // // There are 4 cases: @@ -2537,8 +2569,8 @@ void bitwise_op(cpp_int_backend& result, cons unsigned m, x; minmax(rs, os, m, x); result.resize(x); - typename cpp_int_backend::limb_pointer pr = result.limbs(); - typename cpp_int_backend::const_limb_pointer po = o.limbs(); + typename cpp_int_backend::limb_pointer pr = result.limbs(); + typename cpp_int_backend::const_limb_pointer po = o.limbs(); for(unsigned i = rs; i < x; ++i) pr[i] = 0; @@ -2561,13 +2593,13 @@ void bitwise_op(cpp_int_backend& result, cons { carry += static_cast(~po[i]); pr[i] = op(pr[i], static_cast(carry)); - carry >>= cpp_int_backend::limb_bits; + carry >>= cpp_int_backend::limb_bits; } for(unsigned i = os; i < x; ++i) { carry += static_cast(~limb_type(0)); pr[i] = op(pr[i], static_cast(carry)); - carry >>= cpp_int_backend::limb_bits; + carry >>= cpp_int_backend::limb_bits; } // Set the overflow into the "extra" limb: carry += static_cast(~limb_type(0)); @@ -2584,13 +2616,13 @@ void bitwise_op(cpp_int_backend& result, cons { carry += static_cast(~pr[i]); pr[i] = op(static_cast(carry), po[i]); - carry >>= cpp_int_backend::limb_bits; + carry >>= cpp_int_backend::limb_bits; } for(unsigned i = os; i < x; ++i) { carry += static_cast(~pr[i]); pr[i] = op(static_cast(carry), limb_type(0)); - carry >>= cpp_int_backend::limb_bits; + carry >>= cpp_int_backend::limb_bits; } // Set the overflow into the "extra" limb: carry += static_cast(~limb_type(0)); @@ -2606,16 +2638,16 @@ void bitwise_op(cpp_int_backend& result, cons r_carry += static_cast(~pr[i]); o_carry += static_cast(~po[i]); pr[i] = op(static_cast(r_carry), static_cast(o_carry)); - r_carry >>= cpp_int_backend::limb_bits; - o_carry >>= cpp_int_backend::limb_bits; + r_carry >>= cpp_int_backend::limb_bits; + o_carry >>= cpp_int_backend::limb_bits; } for(unsigned i = os; i < x; ++i) { r_carry += static_cast(~pr[i]); o_carry += static_cast(~limb_type(0)); pr[i] = op(static_cast(r_carry), static_cast(o_carry)); - r_carry >>= cpp_int_backend::limb_bits; - o_carry >>= cpp_int_backend::limb_bits; + r_carry >>= cpp_int_backend::limb_bits; + o_carry >>= cpp_int_backend::limb_bits; } // Set the overflow into the "extra" limb: r_carry += static_cast(~limb_type(0)); @@ -2634,7 +2666,7 @@ void bitwise_op(cpp_int_backend& result, cons { carry += static_cast(~pr[i]); pr[i] = static_cast(carry); - carry >>= cpp_int_backend::limb_bits; + carry >>= cpp_int_backend::limb_bits; } } else @@ -2647,23 +2679,25 @@ struct bit_and{ limb_type operator()(limb_type a, limb_type b)const BOOST_NOEXCE struct bit_or { limb_type operator()(limb_type a, limb_type b)const BOOST_NOEXCEPT { return a | b; } }; struct bit_xor{ limb_type operator()(limb_type a, limb_type b)const BOOST_NOEXCEPT { return a ^ b; } }; -template -BOOST_FORCEINLINE void eval_bitwise_and(cpp_int_backend& result, const cpp_int_backend& o)BOOST_NOEXCEPT_IF(is_void::value) +template +BOOST_FORCEINLINE void eval_bitwise_and( + cpp_int_backend& result, + const cpp_int_backend& o)BOOST_NOEXCEPT_IF(is_void::value) { bitwise_op(result, o, bit_and()); } -template -BOOST_FORCEINLINE void eval_bitwise_or(cpp_int_backend& result, const cpp_int_backend& o) BOOST_NOEXCEPT_IF(is_void::value) +template +BOOST_FORCEINLINE void eval_bitwise_or(cpp_int_backend& result, const cpp_int_backend& o) BOOST_NOEXCEPT_IF(is_void::value) { bitwise_op(result, o, bit_or()); } -template -BOOST_FORCEINLINE void eval_bitwise_xor(cpp_int_backend& result, const cpp_int_backend& o) BOOST_NOEXCEPT_IF(is_void::value) +template +BOOST_FORCEINLINE void eval_bitwise_xor(cpp_int_backend& result, const cpp_int_backend& o) BOOST_NOEXCEPT_IF(is_void::value) { bitwise_op(result, o, bit_xor()); } -template -BOOST_FORCEINLINE void eval_complement(cpp_int_backend& result, const cpp_int_backend& o) BOOST_NOEXCEPT_IF(boost::is_void::value) +template +BOOST_FORCEINLINE void eval_complement(cpp_int_backend& result, const cpp_int_backend& o) BOOST_NOEXCEPT_IF(boost::is_void::value) { // Increment and negate: result = o;