diff options
Diffstat (limited to 'boost/multiprecision/mpfi.hpp')
-rw-r--r-- | boost/multiprecision/mpfi.hpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/boost/multiprecision/mpfi.hpp b/boost/multiprecision/mpfi.hpp index 81503f7108..8d13981ceb 100644 --- a/boost/multiprecision/mpfi.hpp +++ b/boost/multiprecision/mpfi.hpp @@ -55,8 +55,13 @@ struct mpfi_float_imp; template <unsigned digits10> struct mpfi_float_imp { - typedef mpl::list<long, long long> signed_types; - typedef mpl::list<unsigned long, unsigned long long> unsigned_types; +#ifdef BOOST_HAS_LONG_LONG + typedef mpl::list<long, boost::long_long_type> signed_types; + typedef mpl::list<unsigned long, boost::ulong_long_type> unsigned_types; +#else + typedef mpl::list<long> signed_types; + typedef mpl::list<unsigned long> unsigned_types; +#endif typedef mpl::list<double, long double> float_types; typedef long exponent_type; @@ -97,8 +102,9 @@ struct mpfi_float_imp return *this; } #endif +#ifdef BOOST_HAS_LONG_LONG #ifdef _MPFR_H_HAVE_INTMAX_T - mpfi_float_imp& operator = (unsigned long long i) + mpfi_float_imp& operator = (boost::ulong_long_type i) { if(m_data[0].left._mpfr_d == 0) mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision())); @@ -106,7 +112,7 @@ struct mpfi_float_imp mpfr_set_uj(right_data(), i, GMP_RNDU); return *this; } - mpfi_float_imp& operator = (long long i) + mpfi_float_imp& operator = (boost::long_long_type i) { if(m_data[0].left._mpfr_d == 0) mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision())); @@ -115,28 +121,28 @@ struct mpfi_float_imp return *this; } #else - mpfi_float_imp& operator = (unsigned long long i) + mpfi_float_imp& operator = (boost::ulong_long_type i) { if(m_data[0].left._mpfr_d == 0) mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision())); - unsigned long long mask = ((1uLL << std::numeric_limits<unsigned>::digits) - 1); + boost::ulong_long_type mask = (((1uLL << (std::numeric_limits<unsigned long>::digits - 1) - 1) << 1) | 1u); unsigned shift = 0; mpfi_t t; - mpfi_init2(t, (std::max)(static_cast<unsigned>(std::numeric_limits<unsigned long long>::digits), static_cast<unsigned>(multiprecision::detail::digits10_2_2(digits10)))); + mpfi_init2(t, (std::max)(static_cast<unsigned long>(std::numeric_limits<boost::ulong_long_type>::digits), static_cast<unsigned long>(multiprecision::detail::digits10_2_2(digits10)))); mpfi_set_ui(m_data, 0); while(i) { - mpfi_set_ui(t, static_cast<unsigned>(i & mask)); + mpfi_set_ui(t, static_cast<unsigned long>(i & mask)); if(shift) mpfi_mul_2exp(t, t, shift); mpfi_add(m_data, m_data, t); - shift += std::numeric_limits<unsigned>::digits; - i >>= std::numeric_limits<unsigned>::digits; + shift += std::numeric_limits<unsigned long>::digits; + i >>= std::numeric_limits<unsigned long>::digits; } mpfi_clear(t); return *this; } - mpfi_float_imp& operator = (long long i) + mpfi_float_imp& operator = (boost::long_long_type i) { if(m_data[0].left._mpfr_d == 0) mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision())); @@ -147,6 +153,7 @@ struct mpfi_float_imp return *this; } #endif +#endif mpfi_float_imp& operator = (unsigned long i) { if(m_data[0].left._mpfr_d == 0) @@ -731,14 +738,14 @@ inline void eval_convert_to(long* result, const mpfi_float_backend<digits10>& va } #ifdef _MPFR_H_HAVE_INTMAX_T template <unsigned digits10> -inline void eval_convert_to(unsigned long long* result, const mpfi_float_backend<digits10>& val) +inline void eval_convert_to(boost::ulong_long_type* result, const mpfi_float_backend<digits10>& val) { mpfr_float_backend<digits10> t; mpfi_mid(t.data(), val.data()); eval_convert_to(result, t); } template <unsigned digits10> -inline void eval_convert_to(long long* result, const mpfi_float_backend<digits10>& val) +inline void eval_convert_to(boost::long_long_type* result, const mpfi_float_backend<digits10>& val) { mpfr_float_backend<digits10> t; mpfi_mid(t.data(), val.data()); |