mirror of
https://github.com/boostorg/multiprecision.git
synced 2026-07-21 13:23:49 +00:00
Change all bit counts to use size_t/ptrdiff_t.
Fixes https://github.com/boostorg/multiprecision/issues/362
This commit is contained in:
@@ -19,8 +19,8 @@
|
||||
enum cpp_integer_type { signed_magnitude, unsigned_magnitude };
|
||||
enum cpp_int_check_type { checked, unchecked };
|
||||
|
||||
template <unsigned MinBits = 0,
|
||||
unsigned MaxBits = 0,
|
||||
template <std::size_t MinBits = 0,
|
||||
std::size_t MaxBits = 0,
|
||||
cpp_integer_type SignType = signed_magnitude,
|
||||
cpp_int_check_type Checked = unchecked,
|
||||
class Allocator = std::allocator<limb_type> >
|
||||
@@ -28,7 +28,7 @@
|
||||
//
|
||||
// Expression templates default to et_off if there is no allocator:
|
||||
//
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked>
|
||||
struct expression_template_default<cpp_int_backend<MinBits, MaxBits, SignType, Checked, void> >
|
||||
{ static const expression_template_option value = et_off; };
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
Any integer number type that uses `cpp_int_backend` as its implementation layer can import or export its bits via two non-member functions:
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
|
||||
expression_template_option ExpressionTemplates, class OutputIterator>
|
||||
OutputIterator export_bits(
|
||||
const number<const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val,
|
||||
@@ -20,7 +20,7 @@ Any integer number type that uses `cpp_int_backend` as its implementation layer
|
||||
unsigned chunk_size,
|
||||
bool msv_first = true);
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
|
||||
expression_template_option ExpressionTemplates, class Iterator>
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&
|
||||
import_bits(
|
||||
@@ -34,7 +34,7 @@ These functions are designed for data-interchange with other storage formats, an
|
||||
by extension they can be used for floating-point numbers based on that backend as well (see example below).
|
||||
Parameters and use are as follows:
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
|
||||
expression_template_option ExpressionTemplates, class OutputIterator>
|
||||
OutputIterator export_bits(
|
||||
const number<const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val,
|
||||
@@ -55,7 +55,7 @@ has to be specified manually. It may also result in compiler warnings about the
|
||||
[@http://www.boost.org/doc/libs/release/libs/endian/doc/index.html Boost.Endian]
|
||||
to create a custom OutputIterator that reverses the byte order of each chunk prior to actually storing the result.]
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
|
||||
expression_template_option ExpressionTemplates, class ForwardIterator>
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&
|
||||
import_bits(
|
||||
|
||||
@@ -53,13 +53,13 @@ inline typename std::enable_if<boost::multiprecision::detail::is_unsigned<U>::va
|
||||
template <class S>
|
||||
inline typename std::enable_if< !boost::multiprecision::detail::is_unsigned<S>::value, bool>::type is_negative(S s) { return s < 0; }
|
||||
|
||||
template <class Float, int, bool = number_category<Float>::value == number_kind_floating_point>
|
||||
template <class Float, std::ptrdiff_t, bool = number_category<Float>::value == number_kind_floating_point>
|
||||
struct is_cpp_bin_float_implicitly_constructible_from_type
|
||||
{
|
||||
static constexpr const bool value = false;
|
||||
};
|
||||
|
||||
template <class Float, int bit_count>
|
||||
template <class Float, std::ptrdiff_t bit_count>
|
||||
struct is_cpp_bin_float_implicitly_constructible_from_type<Float, bit_count, true>
|
||||
{
|
||||
static constexpr const bool value = (std::numeric_limits<Float>::digits <= (int)bit_count) && (std::numeric_limits<Float>::radix == 2) && std::numeric_limits<Float>::is_specialized
|
||||
@@ -69,13 +69,13 @@ struct is_cpp_bin_float_implicitly_constructible_from_type<Float, bit_count, tru
|
||||
&& (std::is_floating_point<Float>::value || is_number<Float>::value);
|
||||
};
|
||||
|
||||
template <class Float, int, bool = number_category<Float>::value == number_kind_floating_point>
|
||||
template <class Float, std::ptrdiff_t, bool = number_category<Float>::value == number_kind_floating_point>
|
||||
struct is_cpp_bin_float_explicitly_constructible_from_type
|
||||
{
|
||||
static constexpr const bool value = false;
|
||||
};
|
||||
|
||||
template <class Float, int bit_count>
|
||||
template <class Float, std::ptrdiff_t bit_count>
|
||||
struct is_cpp_bin_float_explicitly_constructible_from_type<Float, bit_count, true>
|
||||
{
|
||||
static constexpr const bool value = (std::numeric_limits<Float>::digits > (int)bit_count) && (std::numeric_limits<Float>::radix == 2) && std::numeric_limits<Float>::is_specialized
|
||||
@@ -334,7 +334,7 @@ class cpp_bin_float
|
||||
m_sign = false;
|
||||
m_exponent = 0;
|
||||
|
||||
constexpr const int bits = sizeof(int) * CHAR_BIT - 1;
|
||||
constexpr const std::ptrdiff_t bits = sizeof(int) * CHAR_BIT - 1;
|
||||
int e;
|
||||
f = frexpq(f, &e);
|
||||
while (f)
|
||||
@@ -394,7 +394,7 @@ class cpp_bin_float
|
||||
m_sign = false;
|
||||
m_exponent = 0;
|
||||
|
||||
constexpr const int bits = sizeof(int) * CHAR_BIT - 1;
|
||||
constexpr const std::ptrdiff_t bits = sizeof(int) * CHAR_BIT - 1;
|
||||
int e;
|
||||
f = frexp(f, &e);
|
||||
while (f)
|
||||
@@ -462,7 +462,7 @@ class cpp_bin_float
|
||||
m_sign = false;
|
||||
m_exponent = 0;
|
||||
|
||||
constexpr const int bits = sizeof(int) * CHAR_BIT - 1;
|
||||
constexpr const std::ptrdiff_t bits = sizeof(int) * CHAR_BIT - 1;
|
||||
int e;
|
||||
eval_frexp(f, f, &e);
|
||||
while (eval_get_sign(f) != 0)
|
||||
@@ -513,7 +513,7 @@ class cpp_bin_float
|
||||
ui_type fi = static_cast<ui_type>(boost::multiprecision::detail::unsigned_abs(i));
|
||||
using ar_type = typename boost::multiprecision::detail::canonical<ui_type, rep_type>::type;
|
||||
m_data = static_cast<ar_type>(fi);
|
||||
unsigned shift = msb(fi);
|
||||
std::size_t shift = msb(fi);
|
||||
if (shift >= bit_count)
|
||||
{
|
||||
m_exponent = static_cast<Exponent>(shift);
|
||||
@@ -615,7 +615,7 @@ class cpp_bin_float
|
||||
#endif
|
||||
|
||||
template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class Int>
|
||||
inline void copy_and_round(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, Int& arg, int bits_to_keep = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)
|
||||
inline void copy_and_round(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, Int& arg, std::ptrdiff_t bits_to_keep = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)
|
||||
{
|
||||
// Precondition: exponent of res must have been set before this function is called
|
||||
// as we may need to adjust it based on how many bits_to_keep in arg are set.
|
||||
@@ -635,8 +635,8 @@ inline void copy_and_round(cpp_bin_float<Digits, DigitBase, Allocator, Exponent,
|
||||
res.bits() = static_cast<limb_type>(0u);
|
||||
return;
|
||||
}
|
||||
int msb = eval_msb(arg);
|
||||
if (static_cast<int>(bits_to_keep) > msb + 1)
|
||||
std::ptrdiff_t msb = eval_msb(arg);
|
||||
if (static_cast<std::ptrdiff_t >(bits_to_keep) > msb + 1)
|
||||
{
|
||||
// Must have had cancellation in subtraction,
|
||||
// or be converting from a narrower type, so shift left:
|
||||
@@ -644,13 +644,13 @@ inline void copy_and_round(cpp_bin_float<Digits, DigitBase, Allocator, Exponent,
|
||||
eval_left_shift(res.bits(), bits_to_keep - msb - 1);
|
||||
res.exponent() -= static_cast<Exponent>(bits_to_keep - msb - 1);
|
||||
}
|
||||
else if (static_cast<int>(bits_to_keep) < msb + 1)
|
||||
else if (static_cast<std::ptrdiff_t >(bits_to_keep) < msb + 1)
|
||||
{
|
||||
// We have more bits_to_keep than we need, so round as required,
|
||||
// first get the rounding bit:
|
||||
bool roundup = eval_bit_test(arg, msb - bits_to_keep);
|
||||
// Then check for a tie:
|
||||
if (roundup && (msb - bits_to_keep == (int)eval_lsb(arg)))
|
||||
if (roundup && (msb - bits_to_keep == (std::ptrdiff_t )eval_lsb(arg)))
|
||||
{
|
||||
// Ties round towards even:
|
||||
if (!eval_bit_test(arg, msb - bits_to_keep + 1))
|
||||
@@ -699,7 +699,7 @@ inline void copy_and_round(cpp_bin_float<Digits, DigitBase, Allocator, Exponent,
|
||||
return;
|
||||
}
|
||||
// Result must be normalized:
|
||||
BOOST_MP_ASSERT(((int)eval_msb(res.bits()) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));
|
||||
BOOST_MP_ASSERT(((std::ptrdiff_t )eval_msb(res.bits()) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));
|
||||
|
||||
if (res.exponent() > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
|
||||
{
|
||||
@@ -774,7 +774,7 @@ inline void do_eval_add(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, Mi
|
||||
|
||||
bool s = a.sign();
|
||||
dt = a.bits();
|
||||
if (a.exponent() > (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + b.exponent())
|
||||
if (a.exponent() > (std::ptrdiff_t )cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + b.exponent())
|
||||
{
|
||||
res.exponent() = a.exponent();
|
||||
}
|
||||
@@ -847,14 +847,14 @@ inline void do_eval_subtract(BinFloat1& res, const BinFloat2& a, const BinFloat3
|
||||
if ((a.exponent() > b.exponent()) || ((a.exponent() == b.exponent()) && a.bits().compare(b.bits()) >= 0))
|
||||
{
|
||||
dt = a.bits();
|
||||
if (a.exponent() <= (int)BinFloat1::bit_count + b.exponent())
|
||||
if (a.exponent() <= (std::ptrdiff_t )BinFloat1::bit_count + b.exponent())
|
||||
{
|
||||
typename BinFloat1::exponent_type e_diff = a.exponent() - b.exponent();
|
||||
eval_left_shift(dt, e_diff);
|
||||
res.exponent() = a.exponent() - e_diff;
|
||||
eval_subtract(dt, b.bits());
|
||||
}
|
||||
else if (a.exponent() == (int)BinFloat1::bit_count + b.exponent() + 1)
|
||||
else if (a.exponent() == (std::ptrdiff_t )BinFloat1::bit_count + b.exponent() + 1)
|
||||
{
|
||||
if ((eval_lsb(a.bits()) == BinFloat1::bit_count - 1)
|
||||
&& (eval_lsb(b.bits()) != BinFloat1::bit_count - 1))
|
||||
@@ -872,14 +872,14 @@ inline void do_eval_subtract(BinFloat1& res, const BinFloat2& a, const BinFloat3
|
||||
else
|
||||
{
|
||||
dt = b.bits();
|
||||
if (b.exponent() <= (int)BinFloat1::bit_count + a.exponent())
|
||||
if (b.exponent() <= (std::ptrdiff_t )BinFloat1::bit_count + a.exponent())
|
||||
{
|
||||
typename BinFloat1::exponent_type e_diff = a.exponent() - b.exponent();
|
||||
eval_left_shift(dt, -e_diff);
|
||||
res.exponent() = b.exponent() + e_diff;
|
||||
eval_subtract(dt, a.bits());
|
||||
}
|
||||
else if (b.exponent() == (int)BinFloat1::bit_count + a.exponent() + 1)
|
||||
else if (b.exponent() == (std::ptrdiff_t )BinFloat1::bit_count + a.exponent() + 1)
|
||||
{
|
||||
if ((eval_lsb(a.bits()) != BinFloat1::bit_count - 1)
|
||||
&& eval_lsb(b.bits()))
|
||||
@@ -1339,7 +1339,7 @@ inline typename std::enable_if<boost::multiprecision::detail::is_unsigned<U>::va
|
||||
//
|
||||
// We can set the exponent and sign of the result up front:
|
||||
//
|
||||
int gb = msb(v);
|
||||
std::ptrdiff_t gb = msb(v);
|
||||
res.exponent() = u.exponent() - static_cast<Exponent>(gb) - static_cast<Exponent>(1);
|
||||
res.sign() = u.sign();
|
||||
//
|
||||
@@ -1595,13 +1595,13 @@ inline typename std::enable_if<std::is_floating_point<Float>::value>::type eval_
|
||||
cpp_bin_float<std::numeric_limits<Float>::digits, digit_base_2, Allocator, Exponent, MinE, MaxE> arg;
|
||||
typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::rep_type bits(original_arg.bits());
|
||||
arg.exponent() = original_arg.exponent();
|
||||
copy_and_round(arg, bits, (int)digits_to_round_to);
|
||||
copy_and_round(arg, bits, (std::ptrdiff_t )digits_to_round_to);
|
||||
common_exp_type e = arg.exponent();
|
||||
e -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1;
|
||||
constexpr const unsigned limbs_needed = std::numeric_limits<Float>::digits / (sizeof(*arg.bits().limbs()) * CHAR_BIT) + (std::numeric_limits<Float>::digits % (sizeof(*arg.bits().limbs()) * CHAR_BIT) ? 1 : 0);
|
||||
unsigned first_limb_needed = arg.bits().size() - limbs_needed;
|
||||
constexpr const std::size_t limbs_needed = std::numeric_limits<Float>::digits / (sizeof(*arg.bits().limbs()) * CHAR_BIT) + (std::numeric_limits<Float>::digits % (sizeof(*arg.bits().limbs()) * CHAR_BIT) ? 1 : 0);
|
||||
std::size_t first_limb_needed = arg.bits().size() - limbs_needed;
|
||||
*res = 0;
|
||||
e += first_limb_needed * sizeof(*arg.bits().limbs()) * CHAR_BIT;
|
||||
e += static_cast<common_exp_type>(first_limb_needed * sizeof(*arg.bits().limbs()) * CHAR_BIT);
|
||||
while (first_limb_needed < arg.bits().size())
|
||||
{
|
||||
*res += std::ldexp(static_cast<Float>(arg.bits().limbs()[first_limb_needed]), static_cast<int>(e));
|
||||
@@ -1825,7 +1825,7 @@ inline void eval_floor(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, Min
|
||||
if (fractional && res.sign())
|
||||
{
|
||||
eval_increment(res.bits());
|
||||
if (eval_msb(res.bits()) != cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - shift)
|
||||
if ((std::ptrdiff_t)eval_msb(res.bits()) != cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - shift)
|
||||
{
|
||||
// Must have extended result by one bit in the increment:
|
||||
--shift;
|
||||
@@ -1870,7 +1870,7 @@ inline void eval_ceil(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE
|
||||
if (fractional && !res.sign())
|
||||
{
|
||||
eval_increment(res.bits());
|
||||
if (eval_msb(res.bits()) != cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - shift)
|
||||
if ((std::ptrdiff_t)eval_msb(res.bits()) != cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - shift)
|
||||
{
|
||||
// Must have extended result by one bit in the increment:
|
||||
--shift;
|
||||
|
||||
@@ -271,7 +271,7 @@ cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& cpp_bin_float
|
||||
return *this;
|
||||
}
|
||||
|
||||
constexpr const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
constexpr const std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
//
|
||||
// Set our working precision - this is heuristic based, we want
|
||||
// a value as small as possible > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count to avoid large computations
|
||||
@@ -306,7 +306,7 @@ cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& cpp_bin_float
|
||||
else
|
||||
t = n;
|
||||
final_exponent = (std::int64_t)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 + decimal_exp + calc_exp;
|
||||
int rshift = msb(t) - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1;
|
||||
std::ptrdiff_t rshift = msb(t) - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1;
|
||||
if (rshift > 0)
|
||||
{
|
||||
final_exponent += rshift;
|
||||
@@ -362,7 +362,7 @@ cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& cpp_bin_float
|
||||
{
|
||||
cpp_int d;
|
||||
calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(d, cpp_int(5), -decimal_exp, max_bits, error);
|
||||
int shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - msb(n) + msb(d);
|
||||
std::ptrdiff_t shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - msb(n) + msb(d);
|
||||
final_exponent = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 + decimal_exp - calc_exp;
|
||||
if (shift > 0)
|
||||
{
|
||||
@@ -371,7 +371,7 @@ cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& cpp_bin_float
|
||||
}
|
||||
cpp_int q, r;
|
||||
divide_qr(n, d, q, r);
|
||||
int gb = msb(q);
|
||||
std::ptrdiff_t gb = msb(q);
|
||||
BOOST_MP_ASSERT((gb >= static_cast<int>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) - 1));
|
||||
//
|
||||
// Check for rounding conditions we have to
|
||||
@@ -387,7 +387,7 @@ cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& cpp_bin_float
|
||||
{
|
||||
// Too many bits in q and the bits in q indicate a tie, but we can break that using r,
|
||||
// note that the radius of error in r is error/2 * q:
|
||||
int lshift = gb - (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1;
|
||||
std::ptrdiff_t lshift = gb - (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1;
|
||||
q >>= lshift;
|
||||
final_exponent += static_cast<Exponent>(lshift);
|
||||
BOOST_MP_ASSERT((msb(q) >= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));
|
||||
@@ -514,7 +514,7 @@ std::string cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::s
|
||||
shift -= power10;
|
||||
cpp_int i;
|
||||
int roundup = 0; // 0=no rounding, 1=tie, 2=up
|
||||
constexpr const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
constexpr const std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
//
|
||||
// Set our working precision - this is heuristic based, we want
|
||||
// a value as small as possible > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count to avoid large computations
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace boost { namespace multiprecision { namespace backends {
|
||||
template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
|
||||
void eval_exp_taylor(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& arg)
|
||||
{
|
||||
constexpr const int bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count;
|
||||
constexpr const std::ptrdiff_t bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count;
|
||||
//
|
||||
// Taylor series for small argument, note returns exp(x) - 1:
|
||||
//
|
||||
@@ -22,7 +22,7 @@ void eval_exp_taylor(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE,
|
||||
denom = limb_type(1);
|
||||
eval_add(res, num);
|
||||
|
||||
for (unsigned k = 2;; ++k)
|
||||
for (std::size_t k = 2;; ++k)
|
||||
{
|
||||
eval_multiply(denom, k);
|
||||
eval_multiply(num, arg);
|
||||
|
||||
@@ -36,14 +36,14 @@ namespace backends {
|
||||
#pragma warning(disable : 4702) // Unreachable code (reachability depends on template params)
|
||||
#endif
|
||||
|
||||
template <unsigned MinBits = 0, unsigned MaxBits = 0, boost::multiprecision::cpp_integer_type SignType = signed_magnitude, cpp_int_check_type Checked = unchecked, class Allocator = typename std::conditional<MinBits && (MinBits == MaxBits), void, std::allocator<limb_type> >::type>
|
||||
template <std::size_t MinBits = 0, std::size_t MaxBits = 0, boost::multiprecision::cpp_integer_type SignType = signed_magnitude, cpp_int_check_type Checked = unchecked, class Allocator = typename std::conditional<MinBits && (MinBits == MaxBits), void, std::allocator<limb_type> >::type>
|
||||
struct cpp_int_backend;
|
||||
|
||||
} // namespace backends
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
struct is_byte_container<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> > : public std::false_type
|
||||
{};
|
||||
|
||||
@@ -52,14 +52,14 @@ struct is_byte_container<backends::cpp_int_backend<MinBits, MaxBits, SignType, C
|
||||
namespace backends {
|
||||
|
||||
namespace detail {
|
||||
template <unsigned Value1, unsigned Value2>
|
||||
template <std::size_t Value1, std::size_t Value2>
|
||||
struct static_unsigned_max
|
||||
{
|
||||
static constexpr const unsigned value = (Value1 > Value2) ? Value1 : Value2;
|
||||
static constexpr const std::size_t value = (Value1 > Value2) ? Value1 : Value2;
|
||||
};
|
||||
} // Namespace detail
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, bool trivial = false>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, bool trivial = false>
|
||||
struct cpp_int_base;
|
||||
//
|
||||
// Traits class determines the maximum and minimum precision values:
|
||||
@@ -67,20 +67,20 @@ struct cpp_int_base;
|
||||
template <class T>
|
||||
struct max_precision;
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
struct max_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >
|
||||
{
|
||||
static constexpr const unsigned value = std::is_void<Allocator>::value ? detail::static_unsigned_max<MinBits, MaxBits>::value
|
||||
static constexpr const std::size_t value = std::is_void<Allocator>::value ? detail::static_unsigned_max<MinBits, MaxBits>::value
|
||||
: (((MaxBits >= MinBits) && MaxBits) ? MaxBits : UINT_MAX);
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct min_precision;
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
struct min_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >
|
||||
{
|
||||
static constexpr const unsigned value = (std::is_void<Allocator>::value ? detail::static_unsigned_max<MinBits, MaxBits>::value : MinBits);
|
||||
static constexpr const std::size_t value = (std::is_void<Allocator>::value ? detail::static_unsigned_max<MinBits, MaxBits>::value : MinBits);
|
||||
};
|
||||
//
|
||||
// Traits class determines whether the number of bits precision requested could fit in a native type,
|
||||
@@ -92,14 +92,14 @@ struct is_trivial_cpp_int
|
||||
static constexpr const bool value = false;
|
||||
};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
struct is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >
|
||||
{
|
||||
using self = cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>;
|
||||
static constexpr const bool value = std::is_void<Allocator>::value && (max_precision<self>::value <= (sizeof(double_limb_type) * CHAR_BIT) - (SignType == signed_packed ? 1 : 0));
|
||||
};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
struct is_trivial_cpp_int<cpp_int_base<MinBits, MaxBits, SignType, Checked, Allocator, true> >
|
||||
{
|
||||
static constexpr const bool value = true;
|
||||
@@ -109,7 +109,7 @@ struct is_trivial_cpp_int<cpp_int_base<MinBits, MaxBits, SignType, Checked, Allo
|
||||
//
|
||||
// Traits class to determine whether a cpp_int_backend is signed or not:
|
||||
//
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
struct is_unsigned_number<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >
|
||||
: public std::integral_constant<bool, (SignType == unsigned_magnitude) || (SignType == unsigned_packed)>
|
||||
{};
|
||||
@@ -123,7 +123,7 @@ namespace backends {
|
||||
template <class T, class U>
|
||||
struct is_implicit_cpp_int_conversion;
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
struct is_implicit_cpp_int_conversion<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >
|
||||
{
|
||||
using t1 = cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> ;
|
||||
@@ -138,7 +138,7 @@ struct is_implicit_cpp_int_conversion<cpp_int_backend<MinBits, MaxBits, SignType
|
||||
template <class T>
|
||||
struct is_non_throwing_cpp_int : public std::integral_constant<bool, false>
|
||||
{};
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType>
|
||||
struct is_non_throwing_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, unchecked, void> > : public std::integral_constant<bool, true>
|
||||
{};
|
||||
|
||||
@@ -147,19 +147,19 @@ struct is_non_throwing_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, unche
|
||||
//
|
||||
template <class T>
|
||||
struct is_fixed_precision;
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
struct is_fixed_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >
|
||||
: public std::integral_constant<bool, max_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value != UINT_MAX>
|
||||
{};
|
||||
|
||||
namespace detail {
|
||||
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void verify_new_size(unsigned new_size, unsigned min_size, const std::integral_constant<int, checked>&)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void verify_new_size(std::size_t new_size, std::size_t min_size, const std::integral_constant<int, checked>&)
|
||||
{
|
||||
if (new_size < min_size)
|
||||
BOOST_MP_THROW_EXCEPTION(std::overflow_error("Unable to allocate sufficient storage for the value of the result: value overflows the maximum allowable magnitude."));
|
||||
}
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void verify_new_size(unsigned /*new_size*/, unsigned /*min_size*/, const std::integral_constant<int, unchecked>&) {}
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void verify_new_size(std::size_t /*new_size*/, std::size_t /*min_size*/, const std::integral_constant<int, unchecked>&) {}
|
||||
|
||||
template <class U>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void verify_limb_mask(bool b, U limb, U mask, const std::integral_constant<int, checked>&)
|
||||
@@ -177,11 +177,11 @@ inline BOOST_MP_CXX14_CONSTEXPR void verify_limb_mask(bool /*b*/, U /*limb*/, U
|
||||
// Now define the various data layouts that are possible as partial specializations of the base class,
|
||||
// starting with the default arbitrary precision signed integer type:
|
||||
//
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
struct cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>
|
||||
: private boost::multiprecision::detail::empty_value<typename detail::rebind<limb_type, Allocator>::type>
|
||||
{
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, bool trivial2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, bool trivial2>
|
||||
friend struct cpp_int_base;
|
||||
|
||||
using allocator_type = typename detail::rebind<limb_type, Allocator>::type;
|
||||
@@ -199,15 +199,15 @@ struct cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, fals
|
||||
private:
|
||||
struct limb_data
|
||||
{
|
||||
unsigned capacity;
|
||||
std::size_t capacity;
|
||||
limb_pointer data;
|
||||
};
|
||||
|
||||
public:
|
||||
static constexpr unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
static constexpr std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
static constexpr limb_type max_limb_value = ~static_cast<limb_type>(0u);
|
||||
static constexpr limb_type sign_bit_mask = static_cast<limb_type>(1u) << (limb_bits - 1);
|
||||
static constexpr unsigned internal_limb_count =
|
||||
static constexpr std::size_t internal_limb_count =
|
||||
MinBits
|
||||
? (MinBits / limb_bits + ((MinBits % limb_bits) ? 1 : 0))
|
||||
: (sizeof(limb_data) / sizeof(limb_type)) > 1 ? (sizeof(limb_data) / sizeof(limb_type)) : 2;
|
||||
@@ -228,10 +228,10 @@ private:
|
||||
constexpr data_type(signed_double_limb_type i) noexcept : double_first(i < 0 ? static_cast<double_limb_type>(boost::multiprecision::detail::unsigned_abs(i)) : i) {}
|
||||
#endif
|
||||
#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !(defined(BOOST_MSVC) && (BOOST_MSVC < 1900))
|
||||
constexpr data_type(limb_type* limbs, unsigned len) noexcept : ld{ len, limbs }
|
||||
constexpr data_type(limb_type* limbs, std::size_t len) noexcept : ld{ len, limbs }
|
||||
{}
|
||||
#else
|
||||
constexpr data_type(limb_type* limbs, unsigned len) noexcept
|
||||
constexpr data_type(limb_type* limbs, std::size_t len) noexcept
|
||||
{
|
||||
ld.capacity = len;
|
||||
ld.data = limbs;
|
||||
@@ -240,7 +240,7 @@ private:
|
||||
};
|
||||
|
||||
data_type m_data;
|
||||
unsigned m_limbs;
|
||||
std::size_t m_limbs;
|
||||
bool m_sign, m_internal, m_alias;
|
||||
|
||||
public:
|
||||
@@ -281,42 +281,42 @@ private:
|
||||
{
|
||||
private:
|
||||
limb_type* data;
|
||||
unsigned capacity;
|
||||
unsigned allocated;
|
||||
std::size_t capacity;
|
||||
std::size_t allocated;
|
||||
bool is_alias;
|
||||
allocator_type& allocator() noexcept { return boost::multiprecision::detail::empty_value<allocator_type>::get(); }
|
||||
|
||||
public:
|
||||
scoped_shared_storage(const allocator_type& a, unsigned len)
|
||||
scoped_shared_storage(const allocator_type& a, std::size_t len)
|
||||
: boost::multiprecision::detail::empty_value<allocator_type>(boost::multiprecision::detail::empty_init_t(), a), capacity(len), allocated(0), is_alias(false)
|
||||
{
|
||||
data = allocator().allocate(len);
|
||||
}
|
||||
scoped_shared_storage(const cpp_int_base& i, unsigned len)
|
||||
scoped_shared_storage(const cpp_int_base& i, std::size_t len)
|
||||
: boost::multiprecision::detail::empty_value<allocator_type>(boost::multiprecision::detail::empty_init_t(), i.allocator()), capacity(len), allocated(0), is_alias(false)
|
||||
{
|
||||
data = allocator().allocate(len);
|
||||
}
|
||||
scoped_shared_storage(limb_type* limbs, unsigned n) : data(limbs), capacity(n), allocated(0), is_alias(true) {}
|
||||
scoped_shared_storage(limb_type* limbs, std::size_t n) : data(limbs), capacity(n), allocated(0), is_alias(true) {}
|
||||
~scoped_shared_storage()
|
||||
{
|
||||
if(!is_alias)
|
||||
allocator().deallocate(data, capacity);
|
||||
}
|
||||
limb_type* allocate(unsigned n) noexcept
|
||||
limb_type* allocate(std::size_t n) noexcept
|
||||
{
|
||||
limb_type* result = data + allocated;
|
||||
allocated += n;
|
||||
BOOST_MP_ASSERT(allocated <= capacity);
|
||||
return result;
|
||||
}
|
||||
void deallocate(unsigned n)
|
||||
void deallocate(std::size_t n)
|
||||
{
|
||||
BOOST_MP_ASSERT(n <= allocated);
|
||||
allocated -= n;
|
||||
}
|
||||
};
|
||||
explicit constexpr cpp_int_base(limb_type* data, unsigned offset, unsigned len) noexcept
|
||||
explicit constexpr cpp_int_base(limb_type* data, std::size_t offset, std::size_t len) noexcept
|
||||
: m_data(data + offset, len),
|
||||
m_limbs(len),
|
||||
m_sign(false),
|
||||
@@ -325,13 +325,13 @@ private:
|
||||
// This next constructor is for constructing const objects from const limb_type*'s only.
|
||||
// Unfortunately we appear to have no way to assert that within the language, and the const_cast
|
||||
// is a side effect of that :(
|
||||
explicit constexpr cpp_int_base(const limb_type* data, unsigned offset, unsigned len) noexcept
|
||||
explicit constexpr cpp_int_base(const limb_type* data, std::size_t offset, std::size_t len) noexcept
|
||||
: m_data(const_cast<limb_type*>(data) + offset, len),
|
||||
m_limbs(len),
|
||||
m_sign(false),
|
||||
m_internal(false),
|
||||
m_alias(true) {}
|
||||
explicit cpp_int_base(scoped_shared_storage& data, unsigned len) noexcept
|
||||
explicit cpp_int_base(scoped_shared_storage& data, std::size_t len) noexcept
|
||||
: m_data(data.allocate(len), len),
|
||||
m_limbs(len),
|
||||
m_sign(false),
|
||||
@@ -342,10 +342,10 @@ private:
|
||||
//
|
||||
BOOST_MP_FORCEINLINE allocator_type& allocator() noexcept { return base_type::get(); }
|
||||
BOOST_MP_FORCEINLINE const allocator_type& allocator() const noexcept { return base_type::get(); }
|
||||
BOOST_MP_FORCEINLINE unsigned size() const noexcept { return m_limbs; }
|
||||
BOOST_MP_FORCEINLINE std::size_t size() const noexcept { return m_limbs; }
|
||||
BOOST_MP_FORCEINLINE limb_pointer limbs() noexcept { return m_internal ? m_data.la : m_data.ld.data; }
|
||||
BOOST_MP_FORCEINLINE const_limb_pointer limbs() const noexcept { return m_internal ? m_data.la : m_data.ld.data; }
|
||||
BOOST_MP_FORCEINLINE unsigned capacity() const noexcept { return m_internal ? internal_limb_count : m_data.ld.capacity; }
|
||||
BOOST_MP_FORCEINLINE std::size_t capacity() const noexcept { return m_internal ? internal_limb_count : m_data.ld.capacity; }
|
||||
BOOST_MP_FORCEINLINE bool sign() const noexcept { return m_sign; }
|
||||
void sign(bool b) noexcept
|
||||
{
|
||||
@@ -357,15 +357,15 @@ private:
|
||||
m_sign = false;
|
||||
}
|
||||
}
|
||||
void resize(unsigned new_size, unsigned min_size)
|
||||
void resize(std::size_t new_size, std::size_t min_size)
|
||||
{
|
||||
constexpr const unsigned max_limbs = MaxBits / (CHAR_BIT * sizeof(limb_type)) + ((MaxBits % (CHAR_BIT * sizeof(limb_type))) ? 1 : 0);
|
||||
constexpr const std::size_t max_limbs = MaxBits / (CHAR_BIT * sizeof(limb_type)) + ((MaxBits % (CHAR_BIT * sizeof(limb_type))) ? 1 : 0);
|
||||
// We never resize beyond MaxSize:
|
||||
if (new_size > max_limbs)
|
||||
new_size = max_limbs;
|
||||
detail::verify_new_size(new_size, min_size, checked_type());
|
||||
// See if we have enough capacity already:
|
||||
unsigned cap = capacity();
|
||||
std::size_t cap = capacity();
|
||||
if (new_size > cap)
|
||||
{
|
||||
// We must not be an alias, memory allocation here defeats the whole point of aliasing:
|
||||
@@ -442,7 +442,7 @@ private:
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_int_check_type Checked2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_int_check_type Checked2>
|
||||
cpp_int_base& operator=(cpp_int_base<MinBits2, MaxBits2, signed_magnitude, Checked2, Allocator>&& o) noexcept
|
||||
{
|
||||
if(o.m_internal)
|
||||
@@ -509,16 +509,16 @@ private:
|
||||
void check_in_range(const A&) noexcept {}
|
||||
};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
const unsigned cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>::limb_bits;
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
const std::size_t cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>::limb_bits;
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
const limb_type cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>::max_limb_value;
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
const limb_type cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>::sign_bit_mask;
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
const unsigned cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>::internal_limb_count;
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
const std::size_t cpp_int_base<MinBits, MaxBits, signed_magnitude, Checked, Allocator, false>::internal_limb_count;
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
struct cpp_int_base<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator, false>
|
||||
: private boost::multiprecision::detail::empty_value<typename detail::rebind<limb_type, Allocator>::type>
|
||||
{
|
||||
@@ -531,7 +531,7 @@ struct cpp_int_base<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator, fa
|
||||
//
|
||||
// Fixed precision (i.e. no allocator), signed-magnitude type with limb-usage count:
|
||||
//
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>
|
||||
{
|
||||
using limb_pointer = limb_type* ;
|
||||
@@ -540,8 +540,8 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>
|
||||
|
||||
struct scoped_shared_storage
|
||||
{
|
||||
BOOST_MP_CXX14_CONSTEXPR scoped_shared_storage(const cpp_int_base&, unsigned) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR void deallocate(unsigned) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR scoped_shared_storage(const cpp_int_base&, std::size_t) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR void deallocate(std::size_t) {}
|
||||
};
|
||||
|
||||
//
|
||||
@@ -550,10 +550,10 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>
|
||||
static_assert(MinBits > sizeof(double_limb_type) * CHAR_BIT, "Template parameter MinBits is inconsistent with the parameter trivial - did you mistakingly try to override the trivial parameter?");
|
||||
|
||||
public:
|
||||
static constexpr unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
static constexpr std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
static constexpr limb_type max_limb_value = ~static_cast<limb_type>(0u);
|
||||
static constexpr limb_type sign_bit_mask = static_cast<limb_type>(1u) << (limb_bits - 1);
|
||||
static constexpr unsigned internal_limb_count = MinBits / limb_bits + ((MinBits % limb_bits) ? 1 : 0);
|
||||
static constexpr std::size_t internal_limb_count = MinBits / limb_bits + ((MinBits % limb_bits) ? 1 : 0);
|
||||
static constexpr limb_type upper_limb_mask = (MinBits % limb_bits) ? (limb_type(1) << (MinBits % limb_bits)) - 1 : (~limb_type(0));
|
||||
static_assert(internal_limb_count >= 2, "A fixed precision integer type must have at least 2 limbs");
|
||||
|
||||
@@ -622,7 +622,7 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>
|
||||
: m_wrapper(i), m_limbs(1), m_sign(false) {}
|
||||
constexpr cpp_int_base(const cpp_int_base& a, const literals::detail::negate_tag&)
|
||||
: m_wrapper(a.m_wrapper), m_limbs(a.m_limbs), m_sign((a.m_limbs == 1) && (*a.limbs() == 0) ? false : !a.m_sign) {}
|
||||
explicit constexpr cpp_int_base(scoped_shared_storage&, unsigned) noexcept : m_wrapper(), m_limbs(0), m_sign(false)
|
||||
explicit constexpr cpp_int_base(scoped_shared_storage&, std::size_t) noexcept : m_wrapper(), m_limbs(0), m_sign(false)
|
||||
{}
|
||||
//
|
||||
// These are deprecated in C++20 unless we make them explicit:
|
||||
@@ -631,7 +631,7 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>
|
||||
//
|
||||
// Helper functions for getting at our internal data, and manipulating storage:
|
||||
//
|
||||
BOOST_MP_FORCEINLINE constexpr unsigned size() const noexcept { return m_limbs; }
|
||||
BOOST_MP_FORCEINLINE constexpr std::size_t size() const noexcept { return m_limbs; }
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR limb_pointer limbs() noexcept { return m_wrapper.m_data; }
|
||||
BOOST_MP_FORCEINLINE constexpr const_limb_pointer limbs() const noexcept { return m_wrapper.m_data; }
|
||||
BOOST_MP_FORCEINLINE constexpr bool sign() const noexcept { return m_sign; }
|
||||
@@ -645,7 +645,7 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>
|
||||
m_sign = false;
|
||||
}
|
||||
}
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(unsigned new_size, unsigned min_size) noexcept((Checked == unchecked))
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(std::size_t new_size, std::size_t min_size) noexcept((Checked == unchecked))
|
||||
{
|
||||
m_limbs = static_cast<std::uint16_t>((std::min)(new_size, internal_limb_count));
|
||||
detail::verify_new_size(m_limbs, min_size, checked_type());
|
||||
@@ -678,7 +678,7 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>
|
||||
#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION
|
||||
if (BOOST_MP_IS_CONST_EVALUATED(m_limbs))
|
||||
{
|
||||
for (unsigned i = 0; i < m_limbs; ++i)
|
||||
for (std::size_t i = 0; i < m_limbs; ++i)
|
||||
limbs()[i] = o.limbs()[i];
|
||||
}
|
||||
else
|
||||
@@ -703,7 +703,7 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>
|
||||
}
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void do_swap(cpp_int_base& o) noexcept
|
||||
{
|
||||
for (unsigned i = 0; i < (std::max)(size(), o.size()); ++i)
|
||||
for (std::size_t i = 0; i < (std::max)(size(), o.size()); ++i)
|
||||
std_constexpr::swap(m_wrapper.m_data[i], o.m_wrapper.m_data[i]);
|
||||
std_constexpr::swap(m_sign, o.m_sign);
|
||||
std_constexpr::swap(m_limbs, o.m_limbs);
|
||||
@@ -714,18 +714,18 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>
|
||||
BOOST_MP_CXX14_CONSTEXPR void check_in_range(const A&) noexcept {}
|
||||
};
|
||||
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
const unsigned cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>::limb_bits;
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
const std::size_t cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>::limb_bits;
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
const limb_type cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>::max_limb_value;
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
const limb_type cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>::sign_bit_mask;
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
const unsigned cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>::internal_limb_count;
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
const std::size_t cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, false>::internal_limb_count;
|
||||
//
|
||||
// Fixed precision (i.e. no allocator), unsigned type with limb-usage count:
|
||||
//
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>
|
||||
{
|
||||
using limb_pointer = limb_type* ;
|
||||
@@ -734,8 +734,8 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>
|
||||
|
||||
struct scoped_shared_storage
|
||||
{
|
||||
BOOST_MP_CXX14_CONSTEXPR scoped_shared_storage(const cpp_int_base&, unsigned) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR void deallocate(unsigned) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR scoped_shared_storage(const cpp_int_base&, std::size_t) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR void deallocate(std::size_t) {}
|
||||
};
|
||||
//
|
||||
// Interface invariants:
|
||||
@@ -743,10 +743,10 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>
|
||||
static_assert(MinBits > sizeof(double_limb_type) * CHAR_BIT, "Template parameter MinBits is inconsistent with the parameter trivial - did you mistakingly try to override the trivial parameter?");
|
||||
|
||||
public:
|
||||
static constexpr unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
static constexpr std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
static constexpr limb_type max_limb_value = ~static_cast<limb_type>(0u);
|
||||
static constexpr limb_type sign_bit_mask = static_cast<limb_type>(1u) << (limb_bits - 1);
|
||||
static constexpr unsigned internal_limb_count = MinBits / limb_bits + ((MinBits % limb_bits) ? 1 : 0);
|
||||
static constexpr std::size_t internal_limb_count = MinBits / limb_bits + ((MinBits % limb_bits) ? 1 : 0);
|
||||
static constexpr limb_type upper_limb_mask = (MinBits % limb_bits) ? (limb_type(1) << (MinBits % limb_bits)) - 1 : (~limb_type(0));
|
||||
static_assert(internal_limb_count >= 2, "A fixed precision integer type must have at least 2 limbs");
|
||||
|
||||
@@ -781,7 +781,7 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>
|
||||
constexpr data_type(literals::detail::value_pack<VALUES...>) : m_data{VALUES...}
|
||||
{}
|
||||
} m_wrapper;
|
||||
limb_type m_limbs;
|
||||
std::size_t m_limbs;
|
||||
|
||||
public:
|
||||
//
|
||||
@@ -815,12 +815,12 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>
|
||||
{}
|
||||
constexpr cpp_int_base(literals::detail::value_pack<>)
|
||||
: m_wrapper(static_cast<limb_type>(0u)), m_limbs(1) {}
|
||||
explicit constexpr cpp_int_base(scoped_shared_storage&, unsigned) noexcept : m_wrapper(), m_limbs(1)
|
||||
explicit constexpr cpp_int_base(scoped_shared_storage&, std::size_t) noexcept : m_wrapper(), m_limbs(1)
|
||||
{}
|
||||
//
|
||||
// Helper functions for getting at our internal data, and manipulating storage:
|
||||
//
|
||||
BOOST_MP_FORCEINLINE constexpr unsigned size() const noexcept { return m_limbs; }
|
||||
BOOST_MP_FORCEINLINE constexpr std::size_t size() const noexcept { return m_limbs; }
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR limb_pointer limbs() noexcept { return m_wrapper.m_data; }
|
||||
BOOST_MP_FORCEINLINE constexpr const_limb_pointer limbs() const noexcept { return m_wrapper.m_data; }
|
||||
BOOST_MP_FORCEINLINE constexpr bool sign() const noexcept { return false; }
|
||||
@@ -829,7 +829,7 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>
|
||||
if (b)
|
||||
negate();
|
||||
}
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(unsigned new_size, unsigned min_size) noexcept((Checked == unchecked))
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(std::size_t new_size, std::size_t min_size) noexcept((Checked == unchecked))
|
||||
{
|
||||
m_limbs = (std::min)(new_size, internal_limb_count);
|
||||
detail::verify_new_size(m_limbs, min_size, checked_type());
|
||||
@@ -864,7 +864,7 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>
|
||||
#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION
|
||||
if (BOOST_MP_IS_CONST_EVALUATED(m_limbs))
|
||||
{
|
||||
for (unsigned i = 0; i < m_limbs; ++i)
|
||||
for (std::size_t i = 0; i < m_limbs; ++i)
|
||||
limbs()[i] = o.limbs()[i];
|
||||
}
|
||||
else
|
||||
@@ -888,7 +888,7 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>
|
||||
if ((m_limbs == 1) && (m_wrapper.m_data[0] == 0))
|
||||
return; // negating zero is always zero, and always OK.
|
||||
check_negate(checked_type());
|
||||
unsigned i = m_limbs;
|
||||
std::size_t i = m_limbs;
|
||||
for (; i < internal_limb_count; ++i)
|
||||
m_wrapper.m_data[i] = 0;
|
||||
m_limbs = internal_limb_count;
|
||||
@@ -903,7 +903,7 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>
|
||||
}
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void do_swap(cpp_int_base& o) noexcept
|
||||
{
|
||||
for (unsigned i = 0; i < (std::max)(size(), o.size()); ++i)
|
||||
for (std::size_t i = 0; i < (std::max)(size(), o.size()); ++i)
|
||||
std_constexpr::swap(m_wrapper.m_data[i], o.m_wrapper.m_data[i]);
|
||||
std_constexpr::swap(m_limbs, o.m_limbs);
|
||||
}
|
||||
@@ -913,14 +913,14 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>
|
||||
BOOST_MP_CXX14_CONSTEXPR void check_in_range(const A&) noexcept {}
|
||||
};
|
||||
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
const unsigned cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>::limb_bits;
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
const std::size_t cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>::limb_bits;
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
const limb_type cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>::max_limb_value;
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
const limb_type cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>::sign_bit_mask;
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
const unsigned cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>::internal_limb_count;
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
const std::size_t cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, false>::internal_limb_count;
|
||||
//
|
||||
// Traits classes to figure out a native type with N bits, these vary from boost::uint_t<N> only
|
||||
// because some platforms have native integer types longer than long long, "really long long" anyone??
|
||||
@@ -943,7 +943,7 @@ struct trivial_limb_type : public trivial_limb_type_imp<N, N <= sizeof(long long
|
||||
//
|
||||
// Backend for fixed precision signed-magnitude type which will fit entirely inside a "double_limb_type":
|
||||
//
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, true>
|
||||
{
|
||||
using local_limb_type = typename trivial_limb_type<MinBits>::type;
|
||||
@@ -953,12 +953,12 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, true>
|
||||
|
||||
struct scoped_shared_storage
|
||||
{
|
||||
BOOST_MP_CXX14_CONSTEXPR scoped_shared_storage(const cpp_int_base&, unsigned) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR void deallocate(unsigned) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR scoped_shared_storage(const cpp_int_base&, std::size_t) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR void deallocate(std::size_t) {}
|
||||
};
|
||||
|
||||
protected:
|
||||
static constexpr unsigned limb_bits = sizeof(local_limb_type) * CHAR_BIT;
|
||||
static constexpr std::size_t limb_bits = sizeof(local_limb_type) * CHAR_BIT;
|
||||
static constexpr local_limb_type limb_mask = (MinBits < limb_bits) ? local_limb_type((local_limb_type(~local_limb_type(0))) >> (limb_bits - MinBits)) : local_limb_type(~local_limb_type(0));
|
||||
|
||||
private:
|
||||
@@ -1064,12 +1064,12 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, true>
|
||||
//
|
||||
BOOST_MP_CXX14_CONSTEXPR cpp_int_base& operator=(const cpp_int_base&) = default;
|
||||
|
||||
explicit constexpr cpp_int_base(scoped_shared_storage&, unsigned) noexcept : m_data(0), m_sign(false)
|
||||
explicit constexpr cpp_int_base(scoped_shared_storage&, std::size_t) noexcept : m_data(0), m_sign(false)
|
||||
{}
|
||||
//
|
||||
// Helper functions for getting at our internal data, and manipulating storage:
|
||||
//
|
||||
BOOST_MP_FORCEINLINE constexpr unsigned size() const noexcept { return 1; }
|
||||
BOOST_MP_FORCEINLINE constexpr std::size_t size() const noexcept { return 1; }
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR limb_pointer limbs() noexcept { return &m_data; }
|
||||
BOOST_MP_FORCEINLINE constexpr const_limb_pointer limbs() const noexcept { return &m_data; }
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR bool sign() const noexcept { return m_sign; }
|
||||
@@ -1082,7 +1082,7 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, true>
|
||||
m_sign = false;
|
||||
}
|
||||
}
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(unsigned /* new_size */, unsigned min_size)
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(std::size_t /* new_size */, std::size_t min_size)
|
||||
{
|
||||
detail::verify_new_size(2, min_size, checked_type());
|
||||
}
|
||||
@@ -1126,7 +1126,7 @@ struct cpp_int_base<MinBits, MinBits, signed_magnitude, Checked, void, true>
|
||||
//
|
||||
// Backend for unsigned fixed precision (i.e. no allocator) type which will fit entirely inside a "double_limb_type":
|
||||
//
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, true>
|
||||
{
|
||||
using local_limb_type = typename trivial_limb_type<MinBits>::type;
|
||||
@@ -1135,12 +1135,12 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, true>
|
||||
|
||||
struct scoped_shared_storage
|
||||
{
|
||||
BOOST_MP_CXX14_CONSTEXPR scoped_shared_storage(const cpp_int_base&, unsigned) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR void deallocate(unsigned) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR scoped_shared_storage(const cpp_int_base&, std::size_t) {}
|
||||
BOOST_MP_CXX14_CONSTEXPR void deallocate(std::size_t) {}
|
||||
};
|
||||
|
||||
private:
|
||||
static constexpr unsigned limb_bits = sizeof(local_limb_type) * CHAR_BIT;
|
||||
static constexpr std::size_t limb_bits = sizeof(local_limb_type) * CHAR_BIT;
|
||||
static constexpr local_limb_type limb_mask = limb_bits != MinBits ? static_cast<local_limb_type>(static_cast<local_limb_type>(~local_limb_type(0)) >> (limb_bits - MinBits))
|
||||
: static_cast<local_limb_type>(~local_limb_type(0));
|
||||
|
||||
@@ -1237,12 +1237,12 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, true>
|
||||
//
|
||||
BOOST_MP_CXX14_CONSTEXPR cpp_int_base& operator=(const cpp_int_base&) = default;
|
||||
|
||||
explicit constexpr cpp_int_base(scoped_shared_storage&, unsigned) noexcept : m_data(0)
|
||||
explicit constexpr cpp_int_base(scoped_shared_storage&, std::size_t) noexcept : m_data(0)
|
||||
{}
|
||||
//
|
||||
// Helper functions for getting at our internal data, and manipulating storage:
|
||||
//
|
||||
BOOST_MP_FORCEINLINE constexpr unsigned size() const noexcept { return 1; }
|
||||
BOOST_MP_FORCEINLINE constexpr std::size_t size() const noexcept { return 1; }
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR limb_pointer limbs() noexcept { return &m_data; }
|
||||
BOOST_MP_FORCEINLINE constexpr const_limb_pointer limbs() const noexcept { return &m_data; }
|
||||
BOOST_MP_FORCEINLINE constexpr bool sign() const noexcept { return false; }
|
||||
@@ -1251,7 +1251,7 @@ struct cpp_int_base<MinBits, MinBits, unsigned_magnitude, Checked, void, true>
|
||||
if (b)
|
||||
negate();
|
||||
}
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(unsigned, unsigned min_size)
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR void resize(unsigned, std::size_t min_size)
|
||||
{
|
||||
detail::verify_new_size(2, min_size, checked_type());
|
||||
}
|
||||
@@ -1304,7 +1304,7 @@ struct is_allowed_cpp_int_base_conversion : public std::conditional<
|
||||
//
|
||||
// Now the actual backend, normalising parameters passed to the base class:
|
||||
//
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
struct cpp_int_backend
|
||||
: public cpp_int_base<
|
||||
min_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value,
|
||||
@@ -1348,7 +1348,7 @@ struct cpp_int_backend
|
||||
BOOST_MP_FORCEINLINE constexpr cpp_int_backend(cpp_int_backend&& o) noexcept
|
||||
: base_type(static_cast<base_type&&>(o))
|
||||
{}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2>
|
||||
BOOST_MP_FORCEINLINE BOOST_CXX14_CONSTEXPR cpp_int_backend(cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2>&& o, typename std::enable_if<is_implicit_cpp_int_conversion<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2>, self_type>::value>::type* = nullptr) noexcept
|
||||
{
|
||||
*this = static_cast<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2>&&>(o);
|
||||
@@ -1363,15 +1363,15 @@ struct cpp_int_backend
|
||||
// Aliasing constructor: the result will alias the memory referenced, unless
|
||||
// we have fixed precision and storage, in which case we copy the memory:
|
||||
//
|
||||
explicit constexpr cpp_int_backend(limb_type* data, unsigned offset, unsigned len) noexcept
|
||||
explicit constexpr cpp_int_backend(limb_type* data, std::size_t offset, std::size_t len) noexcept
|
||||
: base_type(data, offset, len) {}
|
||||
explicit cpp_int_backend(const limb_type* data, unsigned offset, unsigned len) noexcept
|
||||
explicit cpp_int_backend(const limb_type* data, std::size_t offset, std::size_t len) noexcept
|
||||
: base_type(data, offset, len) { this->normalize(); }
|
||||
explicit constexpr cpp_int_backend(typename base_type::scoped_shared_storage& data, unsigned len) noexcept
|
||||
explicit constexpr cpp_int_backend(typename base_type::scoped_shared_storage& data, std::size_t len) noexcept
|
||||
: base_type(data, len) {}
|
||||
|
||||
private:
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR void do_assign(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other, std::integral_constant<bool, true> const&, std::integral_constant<bool, true> const&)
|
||||
{
|
||||
// Assigning trivial type to trivial type:
|
||||
@@ -1380,7 +1380,7 @@ struct cpp_int_backend
|
||||
this->sign(other.sign());
|
||||
this->normalize();
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR void do_assign(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other, std::integral_constant<bool, true> const&, std::integral_constant<bool, false> const&)
|
||||
{
|
||||
// non-trivial to trivial narrowing conversion:
|
||||
@@ -1400,7 +1400,7 @@ struct cpp_int_backend
|
||||
this->sign(other.sign());
|
||||
this->normalize();
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR void do_assign(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other, std::integral_constant<bool, false> const&, std::integral_constant<bool, true> const&)
|
||||
{
|
||||
// trivial to non-trivial, treat the trivial argument as if it were an unsigned arithmetic type, then set the sign afterwards:
|
||||
@@ -1410,22 +1410,22 @@ struct cpp_int_backend
|
||||
cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::type>(*other.limbs());
|
||||
this->sign(other.sign());
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR void do_assign(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other, std::integral_constant<bool, false> const&, std::integral_constant<bool, false> const&)
|
||||
{
|
||||
// regular non-trivial to non-trivial assign:
|
||||
this->resize(other.size(), other.size());
|
||||
|
||||
#if !defined(BOOST_MP_HAS_IS_CONSTANT_EVALUATED) && !defined(BOOST_MP_HAS_BUILTIN_IS_CONSTANT_EVALUATED) && !defined(BOOST_NO_CXX14_CONSTEXPR)
|
||||
unsigned count = (std::min)(other.size(), this->size());
|
||||
for (unsigned i = 0; i < count; ++i)
|
||||
std::size_t count = (std::min)(other.size(), this->size());
|
||||
for (std::size_t i = 0; i < count; ++i)
|
||||
this->limbs()[i] = other.limbs()[i];
|
||||
#else
|
||||
#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION
|
||||
if (BOOST_MP_IS_CONST_EVALUATED(other.size()))
|
||||
{
|
||||
unsigned count = (std::min)(other.size(), this->size());
|
||||
for (unsigned i = 0; i < count; ++i)
|
||||
std::size_t count = (std::min)(other.size(), this->size());
|
||||
for (std::size_t i = 0; i < count; ++i)
|
||||
this->limbs()[i] = other.limbs()[i];
|
||||
}
|
||||
else
|
||||
@@ -1437,7 +1437,7 @@ struct cpp_int_backend
|
||||
}
|
||||
|
||||
public:
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR cpp_int_backend(
|
||||
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other,
|
||||
typename std::enable_if<is_implicit_cpp_int_conversion<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>, self_type>::value>::type* = nullptr)
|
||||
@@ -1448,7 +1448,7 @@ struct cpp_int_backend
|
||||
std::integral_constant<bool, is_trivial_cpp_int<self_type>::value>(),
|
||||
std::integral_constant<bool, is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>());
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
explicit BOOST_MP_CXX14_CONSTEXPR cpp_int_backend(
|
||||
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other,
|
||||
typename std::enable_if< !(is_implicit_cpp_int_conversion<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>, self_type>::value)>::type* = nullptr)
|
||||
@@ -1459,7 +1459,7 @@ struct cpp_int_backend
|
||||
std::integral_constant<bool, is_trivial_cpp_int<self_type>::value>(),
|
||||
std::integral_constant<bool, is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>());
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR cpp_int_backend& operator=(
|
||||
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& other)
|
||||
{
|
||||
@@ -1484,7 +1484,7 @@ struct cpp_int_backend
|
||||
*static_cast<base_type*>(this) = static_cast<base_type&&>(o);
|
||||
return *this;
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<((MaxBits2 <= MaxBits) || (MaxBits == 0)) && !std::is_void<Allocator>::value, cpp_int_backend&>::type operator=(cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator>&& o) noexcept
|
||||
{
|
||||
*static_cast<base_type*>(this) = static_cast<typename cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2>::base_type&&>(o);
|
||||
@@ -1888,7 +1888,7 @@ struct cpp_int_backend
|
||||
base = 16;
|
||||
std::string result;
|
||||
|
||||
unsigned Bits = sizeof(typename base_type::local_limb_type) * CHAR_BIT;
|
||||
std::size_t Bits = sizeof(typename base_type::local_limb_type) * CHAR_BIT;
|
||||
|
||||
if (base == 8 || base == 16)
|
||||
{
|
||||
@@ -1900,7 +1900,7 @@ struct cpp_int_backend
|
||||
result.assign(Bits / shift + (Bits % shift ? 1 : 0), '0');
|
||||
std::string::difference_type pos = result.size() - 1;
|
||||
char letter_a = f & std::ios_base::uppercase ? 'A' : 'a';
|
||||
for (unsigned i = 0; i < Bits / shift; ++i)
|
||||
for (std::size_t i = 0; i < Bits / shift; ++i)
|
||||
{
|
||||
char c = '0' + static_cast<char>(v & mask);
|
||||
if (c > '9')
|
||||
@@ -1974,7 +1974,7 @@ struct cpp_int_backend
|
||||
base = 16;
|
||||
std::string result;
|
||||
|
||||
unsigned Bits = this->size() * base_type::limb_bits;
|
||||
std::size_t Bits = this->size() * base_type::limb_bits;
|
||||
|
||||
if (base == 8 || base == 16)
|
||||
{
|
||||
@@ -1986,7 +1986,7 @@ struct cpp_int_backend
|
||||
result.assign(Bits / shift + ((Bits % shift) ? 1 : 0), '0');
|
||||
std::string::difference_type pos = result.size() - 1;
|
||||
char letter_a = f & std::ios_base::uppercase ? 'A' : 'a';
|
||||
for (unsigned i = 0; i < Bits / shift; ++i)
|
||||
for (std::size_t i = 0; i < Bits / shift; ++i)
|
||||
{
|
||||
char c = '0' + static_cast<char>(t.limbs()[0] & mask);
|
||||
if (c > '9')
|
||||
@@ -2041,7 +2041,7 @@ struct cpp_int_backend
|
||||
divide_unsigned_helper(&t2, t, block10, r);
|
||||
t = t2;
|
||||
limb_type v = r.limbs()[0];
|
||||
for (unsigned i = 0; i < digits_per_block_10; ++i)
|
||||
for (std::size_t i = 0; i < digits_per_block_10; ++i)
|
||||
{
|
||||
char c = '0' + v % 10;
|
||||
v /= 10;
|
||||
@@ -2076,7 +2076,7 @@ struct cpp_int_backend
|
||||
//
|
||||
// We assume that c is a sequence of (unsigned) bytes with the most significant byte first:
|
||||
//
|
||||
unsigned newsize = static_cast<unsigned>(c.size() / sizeof(limb_type));
|
||||
std::size_t newsize = static_cast<unsigned>(c.size() / sizeof(limb_type));
|
||||
if (c.size() % sizeof(limb_type))
|
||||
{
|
||||
++newsize;
|
||||
@@ -2086,11 +2086,11 @@ struct cpp_int_backend
|
||||
this->resize(newsize, newsize); // May throw
|
||||
std::memset(this->limbs(), 0, this->size());
|
||||
typename Container::const_iterator i(c.begin()), j(c.end());
|
||||
unsigned byte_location = static_cast<unsigned>(c.size() - 1);
|
||||
std::size_t byte_location = static_cast<unsigned>(c.size() - 1);
|
||||
while (i != j)
|
||||
{
|
||||
unsigned limb = byte_location / sizeof(limb_type);
|
||||
unsigned shift = (byte_location % sizeof(limb_type)) * CHAR_BIT;
|
||||
std::size_t limb = byte_location / sizeof(limb_type);
|
||||
std::size_t shift = (byte_location % sizeof(limb_type)) * CHAR_BIT;
|
||||
if (this->size() > limb)
|
||||
this->limbs()[limb] |= static_cast<limb_type>(static_cast<unsigned char>(*i)) << shift;
|
||||
++i;
|
||||
@@ -2109,11 +2109,11 @@ struct cpp_int_backend
|
||||
if (c.size())
|
||||
{
|
||||
typename Container::const_iterator i(c.begin()), j(c.end());
|
||||
unsigned byte_location = static_cast<unsigned>(c.size() - 1);
|
||||
std::size_t byte_location = static_cast<unsigned>(c.size() - 1);
|
||||
while (i != j)
|
||||
{
|
||||
unsigned limb = byte_location / sizeof(local_limb_type);
|
||||
unsigned shift = (byte_location % sizeof(local_limb_type)) * CHAR_BIT;
|
||||
std::size_t limb = byte_location / sizeof(local_limb_type);
|
||||
std::size_t shift = (byte_location % sizeof(local_limb_type)) * CHAR_BIT;
|
||||
if (limb == 0)
|
||||
this->limbs()[0] |= static_cast<limb_type>(static_cast<unsigned char>(*i)) << shift;
|
||||
++i;
|
||||
@@ -2131,7 +2131,7 @@ struct cpp_int_backend
|
||||
//
|
||||
construct_from_container(c, trivial_tag());
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR int compare_imp(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&) const noexcept
|
||||
{
|
||||
if (this->sign() != o.sign())
|
||||
@@ -2144,19 +2144,19 @@ struct cpp_int_backend
|
||||
result = -result;
|
||||
return result;
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR int compare_imp(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&) const
|
||||
{
|
||||
cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> t(*this);
|
||||
return t.compare(o);
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR int compare_imp(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&) const
|
||||
{
|
||||
cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> t(o);
|
||||
return compare(t);
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR int compare_imp(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&) const noexcept
|
||||
{
|
||||
if (this->sign())
|
||||
@@ -2175,14 +2175,14 @@ struct cpp_int_backend
|
||||
return *this->limbs() < *o.limbs() ? -1 : (*this->limbs() > *o.limbs() ? 1 : 0);
|
||||
}
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR int compare(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) const noexcept
|
||||
{
|
||||
using t1 = std::integral_constant<bool, is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value> ;
|
||||
using t2 = std::integral_constant<bool, is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>;
|
||||
return compare_imp(o, t1(), t2());
|
||||
}
|
||||
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR int compare_unsigned(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) const noexcept
|
||||
{
|
||||
if (this->size() != o.size())
|
||||
@@ -2191,7 +2191,7 @@ struct cpp_int_backend
|
||||
}
|
||||
typename base_type::const_limb_pointer pa = this->limbs();
|
||||
typename base_type::const_limb_pointer pb = o.limbs();
|
||||
for (int i = this->size() - 1; i >= 0; --i)
|
||||
for (std::ptrdiff_t i = this->size() - 1; i >= 0; --i)
|
||||
{
|
||||
if (pa[i] != pb[i])
|
||||
return pa[i] > pb[i] ? 1 : -1;
|
||||
@@ -2215,7 +2215,7 @@ namespace default_ops {
|
||||
template <class Backend>
|
||||
struct double_precision_type;
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
struct double_precision_type<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >
|
||||
{
|
||||
using type = typename std::conditional<
|
||||
@@ -2232,11 +2232,11 @@ struct double_precision_type<backends::cpp_int_backend<MinBits, MaxBits, SignTyp
|
||||
|
||||
} // namespace default_ops
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
struct is_equivalent_number_type<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, backends::cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >
|
||||
: public std::integral_constant<bool, std::numeric_limits<number<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, et_on> >::digits == std::numeric_limits<number<backends::cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>, et_on> >::digits>{};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked>
|
||||
struct expression_template_default<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, void> >
|
||||
{
|
||||
static constexpr const expression_template_option value = et_off;
|
||||
@@ -2244,7 +2244,7 @@ struct expression_template_default<backends::cpp_int_backend<MinBits, MaxBits, S
|
||||
|
||||
using boost::multiprecision::backends::cpp_int_backend;
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
struct number_category<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> > : public std::integral_constant<int, number_kind_integer>
|
||||
{};
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void add_unsigned(CppInt1& result, const CppInt2
|
||||
double_limb_type carry = o;
|
||||
typename CppInt1::limb_pointer pr = result.limbs();
|
||||
typename CppInt2::const_limb_pointer pa = a.limbs();
|
||||
unsigned i = 0;
|
||||
std::size_t i = 0;
|
||||
// Addition with carry until we either run out of digits or carry is zero:
|
||||
for (; carry && (i < result.size()); ++i)
|
||||
{
|
||||
@@ -46,7 +46,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void add_unsigned(CppInt1& result, const CppInt2
|
||||
if (carry)
|
||||
{
|
||||
// We overflowed, need to add one more limb:
|
||||
unsigned x = result.size();
|
||||
std::size_t x = result.size();
|
||||
result.resize(x + 1, x + 1);
|
||||
if (result.size() > x)
|
||||
result.limbs()[x] = static_cast<limb_type>(carry);
|
||||
@@ -87,7 +87,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void subtract_unsigned(CppInt1& result, const Cp
|
||||
else
|
||||
{
|
||||
*pr = static_cast<limb_type>((borrow + *pa) - b);
|
||||
unsigned i = 1;
|
||||
std::size_t i = 1;
|
||||
while (!pa[i])
|
||||
{
|
||||
pr[i] = CppInt1::max_limb_value;
|
||||
@@ -107,7 +107,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void subtract_unsigned(CppInt1& result, const Cp
|
||||
//
|
||||
// Now the actual functions called by the front end, all of which forward to one of the above:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_add(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -115,7 +115,7 @@ eval_add(
|
||||
{
|
||||
eval_add(result, result, o);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, unsigned MinBits3, unsigned MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type
|
||||
eval_add(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -129,7 +129,7 @@ eval_add(
|
||||
}
|
||||
add_unsigned(result, a, b);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_add(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const limb_type& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
||||
{
|
||||
@@ -140,7 +140,7 @@ eval_add(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& r
|
||||
else
|
||||
add_unsigned(result, result, o);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_add(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -154,7 +154,7 @@ eval_add(
|
||||
else
|
||||
add_unsigned(result, a, o);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_add(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -165,7 +165,7 @@ eval_add(
|
||||
else if (o > 0)
|
||||
eval_add(result, static_cast<limb_type>(o));
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_add(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -179,7 +179,7 @@ eval_add(
|
||||
else if (&result != &a)
|
||||
result = a;
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_subtract(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -192,7 +192,7 @@ eval_subtract(
|
||||
else
|
||||
subtract_unsigned(result, result, o);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_subtract(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -208,7 +208,7 @@ eval_subtract(
|
||||
subtract_unsigned(result, a, o);
|
||||
}
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_subtract(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -222,7 +222,7 @@ eval_subtract(
|
||||
eval_subtract(result, static_cast<limb_type>(o));
|
||||
}
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_subtract(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -240,7 +240,7 @@ eval_subtract(
|
||||
result = a;
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_increment(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
||||
{
|
||||
@@ -257,7 +257,7 @@ eval_increment(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocato
|
||||
else
|
||||
eval_add(result, one);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_decrement(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
||||
{
|
||||
@@ -270,7 +270,7 @@ eval_decrement(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocato
|
||||
else
|
||||
eval_subtract(result, one);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_subtract(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -278,7 +278,7 @@ eval_subtract(
|
||||
{
|
||||
eval_subtract(result, result, o);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, unsigned MinBits3, unsigned MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type
|
||||
eval_subtract(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -298,7 +298,7 @@ eval_subtract(
|
||||
//
|
||||
// One of the arguments is signed:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)>::type
|
||||
eval_add(
|
||||
@@ -320,7 +320,7 @@ eval_add(
|
||||
result.normalize();
|
||||
}
|
||||
// Simple version for two unsigned arguments:
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_add(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -331,7 +331,7 @@ eval_add(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&
|
||||
}
|
||||
|
||||
// signed subtraction:
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)>::type
|
||||
eval_subtract(
|
||||
@@ -352,7 +352,7 @@ eval_subtract(
|
||||
result.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_subtract(
|
||||
|
||||
@@ -22,9 +22,9 @@ inline BOOST_MP_CXX14_CONSTEXPR void add_unsigned_constexpr(CppInt1& result, con
|
||||
// Nothing fancy, just let uintmax_t take the strain:
|
||||
//
|
||||
double_limb_type carry = 0;
|
||||
unsigned m(0), x(0);
|
||||
unsigned as = a.size();
|
||||
unsigned bs = b.size();
|
||||
std::size_t m(0), x(0);
|
||||
std::size_t as = a.size();
|
||||
std::size_t bs = b.size();
|
||||
minmax(as, bs, m, x);
|
||||
if (x == 1)
|
||||
{
|
||||
@@ -96,7 +96,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void subtract_unsigned_constexpr(CppInt1& result
|
||||
// Nothing fancy, just let uintmax_t take the strain:
|
||||
//
|
||||
double_limb_type borrow = 0;
|
||||
unsigned m(0), x(0);
|
||||
std::size_t m(0), x(0);
|
||||
minmax(a.size(), b.size(), m, x);
|
||||
//
|
||||
// special cases for small limb counts:
|
||||
@@ -136,7 +136,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void subtract_unsigned_constexpr(CppInt1& result
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned i = 0;
|
||||
std::size_t i = 0;
|
||||
// First where a and b overlap:
|
||||
while (i < m)
|
||||
{
|
||||
@@ -199,9 +199,9 @@ inline BOOST_MP_CXX14_CONSTEXPR void add_unsigned(CppInt1& result, const CppInt2
|
||||
using std::swap;
|
||||
|
||||
// Nothing fancy, just let uintmax_t take the strain:
|
||||
unsigned m(0), x(0);
|
||||
unsigned as = a.size();
|
||||
unsigned bs = b.size();
|
||||
std::size_t m(0), x(0);
|
||||
std::size_t as = a.size();
|
||||
std::size_t bs = b.size();
|
||||
minmax(as, bs, m, x);
|
||||
if (x == 1)
|
||||
{
|
||||
@@ -218,7 +218,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void add_unsigned(CppInt1& result, const CppInt2
|
||||
if (as < bs)
|
||||
swap(pa, pb);
|
||||
// First where a and b overlap:
|
||||
unsigned i = 0;
|
||||
std::size_t i = 0;
|
||||
unsigned char carry = 0;
|
||||
#if defined(BOOST_MSVC) && !defined(BOOST_HAS_INT128) && defined(_M_X64)
|
||||
//
|
||||
@@ -273,7 +273,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void subtract_unsigned(CppInt1& result, const Cp
|
||||
using std::swap;
|
||||
|
||||
// Nothing fancy, just let uintmax_t take the strain:
|
||||
unsigned m(0), x(0);
|
||||
std::size_t m(0), x(0);
|
||||
minmax(a.size(), b.size(), m, x);
|
||||
//
|
||||
// special cases for small limb counts:
|
||||
@@ -313,7 +313,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void subtract_unsigned(CppInt1& result, const Cp
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned i = 0;
|
||||
std::size_t i = 0;
|
||||
unsigned char borrow = 0;
|
||||
// First where a and b overlap:
|
||||
#if defined(BOOST_MSVC) && !defined(BOOST_HAS_INT128) && defined(_M_X64)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
namespace boost { namespace multiprecision { namespace backends {
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<int, checked>&)
|
||||
@@ -30,12 +30,12 @@ BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
||||
BOOST_MP_THROW_EXCEPTION(std::range_error("Bitwise operations on negative values results in undefined behavior."));
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&,
|
||||
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>&, const std::integral_constant<int, unchecked>&) {}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
||||
const cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>& result, const std::integral_constant<int, checked>&)
|
||||
{
|
||||
@@ -43,11 +43,11 @@ BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
||||
BOOST_MP_THROW_EXCEPTION(std::range_error("Bitwise operations on negative values results in undefined behavior."));
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
||||
const cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>&, const std::integral_constant<int, checked>&) {}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&, const std::integral_constant<int, unchecked>&) {}
|
||||
|
||||
@@ -74,14 +74,14 @@ BOOST_MP_CXX14_CONSTEXPR void bitwise_op(
|
||||
//
|
||||
// First figure out how big the result needs to be and set up some data:
|
||||
//
|
||||
unsigned rs = result.size();
|
||||
unsigned os = o.size();
|
||||
unsigned m(0), x(0);
|
||||
std::size_t rs = result.size();
|
||||
std::size_t os = o.size();
|
||||
std::size_t m(0), x(0);
|
||||
minmax(rs, os, m, x);
|
||||
result.resize(x, x);
|
||||
typename CppInt1::limb_pointer pr = result.limbs();
|
||||
typename CppInt2::const_limb_pointer po = o.limbs();
|
||||
for (unsigned i = rs; i < x; ++i)
|
||||
for (std::size_t i = rs; i < x; ++i)
|
||||
pr[i] = 0;
|
||||
|
||||
limb_type next_limb = 0;
|
||||
@@ -90,22 +90,22 @@ BOOST_MP_CXX14_CONSTEXPR void bitwise_op(
|
||||
{
|
||||
if (!o.sign())
|
||||
{
|
||||
for (unsigned i = 0; i < os; ++i)
|
||||
for (std::size_t i = 0; i < os; ++i)
|
||||
pr[i] = op(pr[i], po[i]);
|
||||
for (unsigned i = os; i < x; ++i)
|
||||
for (std::size_t i = os; i < x; ++i)
|
||||
pr[i] = op(pr[i], limb_type(0));
|
||||
}
|
||||
else
|
||||
{
|
||||
// "o" is negative:
|
||||
double_limb_type carry = 1;
|
||||
for (unsigned i = 0; i < os; ++i)
|
||||
for (std::size_t i = 0; i < os; ++i)
|
||||
{
|
||||
carry += static_cast<double_limb_type>(~po[i]);
|
||||
pr[i] = op(pr[i], static_cast<limb_type>(carry));
|
||||
carry >>= CppInt1::limb_bits;
|
||||
}
|
||||
for (unsigned i = os; i < x; ++i)
|
||||
for (std::size_t i = os; i < x; ++i)
|
||||
{
|
||||
carry += static_cast<double_limb_type>(~limb_type(0));
|
||||
pr[i] = op(pr[i], static_cast<limb_type>(carry));
|
||||
@@ -122,13 +122,13 @@ BOOST_MP_CXX14_CONSTEXPR void bitwise_op(
|
||||
{
|
||||
// "result" is negative:
|
||||
double_limb_type carry = 1;
|
||||
for (unsigned i = 0; i < os; ++i)
|
||||
for (std::size_t i = 0; i < os; ++i)
|
||||
{
|
||||
carry += static_cast<double_limb_type>(~pr[i]);
|
||||
pr[i] = op(static_cast<limb_type>(carry), po[i]);
|
||||
carry >>= CppInt1::limb_bits;
|
||||
}
|
||||
for (unsigned i = os; i < x; ++i)
|
||||
for (std::size_t i = os; i < x; ++i)
|
||||
{
|
||||
carry += static_cast<double_limb_type>(~pr[i]);
|
||||
pr[i] = op(static_cast<limb_type>(carry), limb_type(0));
|
||||
@@ -143,7 +143,7 @@ BOOST_MP_CXX14_CONSTEXPR void bitwise_op(
|
||||
// both are negative:
|
||||
double_limb_type r_carry = 1;
|
||||
double_limb_type o_carry = 1;
|
||||
for (unsigned i = 0; i < os; ++i)
|
||||
for (std::size_t i = 0; i < os; ++i)
|
||||
{
|
||||
r_carry += static_cast<double_limb_type>(~pr[i]);
|
||||
o_carry += static_cast<double_limb_type>(~po[i]);
|
||||
@@ -151,7 +151,7 @@ BOOST_MP_CXX14_CONSTEXPR void bitwise_op(
|
||||
r_carry >>= CppInt1::limb_bits;
|
||||
o_carry >>= CppInt1::limb_bits;
|
||||
}
|
||||
for (unsigned i = os; i < x; ++i)
|
||||
for (std::size_t i = os; i < x; ++i)
|
||||
{
|
||||
r_carry += static_cast<double_limb_type>(~pr[i]);
|
||||
o_carry += static_cast<double_limb_type>(~limb_type(0));
|
||||
@@ -171,7 +171,7 @@ BOOST_MP_CXX14_CONSTEXPR void bitwise_op(
|
||||
if (static_cast<signed_limb_type>(next_limb) < 0)
|
||||
{
|
||||
double_limb_type carry = 1;
|
||||
for (unsigned i = 0; i < x; ++i)
|
||||
for (std::size_t i = 0; i < x; ++i)
|
||||
{
|
||||
carry += static_cast<double_limb_type>(~pr[i]);
|
||||
pr[i] = static_cast<limb_type>(carry);
|
||||
@@ -202,19 +202,19 @@ BOOST_MP_CXX14_CONSTEXPR void bitwise_op(
|
||||
//
|
||||
// First figure out how big the result needs to be and set up some data:
|
||||
//
|
||||
unsigned rs = result.size();
|
||||
unsigned os = o.size();
|
||||
unsigned m(0), x(0);
|
||||
std::size_t rs = result.size();
|
||||
std::size_t os = o.size();
|
||||
std::size_t m(0), x(0);
|
||||
minmax(rs, os, m, x);
|
||||
result.resize(x, x);
|
||||
typename CppInt1::limb_pointer pr = result.limbs();
|
||||
typename CppInt2::const_limb_pointer po = o.limbs();
|
||||
for (unsigned i = rs; i < x; ++i)
|
||||
for (std::size_t i = rs; i < x; ++i)
|
||||
pr[i] = 0;
|
||||
|
||||
for (unsigned i = 0; i < os; ++i)
|
||||
for (std::size_t i = 0; i < os; ++i)
|
||||
pr[i] = op(pr[i], po[i]);
|
||||
for (unsigned i = os; i < x; ++i)
|
||||
for (std::size_t i = os; i < x; ++i)
|
||||
pr[i] = op(pr[i], limb_type(0));
|
||||
|
||||
result.normalize();
|
||||
@@ -233,7 +233,7 @@ struct bit_xor
|
||||
BOOST_MP_CXX14_CONSTEXPR limb_type operator()(limb_type a, limb_type b) const noexcept { return a ^ b; }
|
||||
};
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_bitwise_and(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -243,7 +243,7 @@ eval_bitwise_and(
|
||||
std::integral_constant<bool, std::numeric_limits<number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> > >::is_signed || std::numeric_limits<number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> > >::is_signed > ());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_bitwise_or(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -253,7 +253,7 @@ eval_bitwise_or(
|
||||
std::integral_constant<bool, std::numeric_limits<number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> > >::is_signed || std::numeric_limits<number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> > >::is_signed > ());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_bitwise_xor(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -265,7 +265,7 @@ eval_bitwise_xor(
|
||||
//
|
||||
// Again for operands which are single limbs:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type
|
||||
eval_bitwise_and(
|
||||
cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,
|
||||
@@ -275,7 +275,7 @@ eval_bitwise_and(
|
||||
result.resize(1, 1);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type
|
||||
eval_bitwise_or(
|
||||
cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,
|
||||
@@ -284,7 +284,7 @@ eval_bitwise_or(
|
||||
result.limbs()[0] |= l;
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type
|
||||
eval_bitwise_xor(
|
||||
cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,
|
||||
@@ -293,7 +293,7 @@ eval_bitwise_xor(
|
||||
result.limbs()[0] ^= l;
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_complement(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -306,17 +306,17 @@ eval_complement(
|
||||
result.negate();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_complement(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
||||
{
|
||||
unsigned os = o.size();
|
||||
std::size_t os = o.size();
|
||||
result.resize(UINT_MAX, os);
|
||||
for (unsigned i = 0; i < os; ++i)
|
||||
for (std::size_t i = 0; i < os; ++i)
|
||||
result.limbs()[i] = ~o.limbs()[i];
|
||||
for (unsigned i = os; i < result.size(); ++i)
|
||||
for (std::size_t i = os; i < result.size(); ++i)
|
||||
result.limbs()[i] = ~static_cast<limb_type>(0);
|
||||
result.normalize();
|
||||
}
|
||||
@@ -326,10 +326,10 @@ inline void left_shift_byte(Int& result, double_limb_type s)
|
||||
{
|
||||
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
||||
limb_type shift = static_cast<limb_type>(s % Int::limb_bits);
|
||||
unsigned ors = result.size();
|
||||
std::size_t ors = result.size();
|
||||
if ((ors == 1) && (!*result.limbs()))
|
||||
return; // shifting zero yields zero.
|
||||
unsigned rs = ors;
|
||||
std::size_t rs = ors;
|
||||
if (shift && (result.limbs()[ors - 1] >> (Int::limb_bits - shift)))
|
||||
++rs; // Most significant limb will overflow when shifted
|
||||
rs += offset;
|
||||
@@ -358,10 +358,10 @@ inline BOOST_MP_CXX14_CONSTEXPR void left_shift_limb(Int& result, double_limb_ty
|
||||
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
||||
limb_type shift = static_cast<limb_type>(s % Int::limb_bits);
|
||||
|
||||
unsigned ors = result.size();
|
||||
std::size_t ors = result.size();
|
||||
if ((ors == 1) && (!*result.limbs()))
|
||||
return; // shifting zero yields zero.
|
||||
unsigned rs = ors;
|
||||
std::size_t rs = ors;
|
||||
if (shift && (result.limbs()[ors - 1] >> (Int::limb_bits - shift)))
|
||||
++rs; // Most significant limb will overflow when shifted
|
||||
rs += offset;
|
||||
@@ -376,7 +376,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void left_shift_limb(Int& result, double_limb_ty
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned i = rs - result.size();
|
||||
std::size_t i = rs - result.size();
|
||||
for (; i < ors; ++i)
|
||||
pr[rs - 1 - i] = pr[ors - 1 - i];
|
||||
for (; i < rs; ++i)
|
||||
@@ -389,10 +389,10 @@ inline BOOST_MP_CXX14_CONSTEXPR void left_shift_generic(Int& result, double_limb
|
||||
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
||||
limb_type shift = static_cast<limb_type>(s % Int::limb_bits);
|
||||
|
||||
unsigned ors = result.size();
|
||||
std::size_t ors = result.size();
|
||||
if ((ors == 1) && (!*result.limbs()))
|
||||
return; // shifting zero yields zero.
|
||||
unsigned rs = ors;
|
||||
std::size_t rs = ors;
|
||||
if (shift && (result.limbs()[ors - 1] >> (Int::limb_bits - shift)))
|
||||
++rs; // Most significant limb will overflow when shifted
|
||||
rs += offset;
|
||||
@@ -408,7 +408,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void left_shift_generic(Int& result, double_limb
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned i = rs - result.size();
|
||||
std::size_t i = rs - result.size();
|
||||
// This code only works when shift is non-zero, otherwise we invoke undefined behaviour!
|
||||
BOOST_MP_ASSERT(shift);
|
||||
if (!truncated)
|
||||
@@ -440,7 +440,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void left_shift_generic(Int& result, double_limb
|
||||
pr[rs - 1 - i] = 0;
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_left_shift(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -503,8 +503,8 @@ inline void right_shift_byte(Int& result, double_limb_type s)
|
||||
{
|
||||
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
||||
BOOST_MP_ASSERT((s % CHAR_BIT) == 0);
|
||||
unsigned ors = result.size();
|
||||
unsigned rs = ors;
|
||||
std::size_t ors = result.size();
|
||||
std::size_t rs = ors;
|
||||
if (offset >= rs)
|
||||
{
|
||||
result = limb_type(0);
|
||||
@@ -530,8 +530,8 @@ inline BOOST_MP_CXX14_CONSTEXPR void right_shift_limb(Int& result, double_limb_t
|
||||
{
|
||||
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
||||
BOOST_MP_ASSERT((s % Int::limb_bits) == 0);
|
||||
unsigned ors = result.size();
|
||||
unsigned rs = ors;
|
||||
std::size_t ors = result.size();
|
||||
std::size_t rs = ors;
|
||||
if (offset >= rs)
|
||||
{
|
||||
result = limb_type(0);
|
||||
@@ -539,7 +539,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void right_shift_limb(Int& result, double_limb_t
|
||||
}
|
||||
rs -= offset;
|
||||
typename Int::limb_pointer pr = result.limbs();
|
||||
unsigned i = 0;
|
||||
std::size_t i = 0;
|
||||
for (; i < rs; ++i)
|
||||
pr[i] = pr[i + offset];
|
||||
result.resize(rs, rs);
|
||||
@@ -550,8 +550,8 @@ inline BOOST_MP_CXX14_CONSTEXPR void right_shift_generic(Int& result, double_lim
|
||||
{
|
||||
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
||||
limb_type shift = static_cast<limb_type>(s % Int::limb_bits);
|
||||
unsigned ors = result.size();
|
||||
unsigned rs = ors;
|
||||
std::size_t ors = result.size();
|
||||
std::size_t rs = ors;
|
||||
if (offset >= rs)
|
||||
{
|
||||
result = limb_type(0);
|
||||
@@ -567,7 +567,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void right_shift_generic(Int& result, double_lim
|
||||
return;
|
||||
}
|
||||
}
|
||||
unsigned i = 0;
|
||||
std::size_t i = 0;
|
||||
|
||||
// This code only works for non-zero shift, otherwise we invoke undefined behaviour!
|
||||
BOOST_MP_ASSERT(shift);
|
||||
@@ -580,7 +580,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void right_shift_generic(Int& result, double_lim
|
||||
result.resize(rs, rs);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type
|
||||
eval_right_shift(
|
||||
cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,
|
||||
@@ -623,7 +623,7 @@ eval_right_shift(
|
||||
else
|
||||
right_shift_generic(result, s);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1> >::value>::type
|
||||
eval_right_shift(
|
||||
cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>& result,
|
||||
@@ -676,7 +676,7 @@ eval_right_shift(
|
||||
//
|
||||
// Over again for trivial cpp_int's:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class T>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class T>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value >::type
|
||||
eval_left_shift(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, T s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
||||
{
|
||||
@@ -685,7 +685,7 @@ eval_left_shift(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocat
|
||||
result.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class T>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class T>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value >::type
|
||||
eval_right_shift(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, T s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
||||
{
|
||||
@@ -696,7 +696,7 @@ eval_right_shift(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Alloca
|
||||
result = static_cast<signed_limb_type>(-1);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type
|
||||
eval_complement(
|
||||
@@ -720,7 +720,7 @@ eval_complement(
|
||||
result.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_complement(
|
||||
@@ -731,7 +731,7 @@ eval_complement(
|
||||
result.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_bitwise_and(
|
||||
@@ -741,7 +741,7 @@ eval_bitwise_and(
|
||||
*result.limbs() &= *o.limbs();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type
|
||||
eval_bitwise_and(
|
||||
@@ -755,7 +755,7 @@ eval_bitwise_and(
|
||||
|
||||
if (result.sign() || o.sign())
|
||||
{
|
||||
constexpr const unsigned m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;
|
||||
constexpr const std::size_t m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;
|
||||
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t1(result);
|
||||
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t2(o);
|
||||
eval_bitwise_and(t1, t2);
|
||||
@@ -774,7 +774,7 @@ eval_bitwise_and(
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_bitwise_or(
|
||||
@@ -784,7 +784,7 @@ eval_bitwise_or(
|
||||
*result.limbs() |= *o.limbs();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type
|
||||
eval_bitwise_or(
|
||||
@@ -798,7 +798,7 @@ eval_bitwise_or(
|
||||
|
||||
if (result.sign() || o.sign())
|
||||
{
|
||||
constexpr const unsigned m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;
|
||||
constexpr const std::size_t m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;
|
||||
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t1(result);
|
||||
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t2(o);
|
||||
eval_bitwise_or(t1, t2);
|
||||
@@ -818,7 +818,7 @@ eval_bitwise_or(
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_bitwise_xor(
|
||||
@@ -828,7 +828,7 @@ eval_bitwise_xor(
|
||||
*result.limbs() ^= *o.limbs();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type
|
||||
eval_bitwise_xor(
|
||||
@@ -842,7 +842,7 @@ eval_bitwise_xor(
|
||||
|
||||
if (result.sign() || o.sign())
|
||||
{
|
||||
constexpr const unsigned m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;
|
||||
constexpr const std::size_t m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;
|
||||
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t1(result);
|
||||
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t2(o);
|
||||
eval_bitwise_xor(t1, t2);
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace boost { namespace multiprecision { namespace backends {
|
||||
//
|
||||
// Start with non-trivial cpp_int's:
|
||||
//
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -28,7 +28,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& a
|
||||
{
|
||||
return (a.sign() == b.sign()) && (a.size() == b.size()) && std_constexpr::equal(a.limbs(), a.limbs() + a.size(), b.limbs());
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value,
|
||||
bool>::type
|
||||
@@ -36,7 +36,7 @@ eval_eq(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator
|
||||
{
|
||||
return (a.sign() == b.sign()) && (a.size() == b.size()) && std_constexpr::equal(a.limbs(), a.limbs() + a.size(), b.limbs());
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -44,7 +44,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Alloc
|
||||
{
|
||||
return (a.sign() == false) && (a.size() == 1) && (*a.limbs() == b);
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -52,7 +52,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Alloc
|
||||
{
|
||||
return (a.sign() == (b < 0)) && (a.size() == 1) && (*a.limbs() == boost::multiprecision::detail::unsigned_abs(b));
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -60,7 +60,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, All
|
||||
{
|
||||
return (a.size() == 1) && (*a.limbs() == b);
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -69,7 +69,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, All
|
||||
return (b < 0) ? eval_eq(a, cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>(b)) : eval_eq(a, static_cast<limb_type>(b)); // Use bit pattern of b for comparison
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -81,7 +81,7 @@ eval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Alloc
|
||||
return false;
|
||||
return *a.limbs() < b;
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -103,7 +103,7 @@ eval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Alloc
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -113,7 +113,7 @@ eval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, All
|
||||
return false;
|
||||
return *a.limbs() < b;
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -122,7 +122,7 @@ eval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, All
|
||||
return (b < 0) ? a.compare(b) < 0 : eval_lt(a, static_cast<limb_type>(b)); // Use bit pattern of b for comparison
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -134,7 +134,7 @@ eval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Alloc
|
||||
return true;
|
||||
return *a.limbs() > b;
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -158,7 +158,7 @@ eval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Alloc
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -168,7 +168,7 @@ eval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, All
|
||||
return true;
|
||||
return *a.limbs() > b;
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
|
||||
bool>::type
|
||||
@@ -179,7 +179,7 @@ eval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, All
|
||||
//
|
||||
// And again for trivial cpp_ints:
|
||||
//
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
|
||||
bool>::value
|
||||
@@ -187,7 +187,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>
|
||||
{
|
||||
return (a.sign() == b.sign()) && (*a.limbs() == *b.limbs());
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
|
||||
bool>::value
|
||||
@@ -195,7 +195,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, voi
|
||||
{
|
||||
return *a.limbs() == *b.limbs();
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -203,7 +203,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>
|
||||
{
|
||||
return !a.sign() && (*a.limbs() == b);
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -211,7 +211,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>
|
||||
{
|
||||
return (a.sign() == (b < 0)) && (*a.limbs() == boost::multiprecision::detail::unsigned_abs(b));
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -219,7 +219,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, voi
|
||||
{
|
||||
return *a.limbs() == b;
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -237,7 +237,7 @@ eval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, voi
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -247,7 +247,7 @@ eval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>
|
||||
return a.sign();
|
||||
return a.sign() ? *a.limbs() > *b.limbs() : *a.limbs() < *b.limbs();
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -255,7 +255,7 @@ eval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, voi
|
||||
{
|
||||
return *a.limbs() < *b.limbs();
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -265,7 +265,7 @@ eval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>
|
||||
return true;
|
||||
return *a.limbs() < b;
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -275,7 +275,7 @@ eval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>
|
||||
return a.sign();
|
||||
return a.sign() ? (*a.limbs() > boost::multiprecision::detail::unsigned_abs(b)) : (*a.limbs() < boost::multiprecision::detail::unsigned_abs(b));
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -283,7 +283,7 @@ eval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, voi
|
||||
{
|
||||
return *a.limbs() < b;
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -301,7 +301,7 @@ eval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, voi
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -311,7 +311,7 @@ eval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>
|
||||
return !a.sign();
|
||||
return a.sign() ? *a.limbs() < *b.limbs() : *a.limbs() > *b.limbs();
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -319,7 +319,7 @@ eval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, voi
|
||||
{
|
||||
return *a.limbs() > *b.limbs();
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -329,7 +329,7 @@ eval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>
|
||||
return false;
|
||||
return *a.limbs() > b;
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -339,7 +339,7 @@ eval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>
|
||||
return !a.sign();
|
||||
return a.sign() ? (*a.limbs() < boost::multiprecision::detail::unsigned_abs(b)) : (*a.limbs() > boost::multiprecision::detail::unsigned_abs(b));
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class U>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
@@ -347,7 +347,7 @@ eval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, voi
|
||||
{
|
||||
return *a.limbs() > b;
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class S>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
boost::multiprecision::detail::is_signed<S>::value && boost::multiprecision::detail::is_integral<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
|
||||
bool>::type
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace detail {
|
||||
// as possible.
|
||||
//
|
||||
|
||||
template <unsigned Bits>
|
||||
template <std::size_t Bits>
|
||||
struct int_t
|
||||
{
|
||||
using exact = typename std::conditional<Bits <= sizeof(signed char) * CHAR_BIT, signed char,
|
||||
@@ -49,7 +49,7 @@ struct int_t
|
||||
Please file an issue at https://github.com/boostorg/multiprecision/ referencing this error from cpp_int_config.hpp");
|
||||
};
|
||||
|
||||
template <unsigned Bits>
|
||||
template <std::size_t Bits>
|
||||
struct uint_t
|
||||
{
|
||||
using exact = typename std::conditional<Bits <= sizeof(unsigned char) * CHAR_BIT, unsigned char,
|
||||
@@ -70,7 +70,7 @@ struct uint_t
|
||||
Please file an issue at https://github.com/boostorg/multiprecision/ referencing this error from cpp_int_config.hpp");
|
||||
};
|
||||
|
||||
template <unsigned N>
|
||||
template <std::size_t N>
|
||||
struct largest_signed_type
|
||||
{
|
||||
using type = typename std::conditional<
|
||||
@@ -85,7 +85,7 @@ struct largest_signed_type
|
||||
typename int_t<N>::exact>::type>::type>::type;
|
||||
};
|
||||
|
||||
template <unsigned N>
|
||||
template <std::size_t N>
|
||||
struct largest_unsigned_type
|
||||
{
|
||||
using type = typename std::conditional<
|
||||
@@ -111,7 +111,7 @@ using signed_double_limb_type = boost::multiprecision::int128_type;
|
||||
constexpr const limb_type max_block_10 = 1000000000000000000uLL;
|
||||
constexpr const limb_type digits_per_block_10 = 18;
|
||||
|
||||
inline BOOST_MP_CXX14_CONSTEXPR limb_type block_multiplier(unsigned count)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR limb_type block_multiplier(std::size_t count)
|
||||
{
|
||||
constexpr const limb_type values[digits_per_block_10] = {10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000, 1000000000000, 10000000000000, 100000000000000, 1000000000000000, 10000000000000000, 100000000000000000, 1000000000000000000};
|
||||
BOOST_MP_ASSERT(count < digits_per_block_10);
|
||||
@@ -130,7 +130,7 @@ using signed_double_limb_type = detail::largest_signed_type<64>::type ;
|
||||
constexpr const limb_type max_block_10 = 1000000000;
|
||||
constexpr const limb_type digits_per_block_10 = 9;
|
||||
|
||||
inline limb_type block_multiplier(unsigned count)
|
||||
inline limb_type block_multiplier(std::size_t count)
|
||||
{
|
||||
constexpr const limb_type values[digits_per_block_10] = {10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
|
||||
BOOST_MP_ASSERT(count < digits_per_block_10);
|
||||
@@ -139,7 +139,7 @@ inline limb_type block_multiplier(unsigned count)
|
||||
|
||||
#endif
|
||||
|
||||
constexpr const unsigned bits_per_limb = sizeof(limb_type) * CHAR_BIT;
|
||||
constexpr const std::size_t bits_per_limb = sizeof(limb_type) * CHAR_BIT;
|
||||
|
||||
template <class T>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void minmax(const T& a, const T& b, T& aa, T& bb)
|
||||
|
||||
@@ -64,7 +64,7 @@ BOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(
|
||||
//
|
||||
// Find the most significant words of numerator and denominator.
|
||||
//
|
||||
limb_type y_order = y.size() - 1;
|
||||
std::size_t y_order = y.size() - 1;
|
||||
|
||||
if (y_order == 0)
|
||||
{
|
||||
@@ -80,7 +80,7 @@ BOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(
|
||||
typename CppInt2::const_limb_pointer px = x.limbs();
|
||||
typename CppInt3::const_limb_pointer py = y.limbs();
|
||||
|
||||
limb_type r_order = x.size() - 1;
|
||||
std::size_t r_order = x.size() - 1;
|
||||
if ((r_order == 0) && (*px == 0))
|
||||
{
|
||||
// x is zero, so is the result:
|
||||
@@ -145,7 +145,7 @@ BOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(
|
||||
if (result)
|
||||
{
|
||||
pr = result->limbs();
|
||||
for (unsigned i = 1; i < 1 + r_order - y_order; ++i)
|
||||
for (std::size_t i = 1; i < 1 + r_order - y_order; ++i)
|
||||
pr[i] = 0;
|
||||
}
|
||||
bool first_pass = true;
|
||||
@@ -183,7 +183,7 @@ BOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(
|
||||
//
|
||||
// Update result:
|
||||
//
|
||||
limb_type shift = r_order - y_order;
|
||||
std::size_t shift = r_order - y_order;
|
||||
if (result)
|
||||
{
|
||||
if (r_neg)
|
||||
@@ -194,7 +194,7 @@ BOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(
|
||||
{
|
||||
t.resize(shift + 1, shift + 1);
|
||||
t.limbs()[shift] = guess;
|
||||
for (unsigned i = 0; i < shift; ++i)
|
||||
for (std::size_t i = 0; i < shift; ++i)
|
||||
t.limbs()[i] = 0;
|
||||
eval_subtract(*result, t);
|
||||
}
|
||||
@@ -205,7 +205,7 @@ BOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(
|
||||
{
|
||||
t.resize(shift + 1, shift + 1);
|
||||
t.limbs()[shift] = guess;
|
||||
for (unsigned i = 0; i < shift; ++i)
|
||||
for (std::size_t i = 0; i < shift; ++i)
|
||||
t.limbs()[i] = 0;
|
||||
eval_add(*result, t);
|
||||
}
|
||||
@@ -218,9 +218,9 @@ BOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(
|
||||
t.resize(y.size() + shift + 1, y.size() + shift);
|
||||
bool truncated_t = (t.size() != y.size() + shift + 1);
|
||||
typename CppInt1::limb_pointer pt = t.limbs();
|
||||
for (unsigned i = 0; i < shift; ++i)
|
||||
for (std::size_t i = 0; i < shift; ++i)
|
||||
pt[i] = 0;
|
||||
for (unsigned i = 0; i < y.size(); ++i)
|
||||
for (std::size_t i = 0; i < y.size(); ++i)
|
||||
{
|
||||
carry += static_cast<double_limb_type>(py[i]) * static_cast<double_limb_type>(guess);
|
||||
#ifdef __MSVC_RUNTIME_CHECKS
|
||||
@@ -253,7 +253,7 @@ BOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(
|
||||
// Simplest way is to get 2^n - r by complementing
|
||||
// r, then add t to it. Note that we can't call eval_complement
|
||||
// in case this is a signed checked type:
|
||||
for (unsigned i = 0; i <= r_order; ++i)
|
||||
for (std::size_t i = 0; i <= r_order; ++i)
|
||||
r.limbs()[i] = ~prem[i];
|
||||
r.normalize();
|
||||
eval_increment(r);
|
||||
@@ -345,7 +345,7 @@ BOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(
|
||||
//
|
||||
// Find the most significant word of numerator.
|
||||
//
|
||||
limb_type r_order = x.size() - 1;
|
||||
std::size_t r_order = x.size() - 1;
|
||||
|
||||
//
|
||||
// Set remainder and result to their initial values:
|
||||
@@ -453,7 +453,7 @@ BOOST_MP_CXX14_CONSTEXPR void divide_unsigned_helper(
|
||||
BOOST_MP_ASSERT(r.compare(y) < 0); // remainder must be less than the divisor or our code has failed
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, unsigned MinBits3, unsigned MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type
|
||||
eval_divide(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -466,7 +466,7 @@ eval_divide(
|
||||
result.sign(s);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_divide(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -479,7 +479,7 @@ eval_divide(
|
||||
result.sign(s);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_divide(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -492,7 +492,7 @@ eval_divide(
|
||||
result.sign(s);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_divide(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -503,7 +503,7 @@ eval_divide(
|
||||
eval_divide(result, a, b);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_divide(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -514,7 +514,7 @@ eval_divide(
|
||||
eval_divide(result, a, b);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_divide(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -525,7 +525,7 @@ eval_divide(
|
||||
eval_divide(result, a, b);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, unsigned MinBits3, unsigned MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type
|
||||
eval_modulus(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -540,18 +540,18 @@ eval_modulus(
|
||||
result.sign(s);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_modulus(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& a,
|
||||
const limb_type mod)
|
||||
{
|
||||
const int n = a.size();
|
||||
const std::ptrdiff_t n = a.size();
|
||||
const double_limb_type two_n_mod = static_cast<limb_type>(1u) + (~static_cast<limb_type>(0u) - mod) % mod;
|
||||
limb_type res = a.limbs()[n - 1] % mod;
|
||||
|
||||
for (int i = n - 2; i >= 0; --i)
|
||||
for (std::ptrdiff_t i = n - 2; i >= 0; --i)
|
||||
res = (res * two_n_mod + a.limbs()[i]) % mod;
|
||||
//
|
||||
// We must not modify result until here in case
|
||||
@@ -562,7 +562,7 @@ eval_modulus(
|
||||
result.sign(a.sign());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_modulus(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -574,7 +574,7 @@ eval_modulus(
|
||||
result.sign(a.sign());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_modulus(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -585,7 +585,7 @@ eval_modulus(
|
||||
eval_modulus(result, a, b);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_modulus(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -595,7 +595,7 @@ eval_modulus(
|
||||
eval_modulus(result, result, b);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_modulus(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -608,7 +608,7 @@ eval_modulus(
|
||||
//
|
||||
// Over again for trivial cpp_int's:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)>::type
|
||||
eval_divide(
|
||||
@@ -621,7 +621,7 @@ eval_divide(
|
||||
result.sign(result.sign() != o.sign());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_divide(
|
||||
@@ -633,7 +633,7 @@ eval_divide(
|
||||
*result.limbs() /= *o.limbs();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_modulus(
|
||||
|
||||
@@ -16,10 +16,10 @@ namespace multiprecision {
|
||||
namespace detail {
|
||||
|
||||
template <class Backend, class Unsigned>
|
||||
void assign_bits(Backend& val, Unsigned bits, unsigned bit_location, unsigned chunk_bits, const std::integral_constant<bool, false>& tag)
|
||||
void assign_bits(Backend& val, Unsigned bits, std::size_t bit_location, std::size_t chunk_bits, const std::integral_constant<bool, false>& tag)
|
||||
{
|
||||
unsigned limb = bit_location / (sizeof(limb_type) * CHAR_BIT);
|
||||
unsigned shift = bit_location % (sizeof(limb_type) * CHAR_BIT);
|
||||
std::size_t limb = bit_location / (sizeof(limb_type) * CHAR_BIT);
|
||||
std::size_t shift = bit_location % (sizeof(limb_type) * CHAR_BIT);
|
||||
|
||||
limb_type mask = chunk_bits >= sizeof(limb_type) * CHAR_BIT ? ~static_cast<limb_type>(0u) : (static_cast<limb_type>(1u) << chunk_bits) - 1;
|
||||
|
||||
@@ -46,7 +46,7 @@ void assign_bits(Backend& val, Unsigned bits, unsigned bit_location, unsigned ch
|
||||
}
|
||||
}
|
||||
template <class Backend, class Unsigned>
|
||||
void assign_bits(Backend& val, Unsigned bits, unsigned bit_location, unsigned chunk_bits, const std::integral_constant<bool, true>&)
|
||||
void assign_bits(Backend& val, Unsigned bits, std::size_t bit_location, std::size_t chunk_bits, const std::integral_constant<bool, true>&)
|
||||
{
|
||||
using local_limb_type = typename Backend::local_limb_type;
|
||||
//
|
||||
@@ -69,28 +69,28 @@ void assign_bits(Backend& val, Unsigned bits, unsigned bit_location, unsigned ch
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
inline void resize_to_bit_size(cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& newval, unsigned bits, const std::integral_constant<bool, false>&)
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
inline void resize_to_bit_size(cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& newval, std::size_t bits, const std::integral_constant<bool, false>&)
|
||||
{
|
||||
unsigned limb_count = static_cast<unsigned>(bits / (sizeof(limb_type) * CHAR_BIT));
|
||||
std::size_t limb_count = static_cast<unsigned>(bits / (sizeof(limb_type) * CHAR_BIT));
|
||||
if (bits % (sizeof(limb_type) * CHAR_BIT))
|
||||
++limb_count;
|
||||
constexpr const unsigned max_limbs = MaxBits ? MaxBits / (CHAR_BIT * sizeof(limb_type)) + ((MaxBits % (CHAR_BIT * sizeof(limb_type))) ? 1 : 0) : (std::numeric_limits<unsigned>::max)();
|
||||
constexpr const std::size_t max_limbs = MaxBits ? MaxBits / (CHAR_BIT * sizeof(limb_type)) + ((MaxBits % (CHAR_BIT * sizeof(limb_type))) ? 1 : 0) : (std::numeric_limits<unsigned>::max)();
|
||||
if (limb_count > max_limbs)
|
||||
limb_count = max_limbs;
|
||||
newval.resize(limb_count, limb_count);
|
||||
std::memset(newval.limbs(), 0, newval.size() * sizeof(limb_type));
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
inline void resize_to_bit_size(cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& newval, unsigned, const std::integral_constant<bool, true>&)
|
||||
{
|
||||
*newval.limbs() = 0;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class Iterator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class Iterator>
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&
|
||||
import_bits_generic(
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, Iterator i, Iterator j, unsigned chunk_size = 0, bool msv_first = true)
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, Iterator i, Iterator j, std::size_t chunk_size = 0, bool msv_first = true)
|
||||
{
|
||||
typename number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>::backend_type newval;
|
||||
|
||||
@@ -113,7 +113,7 @@ import_bits_generic(
|
||||
|
||||
while (i != j)
|
||||
{
|
||||
detail::assign_bits(newval, static_cast<unsigned_value_type>(*i), static_cast<unsigned>(bit_location), chunk_size, tag_type());
|
||||
detail::assign_bits(newval, static_cast<unsigned_value_type>(*i), static_cast<std::size_t>(bit_location), chunk_size, tag_type());
|
||||
++i;
|
||||
bit_location += bit_location_change;
|
||||
}
|
||||
@@ -124,10 +124,10 @@ import_bits_generic(
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class T>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class T>
|
||||
inline typename std::enable_if< !boost::multiprecision::backends::is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value, number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&>::type
|
||||
import_bits_fast(
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, T* i, T* j, unsigned chunk_size = 0)
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, T* i, T* j, std::size_t chunk_size = 0)
|
||||
{
|
||||
std::size_t byte_len = (j - i) * (chunk_size ? chunk_size / CHAR_BIT : sizeof(*i));
|
||||
std::size_t limb_len = byte_len / sizeof(limb_type);
|
||||
@@ -140,10 +140,10 @@ import_bits_fast(
|
||||
result.normalize(); // In case data has leading zeros.
|
||||
return val;
|
||||
}
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class T>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class T>
|
||||
inline typename std::enable_if<boost::multiprecision::backends::is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value, number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&>::type
|
||||
import_bits_fast(
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, T* i, T* j, unsigned chunk_size = 0)
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, T* i, T* j, std::size_t chunk_size = 0)
|
||||
{
|
||||
cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& result = val.backend();
|
||||
std::size_t byte_len = (j - i) * (chunk_size ? chunk_size / CHAR_BIT : sizeof(*i));
|
||||
@@ -158,18 +158,18 @@ import_bits_fast(
|
||||
}
|
||||
} // namespace detail
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class Iterator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class Iterator>
|
||||
inline number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&
|
||||
import_bits(
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, Iterator i, Iterator j, unsigned chunk_size = 0, bool msv_first = true)
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, Iterator i, Iterator j, std::size_t chunk_size = 0, bool msv_first = true)
|
||||
{
|
||||
return detail::import_bits_generic(val, i, j, chunk_size, msv_first);
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class T>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class T>
|
||||
inline number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&
|
||||
import_bits(
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, T* i, T* j, unsigned chunk_size = 0, bool msv_first = true)
|
||||
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, T* i, T* j, std::size_t chunk_size = 0, bool msv_first = true)
|
||||
{
|
||||
#if BOOST_MP_ENDIAN_LITTLE_BYTE
|
||||
if (((chunk_size % CHAR_BIT) == 0) && !msv_first)
|
||||
@@ -181,10 +181,10 @@ import_bits(
|
||||
namespace detail {
|
||||
|
||||
template <class Backend>
|
||||
std::uintmax_t extract_bits(const Backend& val, unsigned location, unsigned count, const std::integral_constant<bool, false>& tag)
|
||||
std::uintmax_t extract_bits(const Backend& val, std::size_t location, std::size_t count, const std::integral_constant<bool, false>& tag)
|
||||
{
|
||||
unsigned limb = location / (sizeof(limb_type) * CHAR_BIT);
|
||||
unsigned shift = location % (sizeof(limb_type) * CHAR_BIT);
|
||||
std::size_t limb = location / (sizeof(limb_type) * CHAR_BIT);
|
||||
std::size_t shift = location % (sizeof(limb_type) * CHAR_BIT);
|
||||
std::uintmax_t result = 0;
|
||||
std::uintmax_t mask = count == std::numeric_limits<std::uintmax_t>::digits ? ~static_cast<std::uintmax_t>(0) : (static_cast<std::uintmax_t>(1u) << count) - 1;
|
||||
if (count > (sizeof(limb_type) * CHAR_BIT - shift))
|
||||
@@ -198,7 +198,7 @@ std::uintmax_t extract_bits(const Backend& val, unsigned location, unsigned coun
|
||||
}
|
||||
|
||||
template <class Backend>
|
||||
inline std::uintmax_t extract_bits(const Backend& val, unsigned location, unsigned count, const std::integral_constant<bool, true>&)
|
||||
inline std::uintmax_t extract_bits(const Backend& val, std::size_t location, std::size_t count, const std::integral_constant<bool, true>&)
|
||||
{
|
||||
typename Backend::local_limb_type result = *val.limbs();
|
||||
typename Backend::local_limb_type mask = count >= std::numeric_limits<typename Backend::local_limb_type>::digits ? ~static_cast<typename Backend::local_limb_type>(0) : (static_cast<typename Backend::local_limb_type>(1u) << count) - 1;
|
||||
@@ -207,9 +207,9 @@ inline std::uintmax_t extract_bits(const Backend& val, unsigned location, unsign
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class OutputIterator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class OutputIterator>
|
||||
OutputIterator export_bits(
|
||||
const number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, OutputIterator out, unsigned chunk_size, bool msv_first = true)
|
||||
const number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, OutputIterator out, std::size_t chunk_size, bool msv_first = true)
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
@@ -222,13 +222,13 @@ OutputIterator export_bits(
|
||||
++out;
|
||||
return out;
|
||||
}
|
||||
unsigned bitcount = boost::multiprecision::backends::eval_msb_imp(val.backend()) + 1;
|
||||
unsigned chunks = bitcount / chunk_size;
|
||||
std::size_t bitcount = boost::multiprecision::backends::eval_msb_imp(val.backend()) + 1;
|
||||
std::size_t chunks = bitcount / chunk_size;
|
||||
if (bitcount % chunk_size)
|
||||
++chunks;
|
||||
|
||||
int bit_location = msv_first ? bitcount - chunk_size : 0;
|
||||
int bit_step = msv_first ? -static_cast<int>(chunk_size) : chunk_size;
|
||||
std::ptrdiff_t bit_location = msv_first ? bitcount - chunk_size : 0;
|
||||
std::ptrdiff_t bit_step = msv_first ? -static_cast<int>(chunk_size) : chunk_size;
|
||||
while (bit_location % bit_step)
|
||||
++bit_location;
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace detail {
|
||||
#pragma warning(disable : 4307)
|
||||
#endif
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
inline BOOST_CXX14_CONSTEXPR_IF_DETECTION boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_min(const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&)
|
||||
{
|
||||
@@ -35,7 +35,7 @@ get_min(const std::integral_constant<bool, true>&, const std::integral_constant<
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
inline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_min(const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&)
|
||||
{
|
||||
@@ -46,7 +46,7 @@ get_min(const std::integral_constant<bool, true>&, const std::integral_constant<
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
inline BOOST_CXX14_CONSTEXPR_IF_DETECTION boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_min(const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&)
|
||||
{
|
||||
@@ -60,16 +60,16 @@ get_min(const std::integral_constant<bool, true>&, const std::integral_constant<
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
inline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_min(const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&)
|
||||
{
|
||||
// Bounded and unsigned with allocator (no constexpr):
|
||||
// Bounded and std::size_t with allocator (no constexpr):
|
||||
static const boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> val(0u);
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>
|
||||
inline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_min(const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, has_allocator>&)
|
||||
{
|
||||
@@ -79,7 +79,7 @@ get_min(const std::integral_constant<bool, false>&, const std::integral_constant
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>
|
||||
inline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_min(const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, has_allocator>&)
|
||||
{
|
||||
@@ -88,7 +88,7 @@ get_min(const std::integral_constant<bool, false>&, const std::integral_constant
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
inline BOOST_CXX14_CONSTEXPR_IF_DETECTION boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_max(const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&)
|
||||
{
|
||||
@@ -104,7 +104,7 @@ get_max(const std::integral_constant<bool, true>&, const std::integral_constant<
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
inline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_max(const std::integral_constant<bool, true>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&)
|
||||
{
|
||||
@@ -115,7 +115,7 @@ get_max(const std::integral_constant<bool, true>&, const std::integral_constant<
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
inline BOOST_CXX14_CONSTEXPR_IF_DETECTION boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_max(const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&)
|
||||
{
|
||||
@@ -131,7 +131,7 @@ get_max(const std::integral_constant<bool, true>&, const std::integral_constant<
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
inline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_max(const std::integral_constant<bool, true>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&)
|
||||
{
|
||||
@@ -142,7 +142,7 @@ get_max(const std::integral_constant<bool, true>&, const std::integral_constant<
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>
|
||||
inline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_max(const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&, const std::integral_constant<bool, has_allocator>&)
|
||||
{
|
||||
@@ -152,7 +152,7 @@ get_max(const std::integral_constant<bool, false>&, const std::integral_constant
|
||||
return val;
|
||||
}
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates, bool has_allocator>
|
||||
inline boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>
|
||||
get_max(const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&, const std::integral_constant<bool, has_allocator>&)
|
||||
{
|
||||
@@ -163,7 +163,7 @@ get_max(const std::integral_constant<bool, false>&, const std::integral_constant
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
class numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >
|
||||
{
|
||||
using backend_type = boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>;
|
||||
@@ -214,49 +214,49 @@ class numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_in
|
||||
static constexpr float_round_style round_style = round_toward_zero;
|
||||
};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::digits;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::digits10;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::max_digits10;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_signed;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_integer;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_exact;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::radix;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::min_exponent;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::min_exponent10;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::max_exponent;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::max_exponent10;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::has_infinity;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::has_quiet_NaN;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::has_signaling_NaN;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::has_denorm;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::has_denorm_loss;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_iec559;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_bounded;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::is_modulo;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::traps;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::tinyness_before;
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
constexpr float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >::round_style;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
||||
@@ -137,8 +137,8 @@ struct combine_value_to_pack<value_pack<first, ARGS...>, value>
|
||||
template <char NextChar, char... CHARS>
|
||||
struct pack_values
|
||||
{
|
||||
static constexpr unsigned chars_per_limb = sizeof(limb_type) * CHAR_BIT / 4;
|
||||
static constexpr unsigned shift = ((sizeof...(CHARS)) % chars_per_limb) * 4;
|
||||
static constexpr std::size_t chars_per_limb = sizeof(limb_type) * CHAR_BIT / 4;
|
||||
static constexpr std::size_t shift = ((sizeof...(CHARS)) % chars_per_limb) * 4;
|
||||
static constexpr limb_type value_to_add = shift ? hex_value<NextChar>::value << shift : hex_value<NextChar>::value;
|
||||
|
||||
using recursive_packed_type = typename pack_values<CHARS...>::type ;
|
||||
@@ -275,13 +275,13 @@ BOOST_MP_DEFINE_SIZED_CPP_INT_LITERAL(1024)
|
||||
//
|
||||
// Overload unary minus operator for constexpr use:
|
||||
//
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
constexpr number<cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>, et_off>
|
||||
operator-(const number<cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>, et_off>& a)
|
||||
{
|
||||
return cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>(a.backend(), boost::multiprecision::literals::detail::make_negate_tag());
|
||||
}
|
||||
template <unsigned MinBits, cpp_int_check_type Checked>
|
||||
template <std::size_t MinBits, cpp_int_check_type Checked>
|
||||
constexpr number<cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>, et_off>
|
||||
operator-(number<cpp_int_backend<MinBits, MinBits, signed_magnitude, Checked, void>, et_off>&& a)
|
||||
{
|
||||
|
||||
@@ -95,7 +95,7 @@ inline BOOST_MP_CXX14_CONSTEXPR Integer negate_integer(Integer i, const std::int
|
||||
return ~(i - 1);
|
||||
}
|
||||
|
||||
template <class R, unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <class R, std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<R>::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, void>::type
|
||||
eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& backend)
|
||||
{
|
||||
@@ -119,8 +119,8 @@ eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1,
|
||||
}
|
||||
else
|
||||
*result = static_cast<R>(backend.limbs()[0]);
|
||||
unsigned shift = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
unsigned i = 1;
|
||||
std::size_t shift = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
std::size_t i = 1;
|
||||
BOOST_IF_CONSTEXPR(numeric_limits_workaround<R>::digits > cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits)
|
||||
{
|
||||
while ((i < backend.size()) && (shift < static_cast<unsigned>(numeric_limits_workaround<R>::digits - cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits)))
|
||||
@@ -169,7 +169,7 @@ eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1,
|
||||
}
|
||||
}
|
||||
|
||||
template <class R, unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <class R, std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<std::is_floating_point<R>::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, void>::type
|
||||
eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& backend) noexcept(boost::multiprecision::detail::is_arithmetic<R>::value)
|
||||
{
|
||||
@@ -192,7 +192,7 @@ eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1,
|
||||
std::size_t shift = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits * index;
|
||||
while (bits_to_keep > 0)
|
||||
{
|
||||
if (bits_to_keep < cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits)
|
||||
if (bits_to_keep < (std::ptrdiff_t)cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits)
|
||||
{
|
||||
if(index != backend.size() - 1)
|
||||
mask <<= cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits - bits_to_keep;
|
||||
@@ -216,18 +216,18 @@ eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1,
|
||||
bits -= 1 + std::numeric_limits<R>::digits;
|
||||
if (eval_bit_test(backend, (unsigned)bits))
|
||||
{
|
||||
if ((eval_lsb_imp(backend) < bits) || eval_bit_test(backend, (unsigned)(bits + 1)))
|
||||
if ((eval_lsb_imp(backend) < (std::size_t)bits) || eval_bit_test(backend, (std::size_t)(bits + 1)))
|
||||
*result = boost::math::float_next(*result);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::const_limb_pointer p = backend.limbs();
|
||||
unsigned shift = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
std::size_t shift = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
*result = static_cast<R>(*p);
|
||||
for (unsigned i = 1; i < backend.size(); ++i)
|
||||
for (std::size_t i = 1; i < backend.size(); ++i)
|
||||
{
|
||||
*result += static_cast<R>(std::ldexp(static_cast<long double>(p[i]), shift));
|
||||
*result += static_cast<R>(std::ldexp(static_cast<long double>(p[i]), (int)shift));
|
||||
shift += cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
}
|
||||
}
|
||||
@@ -235,19 +235,19 @@ eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1,
|
||||
*result = -*result;
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, bool>::type
|
||||
eval_is_zero(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val) noexcept
|
||||
{
|
||||
return (val.size() == 1) && (val.limbs()[0] == 0);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, int>::type
|
||||
eval_get_sign(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val) noexcept
|
||||
{
|
||||
return eval_is_zero(val) ? 0 : val.sign() ? -1 : 1;
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_abs(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
||||
{
|
||||
@@ -258,26 +258,26 @@ eval_abs(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& r
|
||||
//
|
||||
// Get the location of the least-significant-bit:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, unsigned>::type
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type
|
||||
eval_lsb_imp(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)
|
||||
{
|
||||
//
|
||||
// Find the index of the least significant limb that is non-zero:
|
||||
//
|
||||
unsigned index = 0;
|
||||
std::size_t index = 0;
|
||||
while (!a.limbs()[index] && (index < a.size()))
|
||||
++index;
|
||||
//
|
||||
// Find the index of the least significant bit within that limb:
|
||||
//
|
||||
unsigned result = boost::multiprecision::detail::find_lsb(a.limbs()[index]);
|
||||
std::size_t result = boost::multiprecision::detail::find_lsb(a.limbs()[index]);
|
||||
|
||||
return result + index * cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, unsigned>::type
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type
|
||||
eval_lsb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)
|
||||
{
|
||||
using default_ops::eval_get_sign;
|
||||
@@ -295,8 +295,8 @@ eval_lsb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocato
|
||||
//
|
||||
// Get the location of the most-significant-bit:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, unsigned>::type
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type
|
||||
eval_msb_imp(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)
|
||||
{
|
||||
//
|
||||
@@ -305,8 +305,8 @@ eval_msb_imp(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allo
|
||||
return (a.size() - 1) * cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits + boost::multiprecision::detail::find_msb(a.limbs()[a.size() - 1]);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, unsigned>::type
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type
|
||||
eval_msb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)
|
||||
{
|
||||
using default_ops::eval_get_sign;
|
||||
@@ -330,12 +330,12 @@ eval_msb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocato
|
||||
#pragma GCC diagnostic ignored "-Warray-bounds"
|
||||
#endif
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, bool>::type
|
||||
eval_bit_test(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, unsigned index) noexcept
|
||||
eval_bit_test(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, std::size_t index) noexcept
|
||||
{
|
||||
unsigned offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
unsigned shift = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
std::size_t offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
std::size_t shift = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
limb_type mask = shift ? limb_type(1u) << shift : limb_type(1u);
|
||||
if (offset >= val.size())
|
||||
return false;
|
||||
@@ -346,31 +346,31 @@ eval_bit_test(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, All
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_bit_set(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, unsigned index)
|
||||
eval_bit_set(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, std::size_t index)
|
||||
{
|
||||
unsigned offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
unsigned shift = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
std::size_t offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
std::size_t shift = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
limb_type mask = shift ? limb_type(1u) << shift : limb_type(1u);
|
||||
if (offset >= val.size())
|
||||
{
|
||||
unsigned os = val.size();
|
||||
std::size_t os = val.size();
|
||||
val.resize(offset + 1, offset + 1);
|
||||
if (offset >= val.size())
|
||||
return; // fixed precision overflow
|
||||
for (unsigned i = os; i <= offset; ++i)
|
||||
for (std::size_t i = os; i <= offset; ++i)
|
||||
val.limbs()[i] = 0;
|
||||
}
|
||||
val.limbs()[offset] |= mask;
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_bit_unset(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, unsigned index) noexcept
|
||||
eval_bit_unset(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, std::size_t index) noexcept
|
||||
{
|
||||
unsigned offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
unsigned shift = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
std::size_t offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
std::size_t shift = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
limb_type mask = shift ? limb_type(1u) << shift : limb_type(1u);
|
||||
if (offset >= val.size())
|
||||
return;
|
||||
@@ -378,27 +378,27 @@ eval_bit_unset(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocato
|
||||
val.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_bit_flip(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, unsigned index)
|
||||
eval_bit_flip(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val, std::size_t index)
|
||||
{
|
||||
unsigned offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
unsigned shift = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
std::size_t offset = index / cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
std::size_t shift = index % cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits;
|
||||
limb_type mask = shift ? limb_type(1u) << shift : limb_type(1u);
|
||||
if (offset >= val.size())
|
||||
{
|
||||
unsigned os = val.size();
|
||||
std::size_t os = val.size();
|
||||
val.resize(offset + 1, offset + 1);
|
||||
if (offset >= val.size())
|
||||
return; // fixed precision overflow
|
||||
for (unsigned i = os; i <= offset; ++i)
|
||||
for (std::size_t i = os; i <= offset; ++i)
|
||||
val.limbs()[i] = 0;
|
||||
}
|
||||
val.limbs()[offset] ^= mask;
|
||||
val.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_qr(
|
||||
const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& x,
|
||||
@@ -411,7 +411,7 @@ eval_qr(
|
||||
r.sign(x.sign());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_qr(
|
||||
const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& x,
|
||||
@@ -424,7 +424,7 @@ eval_qr(
|
||||
r.sign(x.sign());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class U>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class U>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<U>::value>::type eval_qr(
|
||||
const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& x,
|
||||
U y,
|
||||
@@ -437,7 +437,7 @@ inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::d
|
||||
eval_qr(x, t, q, r);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer>::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, Integer>::type
|
||||
eval_integer_modulus(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a, Integer mod)
|
||||
{
|
||||
@@ -445,11 +445,11 @@ eval_integer_modulus(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checke
|
||||
{
|
||||
if (mod <= (std::numeric_limits<limb_type>::max)())
|
||||
{
|
||||
const int n = a.size();
|
||||
const std::ptrdiff_t n = a.size();
|
||||
const double_limb_type two_n_mod = static_cast<limb_type>(1u) + (~static_cast<limb_type>(0u) - mod) % mod;
|
||||
limb_type res = a.limbs()[n - 1] % mod;
|
||||
|
||||
for (int i = n - 2; i >= 0; --i)
|
||||
for (std::ptrdiff_t i = n - 2; i >= 0; --i)
|
||||
res = static_cast<limb_type>((res * two_n_mod + a.limbs()[i]) % mod);
|
||||
return res;
|
||||
}
|
||||
@@ -462,7 +462,7 @@ eval_integer_modulus(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checke
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_signed<Integer>::value && boost::multiprecision::detail::is_integral<Integer>::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, Integer>::type
|
||||
eval_integer_modulus(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& x, Integer val)
|
||||
{
|
||||
@@ -477,7 +477,7 @@ BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR limb_type eval_gcd(limb_type u, li
|
||||
#if __cpp_lib_gcd_lcm >= 201606L
|
||||
return std::gcd(u, v);
|
||||
#else
|
||||
unsigned shift = boost::multiprecision::detail::find_lsb(u | v);
|
||||
std::size_t shift = boost::multiprecision::detail::find_lsb(u | v);
|
||||
u >>= boost::multiprecision::detail::find_lsb(u);
|
||||
do
|
||||
{
|
||||
@@ -498,7 +498,7 @@ inline BOOST_MP_CXX14_CONSTEXPR double_limb_type eval_gcd(double_limb_type u, do
|
||||
if (u == 0)
|
||||
return v;
|
||||
|
||||
unsigned shift = boost::multiprecision::detail::find_lsb(u | v);
|
||||
std::size_t shift = boost::multiprecision::detail::find_lsb(u | v);
|
||||
u >>= boost::multiprecision::detail::find_lsb(u);
|
||||
do
|
||||
{
|
||||
@@ -511,7 +511,7 @@ inline BOOST_MP_CXX14_CONSTEXPR double_limb_type eval_gcd(double_limb_type u, do
|
||||
#endif
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_gcd(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -533,7 +533,7 @@ eval_gcd(
|
||||
result.sign(false);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_gcd(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -562,7 +562,7 @@ eval_gcd(
|
||||
result = res;
|
||||
result.sign(false);
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_gcd(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -574,7 +574,7 @@ eval_gcd(
|
||||
//
|
||||
// These 2 overloads take care of gcd against an (unsigned) short etc:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer>::value && (sizeof(Integer) <= sizeof(limb_type)) && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_gcd(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -583,7 +583,7 @@ eval_gcd(
|
||||
{
|
||||
eval_gcd(result, a, static_cast<limb_type>(v));
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Integer>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_signed<Integer>::value && boost::multiprecision::detail::is_integral<Integer>::value && (sizeof(Integer) <= sizeof(limb_type)) && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_gcd(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -626,13 +626,13 @@ eval_gcd(
|
||||
// When double_limb_type is a native integer type then we should just use it and not worry about the consequences.
|
||||
// This can eliminate approximately a full limb with each call.
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Storage>
|
||||
void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& U, cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& V, unsigned lu, Storage& storage)
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Storage>
|
||||
void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& U, cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& V, std::size_t lu, Storage& storage)
|
||||
{
|
||||
//
|
||||
// Extract the leading 2 * bits_per_limb bits from U and V:
|
||||
//
|
||||
unsigned h = lu % bits_per_limb;
|
||||
std::size_t h = lu % bits_per_limb;
|
||||
double_limb_type u = (static_cast<double_limb_type>((U.limbs()[U.size() - 1])) << bits_per_limb) | U.limbs()[U.size() - 2];
|
||||
double_limb_type v = (static_cast<double_limb_type>((V.size() < U.size() ? 0 : V.limbs()[V.size() - 1])) << bits_per_limb) | V.limbs()[U.size() - 2];
|
||||
if (h)
|
||||
@@ -654,7 +654,7 @@ void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Al
|
||||
//
|
||||
double_limb_type x[3] = {1, 0};
|
||||
double_limb_type y[3] = {0, 1};
|
||||
unsigned i = 0;
|
||||
std::size_t i = 0;
|
||||
|
||||
#ifdef BOOST_MP_GCD_DEBUG
|
||||
cpp_int UU, VV;
|
||||
@@ -725,7 +725,7 @@ void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Al
|
||||
// the appropriate subtraction depending on the whether i is
|
||||
// even or odd:
|
||||
//
|
||||
unsigned ts = U.size() + 1;
|
||||
std::size_t ts = U.size() + 1;
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t1(storage, ts), t2(storage, ts), t3(storage, ts);
|
||||
eval_multiply(t1, U, static_cast<limb_type>(x[0]));
|
||||
eval_multiply(t2, V, static_cast<limb_type>(y[0]));
|
||||
@@ -772,9 +772,9 @@ void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Al
|
||||
BOOST_MP_ASSERT(UU == U);
|
||||
BOOST_MP_ASSERT(VV == V);
|
||||
|
||||
extern unsigned total_lehmer_gcd_calls;
|
||||
extern unsigned total_lehmer_gcd_bits_saved;
|
||||
extern unsigned total_lehmer_gcd_cycles;
|
||||
extern std::size_t total_lehmer_gcd_calls;
|
||||
extern std::size_t total_lehmer_gcd_bits_saved;
|
||||
extern std::size_t total_lehmer_gcd_cycles;
|
||||
|
||||
++total_lehmer_gcd_calls;
|
||||
total_lehmer_gcd_bits_saved += lu - eval_msb(U);
|
||||
@@ -830,13 +830,13 @@ BOOST_FORCEINLINE void divide_subtract(double_limb_type& q, double_limb_type& u,
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Storage>
|
||||
void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& U, cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& V, unsigned lu, Storage& storage)
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class Storage>
|
||||
void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& U, cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& V, std::size_t lu, Storage& storage)
|
||||
{
|
||||
//
|
||||
// Extract the leading 2*bits_per_limb bits from U and V:
|
||||
//
|
||||
unsigned h = lu % bits_per_limb;
|
||||
std::size_t h = lu % bits_per_limb;
|
||||
double_limb_type u, v;
|
||||
if (h)
|
||||
{
|
||||
@@ -862,7 +862,7 @@ void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Al
|
||||
//
|
||||
limb_type x[3] = { 1, 0 };
|
||||
limb_type y[3] = { 0, 1 };
|
||||
unsigned i = 0;
|
||||
std::size_t i = 0;
|
||||
|
||||
#ifdef BOOST_MP_GCD_DEBUG
|
||||
cpp_int UU, VV;
|
||||
@@ -992,7 +992,7 @@ void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Al
|
||||
// the appropriate subtraction depending on the whether i is
|
||||
// even or odd:
|
||||
//
|
||||
unsigned ts = U.size() + 1;
|
||||
std::size_t ts = U.size() + 1;
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> t1(storage, ts), t2(storage, ts), t3(storage, ts);
|
||||
eval_multiply(t1, U, x[0]);
|
||||
eval_multiply(t2, V, y[0]);
|
||||
@@ -1039,9 +1039,9 @@ void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Al
|
||||
BOOST_MP_ASSERT(UU == U);
|
||||
BOOST_MP_ASSERT(VV == V);
|
||||
|
||||
extern unsigned total_lehmer_gcd_calls;
|
||||
extern unsigned total_lehmer_gcd_bits_saved;
|
||||
extern unsigned total_lehmer_gcd_cycles;
|
||||
extern std::size_t total_lehmer_gcd_calls;
|
||||
extern std::size_t total_lehmer_gcd_bits_saved;
|
||||
extern std::size_t total_lehmer_gcd_cycles;
|
||||
|
||||
++total_lehmer_gcd_calls;
|
||||
total_lehmer_gcd_bits_saved += lu - eval_msb(U);
|
||||
@@ -1073,7 +1073,7 @@ void eval_gcd_lehmer(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Al
|
||||
|
||||
#endif
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_gcd(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -1094,7 +1094,7 @@ eval_gcd(
|
||||
eval_gcd(result, a, *b.limbs());
|
||||
return;
|
||||
}
|
||||
unsigned temp_size = (std::max)(a.size(), b.size()) + 1;
|
||||
std::size_t temp_size = (std::max)(a.size(), b.size()) + 1;
|
||||
typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::scoped_shared_storage storage(a, temp_size * 6);
|
||||
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> U(storage, temp_size);
|
||||
@@ -1128,9 +1128,9 @@ eval_gcd(
|
||||
//
|
||||
// Remove common factors of 2:
|
||||
//
|
||||
unsigned us = eval_lsb(U);
|
||||
unsigned vs = eval_lsb(V);
|
||||
int shift = (std::min)(us, vs);
|
||||
std::size_t us = eval_lsb(U);
|
||||
std::size_t vs = eval_lsb(V);
|
||||
std::size_t shift = (std::min)(us, vs);
|
||||
if (us)
|
||||
eval_right_shift(U, us);
|
||||
if (vs)
|
||||
@@ -1158,8 +1158,8 @@ eval_gcd(
|
||||
}
|
||||
break;
|
||||
}
|
||||
unsigned lu = eval_msb(U) + 1;
|
||||
unsigned lv = eval_msb(V) + 1;
|
||||
std::size_t lu = eval_msb(U) + 1;
|
||||
std::size_t lv = eval_msb(V) + 1;
|
||||
#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION
|
||||
if (!BOOST_MP_IS_CONST_EVALUATED(lu) && (lu - lv <= bits_per_limb / 2))
|
||||
#else
|
||||
@@ -1182,7 +1182,7 @@ eval_gcd(
|
||||
//
|
||||
// Now again for trivial backends:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_gcd(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& b) noexcept
|
||||
{
|
||||
@@ -1190,7 +1190,7 @@ eval_gcd(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& r
|
||||
result.sign(false);
|
||||
}
|
||||
// This one is only enabled for unchecked cpp_int's, for checked int's we need the checking in the default version:
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (Checked1 == unchecked)>::type
|
||||
eval_lcm(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& b) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
||||
{
|
||||
@@ -1211,7 +1211,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void conversion_overflow(const std::integral_con
|
||||
// See: https://bugs.llvm.org/show_bug.cgi?id=48941
|
||||
// These workarounds pass everything through an intermediate uint64_t.
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && std::is_same<typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type, double_limb_type>::value>::type
|
||||
eval_convert_to(float* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val)
|
||||
@@ -1222,7 +1222,7 @@ eval_convert_to(float* result, const cpp_int_backend<MinBits1, MaxBits1, SignTyp
|
||||
if(val.sign())
|
||||
*result = -*result;
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && std::is_same<typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type, double_limb_type>::value>::type
|
||||
eval_convert_to(double* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val)
|
||||
@@ -1233,7 +1233,7 @@ eval_convert_to(double* result, const cpp_int_backend<MinBits1, MaxBits1, SignTy
|
||||
if(val.sign())
|
||||
*result = -*result;
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && std::is_same<typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type, double_limb_type>::value>::type
|
||||
eval_convert_to(long double* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val)
|
||||
@@ -1246,7 +1246,7 @@ eval_convert_to(long double* result, const cpp_int_backend<MinBits1, MaxBits1, S
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class R, unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <class R, std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && std::is_convertible<typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type, R>::value>::type
|
||||
eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val)
|
||||
@@ -1290,7 +1290,7 @@ eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1,
|
||||
}
|
||||
}
|
||||
|
||||
template <class R, unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <class R, std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && std::is_convertible<typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::local_limb_type, R>::value>::type
|
||||
eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val)
|
||||
@@ -1310,8 +1310,8 @@ eval_convert_to(R* result, const cpp_int_backend<MinBits1, MaxBits1, SignType1,
|
||||
*result = static_cast<R>(*val.limbs());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, unsigned>::type
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type
|
||||
eval_lsb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)
|
||||
{
|
||||
using default_ops::eval_get_sign;
|
||||
@@ -1329,8 +1329,8 @@ eval_lsb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocato
|
||||
return boost::multiprecision::detail::find_lsb(*a.limbs());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, unsigned>::type
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type
|
||||
eval_msb_imp(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)
|
||||
{
|
||||
//
|
||||
@@ -1339,8 +1339,8 @@ eval_msb_imp(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allo
|
||||
return boost::multiprecision::detail::find_msb(*a.limbs());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, unsigned>::type
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value, std::size_t>::type
|
||||
eval_msb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a)
|
||||
{
|
||||
using default_ops::eval_get_sign;
|
||||
@@ -1355,11 +1355,11 @@ eval_msb(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocato
|
||||
return eval_msb_imp(a);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR std::size_t hash_value(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val) noexcept
|
||||
{
|
||||
std::size_t result = 0;
|
||||
for (unsigned i = 0; i < val.size(); ++i)
|
||||
for (std::size_t i = 0; i < val.size(); ++i)
|
||||
{
|
||||
boost::multiprecision::detail::hash_combine(result, val.limbs()[i]);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace boost { namespace multiprecision { namespace backends {
|
||||
//
|
||||
// Multiplication by a single limb:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_multiply(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -56,7 +56,7 @@ eval_multiply(
|
||||
}
|
||||
if (carry)
|
||||
{
|
||||
unsigned i = result.size();
|
||||
std::size_t i = result.size();
|
||||
result.resize(i + 1, i + 1);
|
||||
if (result.size() > i)
|
||||
result.limbs()[i] = static_cast<limb_type>(carry);
|
||||
@@ -71,11 +71,11 @@ eval_multiply(
|
||||
// for "required" elements could possibly have failed, *and* we have checking enabled.
|
||||
// This will cause an overflow error inside resize():
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void resize_for_carry(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& /*result*/, unsigned /*required*/) {}
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void resize_for_carry(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& /*result*/, std::size_t /*required*/) {}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void resize_for_carry(cpp_int_backend<MinBits1, MaxBits1, SignType1, checked, Allocator1>& result, unsigned required)
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, class Allocator1>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void resize_for_carry(cpp_int_backend<MinBits1, MaxBits1, SignType1, checked, Allocator1>& result, std::size_t required)
|
||||
{
|
||||
if (result.size() < required)
|
||||
result.resize(required, required);
|
||||
@@ -94,7 +94,7 @@ const size_t karatsuba_cutoff = 40;
|
||||
// and full variable precision. Karatsuba really doesn't play nice with fixed-size integers. If necessary
|
||||
// fixed precision integers will get aliased as variable-precision types before this is called.
|
||||
//
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_int_check_type Checked, class Allocator>
|
||||
inline void multiply_karatsuba(
|
||||
cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& result,
|
||||
const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a,
|
||||
@@ -103,8 +103,8 @@ inline void multiply_karatsuba(
|
||||
{
|
||||
using cpp_int_type = cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>;
|
||||
|
||||
unsigned as = a.size();
|
||||
unsigned bs = b.size();
|
||||
std::size_t as = a.size();
|
||||
std::size_t bs = b.size();
|
||||
//
|
||||
// Termination condition: if either argument is smaller than karatsuba_cutoff
|
||||
// then schoolboy multiplication will be faster:
|
||||
@@ -117,7 +117,7 @@ inline void multiply_karatsuba(
|
||||
//
|
||||
// Partitioning size: split the larger of a and b into 2 halves
|
||||
//
|
||||
unsigned n = (as > bs ? as : bs) / 2 + 1;
|
||||
std::size_t n = (as > bs ? as : bs) / 2 + 1;
|
||||
//
|
||||
// Partition a and b into high and low parts.
|
||||
// ie write a, b as a = a_h * 2^n + a_l, b = b_h * 2^n + b_l
|
||||
@@ -132,7 +132,7 @@ inline void multiply_karatsuba(
|
||||
// * Since we have one high part zero, the arithmetic simplifies considerably,
|
||||
// so should we have a special routine for this?
|
||||
//
|
||||
unsigned sz = (std::min)(as, n);
|
||||
std::size_t sz = (std::min)(as, n);
|
||||
const cpp_int_type a_l(a.limbs(), 0, sz);
|
||||
|
||||
sz = (std::min)(bs, n);
|
||||
@@ -175,13 +175,13 @@ inline void multiply_karatsuba(
|
||||
// that it's worth the extra logic though (and is darn hard to measure
|
||||
// what the "average" case is).
|
||||
//
|
||||
for (unsigned i = result_low.size(); i < 2 * n; ++i)
|
||||
for (std::size_t i = result_low.size(); i < 2 * n; ++i)
|
||||
result.limbs()[i] = 0;
|
||||
//
|
||||
// Set the high part of result to a_h * b_h:
|
||||
//
|
||||
multiply_karatsuba(result_high, a_h, b_h, storage);
|
||||
for (unsigned i = result_high.size() + 2 * n; i < result.size(); ++i)
|
||||
for (std::size_t i = result_high.size() + 2 * n; i < result.size(); ++i)
|
||||
result.limbs()[i] = 0;
|
||||
//
|
||||
// Now calculate (a_h+a_l)*(b_h+b_l):
|
||||
@@ -214,7 +214,7 @@ inline void multiply_karatsuba(
|
||||
result.normalize();
|
||||
}
|
||||
|
||||
inline unsigned karatsuba_storage_size(unsigned s)
|
||||
inline std::size_t karatsuba_storage_size(std::size_t s)
|
||||
{
|
||||
//
|
||||
// This estimates how much memory we will need based on
|
||||
@@ -236,17 +236,17 @@ inline unsigned karatsuba_storage_size(unsigned s)
|
||||
//
|
||||
// Normal variable precision case comes first:
|
||||
//
|
||||
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
|
||||
inline typename std::enable_if<!is_fixed_precision<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value>::type
|
||||
setup_karatsuba(
|
||||
cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& result,
|
||||
const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& a,
|
||||
const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& b)
|
||||
{
|
||||
unsigned as = a.size();
|
||||
unsigned bs = b.size();
|
||||
unsigned s = as > bs ? as : bs;
|
||||
unsigned storage_size = karatsuba_storage_size(s);
|
||||
std::size_t as = a.size();
|
||||
std::size_t bs = b.size();
|
||||
std::size_t s = as > bs ? as : bs;
|
||||
std::size_t storage_size = karatsuba_storage_size(s);
|
||||
if (storage_size < 300)
|
||||
{
|
||||
//
|
||||
@@ -265,7 +265,7 @@ setup_karatsuba(
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, unsigned MinBits3, unsigned MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
inline typename std::enable_if<is_fixed_precision<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_fixed_precision<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value || is_fixed_precision<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type
|
||||
setup_karatsuba(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -282,11 +282,11 @@ setup_karatsuba(
|
||||
//
|
||||
using variable_precision_type = cpp_int_backend<0, 0, signed_magnitude, unchecked, std::allocator<limb_type> >;
|
||||
variable_precision_type a_t(a.limbs(), 0, a.size()), b_t(b.limbs(), 0, b.size());
|
||||
unsigned as = a.size();
|
||||
unsigned bs = b.size();
|
||||
unsigned s = as > bs ? as : bs;
|
||||
unsigned sz = as + bs;
|
||||
unsigned storage_size = karatsuba_storage_size(s);
|
||||
std::size_t as = a.size();
|
||||
std::size_t bs = b.size();
|
||||
std::size_t s = as > bs ? as : bs;
|
||||
std::size_t sz = as + bs;
|
||||
std::size_t storage_size = karatsuba_storage_size(s);
|
||||
|
||||
if (!is_fixed_precision<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || (sz * sizeof(limb_type) * CHAR_BIT <= MaxBits1))
|
||||
{
|
||||
@@ -312,7 +312,7 @@ setup_karatsuba(
|
||||
result = t;
|
||||
}
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, unsigned MinBits3, unsigned MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
inline typename std::enable_if<!is_fixed_precision<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_fixed_precision<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_fixed_precision<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type
|
||||
setup_karatsuba(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -324,11 +324,11 @@ setup_karatsuba(
|
||||
//
|
||||
using variable_precision_type = cpp_int_backend<0, 0, signed_magnitude, unchecked, std::allocator<limb_type> >;
|
||||
variable_precision_type a_t(a.limbs(), 0, a.size()), b_t(b.limbs(), 0, b.size());
|
||||
unsigned as = a.size();
|
||||
unsigned bs = b.size();
|
||||
unsigned s = as > bs ? as : bs;
|
||||
unsigned sz = as + bs;
|
||||
unsigned storage_size = karatsuba_storage_size(s);
|
||||
std::size_t as = a.size();
|
||||
std::size_t bs = b.size();
|
||||
std::size_t s = as > bs ? as : bs;
|
||||
std::size_t sz = as + bs;
|
||||
std::size_t storage_size = karatsuba_storage_size(s);
|
||||
|
||||
result.resize(sz, sz);
|
||||
variable_precision_type t(result.limbs(), 0, result.size());
|
||||
@@ -336,7 +336,7 @@ setup_karatsuba(
|
||||
multiply_karatsuba(t, a_t, b_t, storage);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, unsigned MinBits3, unsigned MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void
|
||||
eval_multiply_comba(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -348,7 +348,7 @@ eval_multiply_comba(
|
||||
// Comba Multiplier - based on Paul Comba's
|
||||
// Exponentiation cryptosystems on the IBM PC, 1990
|
||||
//
|
||||
int as = a.size(),
|
||||
std::ptrdiff_t as = a.size(),
|
||||
bs = b.size(),
|
||||
rs = result.size();
|
||||
typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_pointer pr = result.limbs();
|
||||
@@ -356,11 +356,11 @@ eval_multiply_comba(
|
||||
double_limb_type carry = 0,
|
||||
temp = 0;
|
||||
limb_type overflow = 0;
|
||||
const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
const std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
const bool must_throw = rs < as + bs - 1;
|
||||
for (int r = 0, lim = (std::min)(rs, as + bs - 1); r < lim; ++r, overflow = 0)
|
||||
for (std::ptrdiff_t r = 0, lim = (std::min)(rs, as + bs - 1); r < lim; ++r, overflow = 0)
|
||||
{
|
||||
int i = r >= as ? as - 1 : r,
|
||||
std::ptrdiff_t i = r >= as ? as - 1 : r,
|
||||
j = r - i,
|
||||
k = i < bs - j ? i + 1 : bs - j; // min(i+1, bs-j);
|
||||
|
||||
@@ -386,7 +386,7 @@ eval_multiply_comba(
|
||||
*pr = static_cast<limb_type>(carry);
|
||||
}
|
||||
}
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, unsigned MinBits3, unsigned MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2, std::size_t MinBits3, std::size_t MaxBits3, cpp_integer_type SignType3, cpp_int_check_type Checked3, class Allocator3>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3> >::value>::type
|
||||
eval_multiply(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -402,8 +402,8 @@ eval_multiply(
|
||||
//
|
||||
// Trivial cases first:
|
||||
//
|
||||
unsigned as = a.size();
|
||||
unsigned bs = b.size();
|
||||
std::size_t as = a.size();
|
||||
std::size_t bs = b.size();
|
||||
typename cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>::const_limb_pointer pa = a.limbs();
|
||||
typename cpp_int_backend<MinBits3, MaxBits3, SignType3, Checked3, Allocator3>::const_limb_pointer pb = b.limbs();
|
||||
if (as == 1)
|
||||
@@ -466,7 +466,7 @@ eval_multiply(
|
||||
#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION
|
||||
if (BOOST_MP_IS_CONST_EVALUATED(as))
|
||||
{
|
||||
for (unsigned i = 0; i < result.size(); ++i)
|
||||
for (std::size_t i = 0; i < result.size(); ++i)
|
||||
pr[i] = 0;
|
||||
}
|
||||
else
|
||||
@@ -483,11 +483,11 @@ eval_multiply(
|
||||
#else
|
||||
|
||||
double_limb_type carry = 0;
|
||||
for (unsigned i = 0; i < as; ++i)
|
||||
for (std::size_t i = 0; i < as; ++i)
|
||||
{
|
||||
BOOST_MP_ASSERT(result.size() > i);
|
||||
unsigned inner_limit = !is_fixed_precision<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value ? bs : (std::min)(result.size() - i, bs);
|
||||
unsigned j = 0;
|
||||
std::size_t inner_limit = !is_fixed_precision<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value ? bs : (std::min)(result.size() - i, bs);
|
||||
std::size_t j = 0;
|
||||
for (; j < inner_limit; ++j)
|
||||
{
|
||||
BOOST_MP_ASSERT(i + j < result.size());
|
||||
@@ -527,7 +527,7 @@ eval_multiply(
|
||||
result.sign(a.sign() != b.sign());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_multiply(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -537,7 +537,7 @@ eval_multiply(
|
||||
eval_multiply(result, result, a);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const limb_type& val)
|
||||
noexcept((noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const limb_type&>()))))
|
||||
@@ -545,7 +545,7 @@ eval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator
|
||||
eval_multiply(result, result, val);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_multiply(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -572,7 +572,7 @@ eval_multiply(
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const double_limb_type& val)
|
||||
noexcept((noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const double_limb_type&>()))))
|
||||
@@ -580,7 +580,7 @@ eval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator
|
||||
eval_multiply(result, result, val);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_multiply(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -597,7 +597,7 @@ eval_multiply(
|
||||
}
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const signed_limb_type& val)
|
||||
noexcept((noexcept(eval_multiply(std::declval<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&>(), std::declval<const limb_type&>()))))
|
||||
@@ -605,7 +605,7 @@ eval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator
|
||||
eval_multiply(result, result, val);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_multiply(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -639,7 +639,7 @@ eval_multiply(
|
||||
eval_multiply(result, a, t);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, const signed_double_limb_type& val)
|
||||
noexcept(
|
||||
@@ -653,7 +653,7 @@ eval_multiply(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator
|
||||
//
|
||||
// Now over again for trivial cpp_int's:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)>::type
|
||||
eval_multiply(
|
||||
@@ -665,7 +665,7 @@ eval_multiply(
|
||||
result.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_multiply(
|
||||
@@ -676,7 +676,7 @@ eval_multiply(
|
||||
result.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value)>::type
|
||||
eval_multiply(
|
||||
@@ -689,7 +689,7 @@ eval_multiply(
|
||||
result.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_multiply(
|
||||
@@ -704,7 +704,7 @@ eval_multiply(
|
||||
//
|
||||
// Special routines for multiplying two integers to obtain a multiprecision result:
|
||||
//
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_multiply(
|
||||
@@ -712,7 +712,7 @@ eval_multiply(
|
||||
signed_double_limb_type a, signed_double_limb_type b)
|
||||
{
|
||||
constexpr const signed_double_limb_type mask = ~static_cast<limb_type>(0);
|
||||
constexpr const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
constexpr const std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
|
||||
bool s = false;
|
||||
if (a < 0)
|
||||
@@ -757,7 +757,7 @@ eval_multiply(
|
||||
result.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
||||
eval_multiply(
|
||||
@@ -765,7 +765,7 @@ eval_multiply(
|
||||
double_limb_type a, double_limb_type b)
|
||||
{
|
||||
constexpr const signed_double_limb_type mask = ~static_cast<limb_type>(0);
|
||||
constexpr const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
constexpr const std::size_t limb_bits = sizeof(limb_type) * CHAR_BIT;
|
||||
|
||||
double_limb_type w = a & mask;
|
||||
double_limb_type x = a >> limb_bits;
|
||||
@@ -807,8 +807,8 @@ eval_multiply(
|
||||
result.normalize();
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1,
|
||||
unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1,
|
||||
std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
||||
!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
||||
eval_multiply(
|
||||
@@ -821,7 +821,7 @@ eval_multiply(
|
||||
result.sign(a.sign() != b.sign());
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class SI>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class SI>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_signed<SI>::value && boost::multiprecision::detail::is_integral<SI>::value && (sizeof(SI) <= sizeof(signed_double_limb_type) / 2)>::type
|
||||
eval_multiply(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
@@ -830,7 +830,7 @@ eval_multiply(
|
||||
result = static_cast<signed_double_limb_type>(a) * static_cast<signed_double_limb_type>(b);
|
||||
}
|
||||
|
||||
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class UI>
|
||||
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class UI>
|
||||
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<UI>::value && (sizeof(UI) <= sizeof(signed_double_limb_type) / 2)>::type
|
||||
eval_multiply(
|
||||
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
||||
|
||||
@@ -191,7 +191,7 @@ void do_serialize(Archive& ar, Int& val, std::integral_constant<bool, true> cons
|
||||
|
||||
} // namespace cpp_int_detail
|
||||
|
||||
template <class Archive, unsigned MinBits, unsigned MaxBits, mp::cpp_integer_type SignType, mp::cpp_int_check_type Checked, class Allocator>
|
||||
template <class Archive, std::size_t MinBits, std::size_t MaxBits, mp::cpp_integer_type SignType, mp::cpp_int_check_type Checked, class Allocator>
|
||||
void serialize(Archive& ar, mp::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& val, const unsigned int /*version*/)
|
||||
{
|
||||
using archive_save_tag = typename Archive::is_saving ;
|
||||
|
||||
@@ -462,49 +462,49 @@ inline void eval_right_shift(debug_adaptor<Backend>& arg, const debug_adaptor<Ba
|
||||
}
|
||||
|
||||
template <class Backend, class T>
|
||||
inline unsigned eval_integer_modulus(const debug_adaptor<Backend>& arg, const T& a)
|
||||
inline T eval_integer_modulus(const debug_adaptor<Backend>& arg, const T& a)
|
||||
{
|
||||
using default_ops::eval_integer_modulus;
|
||||
return eval_integer_modulus(arg.value(), a);
|
||||
}
|
||||
|
||||
template <class Backend>
|
||||
inline unsigned eval_lsb(const debug_adaptor<Backend>& arg)
|
||||
inline std::size_t eval_lsb(const debug_adaptor<Backend>& arg)
|
||||
{
|
||||
using default_ops::eval_lsb;
|
||||
return eval_lsb(arg.value());
|
||||
}
|
||||
|
||||
template <class Backend>
|
||||
inline unsigned eval_msb(const debug_adaptor<Backend>& arg)
|
||||
inline std::size_t eval_msb(const debug_adaptor<Backend>& arg)
|
||||
{
|
||||
using default_ops::eval_msb;
|
||||
return eval_msb(arg.value());
|
||||
}
|
||||
|
||||
template <class Backend>
|
||||
inline bool eval_bit_test(const debug_adaptor<Backend>& arg, unsigned a)
|
||||
inline bool eval_bit_test(const debug_adaptor<Backend>& arg, std::size_t a)
|
||||
{
|
||||
using default_ops::eval_bit_test;
|
||||
return eval_bit_test(arg.value(), a);
|
||||
}
|
||||
|
||||
template <class Backend>
|
||||
inline void eval_bit_set(const debug_adaptor<Backend>& arg, unsigned a)
|
||||
inline void eval_bit_set(const debug_adaptor<Backend>& arg, std::size_t a)
|
||||
{
|
||||
using default_ops::eval_bit_set;
|
||||
eval_bit_set(arg.value(), a);
|
||||
arg.update_view();
|
||||
}
|
||||
template <class Backend>
|
||||
inline void eval_bit_unset(const debug_adaptor<Backend>& arg, unsigned a)
|
||||
inline void eval_bit_unset(const debug_adaptor<Backend>& arg, std::size_t a)
|
||||
{
|
||||
using default_ops::eval_bit_unset;
|
||||
eval_bit_unset(arg.value(), a);
|
||||
arg.update_view();
|
||||
}
|
||||
template <class Backend>
|
||||
inline void eval_bit_flip(const debug_adaptor<Backend>& arg, unsigned a)
|
||||
inline void eval_bit_flip(const debug_adaptor<Backend>& arg, std::size_t a)
|
||||
{
|
||||
using default_ops::eval_bit_flip;
|
||||
eval_bit_flip(arg.value(), a);
|
||||
|
||||
@@ -20,9 +20,9 @@
|
||||
namespace boost { namespace multiprecision { namespace detail {
|
||||
|
||||
template <class Unsigned>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR unsigned find_lsb_default(Unsigned mask)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb_default(Unsigned mask)
|
||||
{
|
||||
unsigned result = 0;
|
||||
std::size_t result = 0;
|
||||
while (!(mask & 1u))
|
||||
{
|
||||
mask >>= 1;
|
||||
@@ -32,9 +32,9 @@ inline BOOST_MP_CXX14_CONSTEXPR unsigned find_lsb_default(Unsigned mask)
|
||||
}
|
||||
|
||||
template <class Unsigned>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR unsigned find_msb_default(Unsigned mask)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb_default(Unsigned mask)
|
||||
{
|
||||
unsigned index = 0;
|
||||
std::size_t index = 0;
|
||||
while (mask)
|
||||
{
|
||||
++index;
|
||||
@@ -44,13 +44,13 @@ inline BOOST_MP_CXX14_CONSTEXPR unsigned find_msb_default(Unsigned mask)
|
||||
}
|
||||
|
||||
template <class Unsigned>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR unsigned find_lsb(Unsigned mask, const std::integral_constant<int, 0>&)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb(Unsigned mask, const std::integral_constant<int, 0>&)
|
||||
{
|
||||
return find_lsb_default(mask);
|
||||
}
|
||||
|
||||
template <class Unsigned>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR unsigned find_msb(Unsigned mask, const std::integral_constant<int, 0>&)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb(Unsigned mask, const std::integral_constant<int, 0>&)
|
||||
{
|
||||
return find_msb_default(mask);
|
||||
}
|
||||
@@ -59,14 +59,14 @@ inline BOOST_MP_CXX14_CONSTEXPR unsigned find_msb(Unsigned mask, const std::inte
|
||||
|
||||
#pragma intrinsic(_BitScanForward, _BitScanReverse)
|
||||
|
||||
BOOST_FORCEINLINE unsigned find_lsb(unsigned long mask, const std::integral_constant<int, 1>&)
|
||||
BOOST_FORCEINLINE std::size_t find_lsb(unsigned long mask, const std::integral_constant<int, 1>&)
|
||||
{
|
||||
unsigned long result;
|
||||
_BitScanForward(&result, mask);
|
||||
return result;
|
||||
}
|
||||
|
||||
BOOST_FORCEINLINE unsigned find_msb(unsigned long mask, const std::integral_constant<int, 1>&)
|
||||
BOOST_FORCEINLINE std::size_t find_msb(unsigned long mask, const std::integral_constant<int, 1>&)
|
||||
{
|
||||
unsigned long result;
|
||||
_BitScanReverse(&result, mask);
|
||||
@@ -76,14 +76,14 @@ BOOST_FORCEINLINE unsigned find_msb(unsigned long mask, const std::integral_cons
|
||||
|
||||
#pragma intrinsic(_BitScanForward64, _BitScanReverse64)
|
||||
|
||||
BOOST_FORCEINLINE unsigned find_lsb(unsigned __int64 mask, const std::integral_constant<int, 2>&)
|
||||
BOOST_FORCEINLINE std::size_t find_lsb(unsigned __int64 mask, const std::integral_constant<int, 2>&)
|
||||
{
|
||||
unsigned long result;
|
||||
_BitScanForward64(&result, mask);
|
||||
return result;
|
||||
}
|
||||
template <class Unsigned>
|
||||
BOOST_FORCEINLINE unsigned find_msb(Unsigned mask, const std::integral_constant<int, 2>&)
|
||||
BOOST_FORCEINLINE std::size_t find_msb(Unsigned mask, const std::integral_constant<int, 2>&)
|
||||
{
|
||||
unsigned long result;
|
||||
_BitScanReverse64(&result, mask);
|
||||
@@ -92,7 +92,7 @@ BOOST_FORCEINLINE unsigned find_msb(Unsigned mask, const std::integral_constant<
|
||||
#endif
|
||||
|
||||
template <class Unsigned>
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_lsb(Unsigned mask)
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb(Unsigned mask)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;
|
||||
using tag_type = typename std::conditional<
|
||||
@@ -118,7 +118,7 @@ BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_lsb(Unsigned mask)
|
||||
}
|
||||
|
||||
template <class Unsigned>
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_msb(Unsigned mask)
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb(Unsigned mask)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;
|
||||
using tag_type = typename std::conditional<
|
||||
@@ -145,27 +145,27 @@ BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_msb(Unsigned mask)
|
||||
|
||||
#elif defined(BOOST_GCC) || defined(__clang__) || (defined(BOOST_INTEL) && defined(__GNUC__))
|
||||
|
||||
BOOST_FORCEINLINE unsigned find_lsb(unsigned mask, std::integral_constant<int, 1> const&)
|
||||
BOOST_FORCEINLINE std::size_t find_lsb(std::size_t mask, std::integral_constant<int, 1> const&)
|
||||
{
|
||||
return __builtin_ctz(mask);
|
||||
}
|
||||
BOOST_FORCEINLINE unsigned find_lsb(unsigned long mask, std::integral_constant<int, 2> const&)
|
||||
BOOST_FORCEINLINE std::size_t find_lsb(unsigned long mask, std::integral_constant<int, 2> const&)
|
||||
{
|
||||
return __builtin_ctzl(mask);
|
||||
}
|
||||
BOOST_FORCEINLINE unsigned find_lsb(unsigned long long mask, std::integral_constant<int, 3> const&)
|
||||
BOOST_FORCEINLINE std::size_t find_lsb(unsigned long long mask, std::integral_constant<int, 3> const&)
|
||||
{
|
||||
return __builtin_ctzll(mask);
|
||||
}
|
||||
BOOST_FORCEINLINE unsigned find_msb(unsigned mask, std::integral_constant<int, 1> const&)
|
||||
BOOST_FORCEINLINE std::size_t find_msb(std::size_t mask, std::integral_constant<int, 1> const&)
|
||||
{
|
||||
return sizeof(unsigned) * CHAR_BIT - 1 - __builtin_clz(mask);
|
||||
}
|
||||
BOOST_FORCEINLINE unsigned find_msb(unsigned long mask, std::integral_constant<int, 2> const&)
|
||||
BOOST_FORCEINLINE std::size_t find_msb(unsigned long mask, std::integral_constant<int, 2> const&)
|
||||
{
|
||||
return sizeof(unsigned long) * CHAR_BIT - 1 - __builtin_clzl(mask);
|
||||
}
|
||||
BOOST_FORCEINLINE unsigned find_msb(unsigned long long mask, std::integral_constant<int, 3> const&)
|
||||
BOOST_FORCEINLINE std::size_t find_msb(unsigned long long mask, std::integral_constant<int, 3> const&)
|
||||
{
|
||||
return sizeof(unsigned long long) * CHAR_BIT - 1 - __builtin_clzll(mask);
|
||||
}
|
||||
@@ -173,7 +173,7 @@ BOOST_FORCEINLINE unsigned find_msb(unsigned long long mask, std::integral_const
|
||||
|
||||
__extension__ using uint128_type = unsigned __int128;
|
||||
|
||||
BOOST_FORCEINLINE unsigned find_msb(uint128_type mask, std::integral_constant<int, 0> const&)
|
||||
BOOST_FORCEINLINE std::size_t find_msb(uint128_type mask, std::integral_constant<int, 0> const&)
|
||||
{
|
||||
union
|
||||
{
|
||||
@@ -191,7 +191,7 @@ BOOST_FORCEINLINE unsigned find_msb(uint128_type mask, std::integral_constant<in
|
||||
return find_msb(val.sv[1], std::integral_constant<int, 3>());
|
||||
#endif
|
||||
}
|
||||
BOOST_FORCEINLINE unsigned find_lsb(uint128_type mask, std::integral_constant<int, 0> const&)
|
||||
BOOST_FORCEINLINE std::size_t find_lsb(uint128_type mask, std::integral_constant<int, 0> const&)
|
||||
{
|
||||
union
|
||||
{
|
||||
@@ -212,7 +212,7 @@ BOOST_FORCEINLINE unsigned find_lsb(uint128_type mask, std::integral_constant<in
|
||||
#endif
|
||||
|
||||
template <class Unsigned>
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_lsb(Unsigned mask)
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb(Unsigned mask)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;
|
||||
using tag_type = typename std::conditional<
|
||||
@@ -235,7 +235,7 @@ BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_lsb(Unsigned mask)
|
||||
return find_lsb(static_cast<ui_type>(mask), tag_type());
|
||||
}
|
||||
template <class Unsigned>
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_msb(Unsigned mask)
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb(Unsigned mask)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;
|
||||
using tag_type = typename std::conditional<
|
||||
@@ -258,16 +258,16 @@ BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_msb(Unsigned mask)
|
||||
return find_msb(static_cast<ui_type>(mask), tag_type());
|
||||
}
|
||||
#elif defined(BOOST_INTEL)
|
||||
BOOST_FORCEINLINE unsigned find_lsb(unsigned mask, std::integral_constant<int, 1> const&)
|
||||
BOOST_FORCEINLINE std::size_t find_lsb(std::size_t mask, std::integral_constant<int, 1> const&)
|
||||
{
|
||||
return _bit_scan_forward(mask);
|
||||
}
|
||||
BOOST_FORCEINLINE unsigned find_msb(unsigned mask, std::integral_constant<int, 1> const&)
|
||||
BOOST_FORCEINLINE std::size_t find_msb(std::size_t mask, std::integral_constant<int, 1> const&)
|
||||
{
|
||||
return _bit_scan_reverse(mask);
|
||||
}
|
||||
template <class Unsigned>
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_lsb(Unsigned mask)
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb(Unsigned mask)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;
|
||||
using tag_type = typename std::conditional<
|
||||
@@ -284,7 +284,7 @@ BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_lsb(Unsigned mask)
|
||||
return find_lsb(static_cast<ui_type>(mask), tag_type());
|
||||
}
|
||||
template <class Unsigned>
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_msb(Unsigned mask)
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb(Unsigned mask)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::make_unsigned<Unsigned>::type;
|
||||
using tag_type = typename std::conditional<
|
||||
@@ -302,12 +302,12 @@ BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_msb(Unsigned mask)
|
||||
}
|
||||
#else
|
||||
template <class Unsigned>
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_lsb(Unsigned mask)
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_lsb(Unsigned mask)
|
||||
{
|
||||
return find_lsb(mask, std::integral_constant<int, 0>());
|
||||
}
|
||||
template <class Unsigned>
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR unsigned find_msb(Unsigned mask)
|
||||
BOOST_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR std::size_t find_msb(Unsigned mask)
|
||||
{
|
||||
return find_msb(mask, std::integral_constant<int, 0>());
|
||||
}
|
||||
|
||||
@@ -1566,7 +1566,7 @@ inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::d
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR unsigned eval_lsb(const T& val)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR std::size_t eval_lsb(const T& val)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;
|
||||
int c = eval_get_sign(val);
|
||||
@@ -1578,7 +1578,7 @@ inline BOOST_MP_CXX14_CONSTEXPR unsigned eval_lsb(const T& val)
|
||||
{
|
||||
BOOST_MP_THROW_EXCEPTION(std::domain_error("Testing individual bits in negative values is not supported - results are undefined."));
|
||||
}
|
||||
unsigned result = 0;
|
||||
std::size_t result = 0;
|
||||
T mask, t;
|
||||
mask = ui_type(1);
|
||||
do
|
||||
@@ -1592,7 +1592,7 @@ inline BOOST_MP_CXX14_CONSTEXPR unsigned eval_lsb(const T& val)
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR int eval_msb(const T& val)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR std::ptrdiff_t eval_msb(const T& val)
|
||||
{
|
||||
int c = eval_get_sign(val);
|
||||
if (c == 0)
|
||||
@@ -1611,7 +1611,7 @@ inline BOOST_MP_CXX14_CONSTEXPR int eval_msb(const T& val)
|
||||
// backends it's likely that there will always be a more efficient
|
||||
// native implementation possible.
|
||||
//
|
||||
unsigned result = 0;
|
||||
std::size_t result = 0;
|
||||
T t(val);
|
||||
while (!eval_is_zero(t))
|
||||
{
|
||||
@@ -1622,7 +1622,7 @@ inline BOOST_MP_CXX14_CONSTEXPR int eval_msb(const T& val)
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR bool eval_bit_test(const T& val, unsigned index)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR bool eval_bit_test(const T& val, std::size_t index)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;
|
||||
T mask, t;
|
||||
@@ -1633,7 +1633,7 @@ inline BOOST_MP_CXX14_CONSTEXPR bool eval_bit_test(const T& val, unsigned index)
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void eval_bit_set(T& val, unsigned index)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void eval_bit_set(T& val, std::size_t index)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;
|
||||
T mask;
|
||||
@@ -1643,7 +1643,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void eval_bit_set(T& val, unsigned index)
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void eval_bit_flip(T& val, unsigned index)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void eval_bit_flip(T& val, std::size_t index)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;
|
||||
T mask;
|
||||
@@ -1653,7 +1653,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void eval_bit_flip(T& val, unsigned index)
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void eval_bit_unset(T& val, unsigned index)
|
||||
inline BOOST_MP_CXX14_CONSTEXPR void eval_bit_unset(T& val, std::size_t index)
|
||||
{
|
||||
using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;
|
||||
T mask, t;
|
||||
@@ -1761,7 +1761,7 @@ void BOOST_MP_CXX14_CONSTEXPR eval_integer_sqrt_bitwise(B& s, B& r, const B& x)
|
||||
r = ui_type(0u);
|
||||
return;
|
||||
}
|
||||
int g = eval_msb(x);
|
||||
std::ptrdiff_t g = eval_msb(x);
|
||||
if (g <= 1)
|
||||
{
|
||||
s = ui_type(1);
|
||||
@@ -1772,14 +1772,14 @@ void BOOST_MP_CXX14_CONSTEXPR eval_integer_sqrt_bitwise(B& s, B& r, const B& x)
|
||||
B t;
|
||||
r = x;
|
||||
g /= 2;
|
||||
int org_g = g;
|
||||
std::ptrdiff_t org_g = g;
|
||||
eval_bit_set(s, g);
|
||||
eval_bit_set(t, 2 * g);
|
||||
eval_subtract(r, x, t);
|
||||
--g;
|
||||
if (eval_get_sign(r) == 0)
|
||||
return;
|
||||
int msbr = eval_msb(r);
|
||||
std::ptrdiff_t msbr = eval_msb(r);
|
||||
do
|
||||
{
|
||||
if (msbr >= org_g + g + 1)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
namespace boost { namespace multiprecision { namespace detail {
|
||||
|
||||
template <class I>
|
||||
inline void round_string_up_at(std::string& s, int pos, I& expon)
|
||||
inline void round_string_up_at(std::string& s, std::ptrdiff_t pos, I& expon)
|
||||
{
|
||||
//
|
||||
// Rounds up a string representation of a number at pos:
|
||||
|
||||
@@ -258,7 +258,7 @@ R safe_convert_to_float(const LargeInteger& i)
|
||||
{
|
||||
LargeInteger val(i);
|
||||
make_positive(val);
|
||||
unsigned mb = msb(val);
|
||||
std::size_t mb = msb(val);
|
||||
if (mb >= std::numeric_limits<R>::max_exponent)
|
||||
{
|
||||
int scale_factor = (int)mb + 1 - std::numeric_limits<R>::max_exponent;
|
||||
@@ -330,15 +330,15 @@ generic_convert_rational_to_float_imp(To& result, Integer& num, Integer& denom,
|
||||
s = true;
|
||||
num = -num;
|
||||
}
|
||||
int denom_bits = msb(denom);
|
||||
int shift = std::numeric_limits<To>::digits + denom_bits - msb(num);
|
||||
std::ptrdiff_t denom_bits = msb(denom);
|
||||
std::ptrdiff_t shift = std::numeric_limits<To>::digits + denom_bits - msb(num);
|
||||
if (shift > 0)
|
||||
num <<= shift;
|
||||
else if (shift < 0)
|
||||
denom <<= boost::multiprecision::detail::unsigned_abs(shift);
|
||||
Integer q, r;
|
||||
divide_qr(num, denom, q, r);
|
||||
int q_bits = msb(q);
|
||||
std::ptrdiff_t q_bits = msb(q);
|
||||
if (q_bits == std::numeric_limits<To>::digits - 1)
|
||||
{
|
||||
//
|
||||
@@ -367,7 +367,7 @@ generic_convert_rational_to_float_imp(To& result, Integer& num, Integer& denom,
|
||||
}
|
||||
using std::ldexp;
|
||||
result = do_cast<To>(q);
|
||||
result = ldexp(result, -shift);
|
||||
result = ldexp(result, (int)-shift);
|
||||
if (s)
|
||||
result = -result;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void eval_gcd(B& result, const B& a, const B& b)
|
||||
using default_ops::eval_is_zero;
|
||||
using default_ops::eval_lsb;
|
||||
|
||||
int shift(0);
|
||||
std::ptrdiff_t shift(0);
|
||||
|
||||
B u(a), v(b);
|
||||
|
||||
@@ -71,8 +71,8 @@ inline BOOST_MP_CXX14_CONSTEXPR void eval_gcd(B& result, const B& a, const B& b)
|
||||
/* Let shift := lg K, where K is the greatest power of 2
|
||||
dividing both u and v. */
|
||||
|
||||
unsigned us = eval_lsb(u);
|
||||
unsigned vs = eval_lsb(v);
|
||||
std::size_t us = eval_lsb(u);
|
||||
std::size_t vs = eval_lsb(v);
|
||||
shift = (std::min)(us, vs);
|
||||
eval_right_shift(u, us);
|
||||
eval_right_shift(v, vs);
|
||||
@@ -167,7 +167,7 @@ integer_modulus(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x
|
||||
}
|
||||
|
||||
template <class Backend, expression_template_option ExpressionTemplates>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, unsigned>::type
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, std::size_t>::type
|
||||
lsb(const number<Backend, ExpressionTemplates>& x)
|
||||
{
|
||||
using default_ops::eval_lsb;
|
||||
@@ -175,7 +175,7 @@ lsb(const number<Backend, ExpressionTemplates>& x)
|
||||
}
|
||||
|
||||
template <class tag, class A1, class A2, class A3, class A4>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, unsigned>::type
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, std::size_t>::type
|
||||
lsb(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x)
|
||||
{
|
||||
using number_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;
|
||||
@@ -185,7 +185,7 @@ lsb(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x)
|
||||
}
|
||||
|
||||
template <class Backend, expression_template_option ExpressionTemplates>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, unsigned>::type
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, std::size_t>::type
|
||||
msb(const number<Backend, ExpressionTemplates>& x)
|
||||
{
|
||||
using default_ops::eval_msb;
|
||||
@@ -193,7 +193,7 @@ msb(const number<Backend, ExpressionTemplates>& x)
|
||||
}
|
||||
|
||||
template <class tag, class A1, class A2, class A3, class A4>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, unsigned>::type
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, std::size_t>::type
|
||||
msb(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x)
|
||||
{
|
||||
using number_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;
|
||||
@@ -204,7 +204,7 @@ msb(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x)
|
||||
|
||||
template <class Backend, expression_template_option ExpressionTemplates>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, bool>::type
|
||||
bit_test(const number<Backend, ExpressionTemplates>& x, unsigned index)
|
||||
bit_test(const number<Backend, ExpressionTemplates>& x, std::size_t index)
|
||||
{
|
||||
using default_ops::eval_bit_test;
|
||||
return eval_bit_test(x.backend(), index);
|
||||
@@ -212,7 +212,7 @@ bit_test(const number<Backend, ExpressionTemplates>& x, unsigned index)
|
||||
|
||||
template <class tag, class A1, class A2, class A3, class A4>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, bool>::type
|
||||
bit_test(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, unsigned index)
|
||||
bit_test(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, std::size_t index)
|
||||
{
|
||||
using number_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;
|
||||
number_type n(x);
|
||||
@@ -222,7 +222,7 @@ bit_test(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, unsig
|
||||
|
||||
template <class Backend, expression_template_option ExpressionTemplates>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, number<Backend, ExpressionTemplates>&>::type
|
||||
bit_set(number<Backend, ExpressionTemplates>& x, unsigned index)
|
||||
bit_set(number<Backend, ExpressionTemplates>& x, std::size_t index)
|
||||
{
|
||||
using default_ops::eval_bit_set;
|
||||
eval_bit_set(x.backend(), index);
|
||||
@@ -231,7 +231,7 @@ bit_set(number<Backend, ExpressionTemplates>& x, unsigned index)
|
||||
|
||||
template <class Backend, expression_template_option ExpressionTemplates>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, number<Backend, ExpressionTemplates>&>::type
|
||||
bit_unset(number<Backend, ExpressionTemplates>& x, unsigned index)
|
||||
bit_unset(number<Backend, ExpressionTemplates>& x, std::size_t index)
|
||||
{
|
||||
using default_ops::eval_bit_unset;
|
||||
eval_bit_unset(x.backend(), index);
|
||||
@@ -240,7 +240,7 @@ bit_unset(number<Backend, ExpressionTemplates>& x, unsigned index)
|
||||
|
||||
template <class Backend, expression_template_option ExpressionTemplates>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, number<Backend, ExpressionTemplates>&>::type
|
||||
bit_flip(number<Backend, ExpressionTemplates>& x, unsigned index)
|
||||
bit_flip(number<Backend, ExpressionTemplates>& x, std::size_t index)
|
||||
{
|
||||
using default_ops::eval_bit_flip;
|
||||
eval_bit_flip(x.backend(), index);
|
||||
|
||||
@@ -27,7 +27,7 @@ inline BOOST_MP_CXX14_CONSTEXPR unsigned current_precision_of_last_chance_imp(co
|
||||
// least-significant-bit, ie the number of bits required to represent the
|
||||
// the value assuming we will have an exponent to shift things by:
|
||||
//
|
||||
return val.is_zero() ? 1 : 1 + digits2_2_10(msb(abs(val)) - lsb(abs(val)) + 1);
|
||||
return static_cast<unsigned>(val.is_zero() ? 1 : 1 + digits2_2_10(msb(abs(val)) - lsb(abs(val)) + 1));
|
||||
}
|
||||
template <class B, boost::multiprecision::expression_template_option ET>
|
||||
inline BOOST_MP_CXX14_CONSTEXPR unsigned current_precision_of_last_chance_imp(const boost::multiprecision::number<B, ET>& val, const std::integral_constant<int, 2>&)
|
||||
|
||||
@@ -2020,7 +2020,7 @@ inline void eval_integer_sqrt(gmp_int& s, gmp_int& r, const gmp_int& x)
|
||||
mpz_sqrtrem(s.data(), r.data(), x.data());
|
||||
}
|
||||
|
||||
inline unsigned eval_lsb(const gmp_int& val)
|
||||
inline std::size_t eval_lsb(const gmp_int& val)
|
||||
{
|
||||
int c = eval_get_sign(val);
|
||||
if (c == 0)
|
||||
@@ -2034,7 +2034,7 @@ inline unsigned eval_lsb(const gmp_int& val)
|
||||
return static_cast<unsigned>(mpz_scan1(val.data(), 0));
|
||||
}
|
||||
|
||||
inline unsigned eval_msb(const gmp_int& val)
|
||||
inline std::size_t eval_msb(const gmp_int& val)
|
||||
{
|
||||
int c = eval_get_sign(val);
|
||||
if (c == 0)
|
||||
@@ -2048,22 +2048,22 @@ inline unsigned eval_msb(const gmp_int& val)
|
||||
return static_cast<unsigned>(mpz_sizeinbase(val.data(), 2) - 1);
|
||||
}
|
||||
|
||||
inline bool eval_bit_test(const gmp_int& val, unsigned index)
|
||||
inline bool eval_bit_test(const gmp_int& val, std::size_t index)
|
||||
{
|
||||
return mpz_tstbit(val.data(), index) ? true : false;
|
||||
}
|
||||
|
||||
inline void eval_bit_set(gmp_int& val, unsigned index)
|
||||
inline void eval_bit_set(gmp_int& val, std::size_t index)
|
||||
{
|
||||
mpz_setbit(val.data(), index);
|
||||
}
|
||||
|
||||
inline void eval_bit_unset(gmp_int& val, unsigned index)
|
||||
inline void eval_bit_unset(gmp_int& val, std::size_t index)
|
||||
{
|
||||
mpz_clrbit(val.data(), index);
|
||||
}
|
||||
|
||||
inline void eval_bit_flip(gmp_int& val, unsigned index)
|
||||
inline void eval_bit_flip(gmp_int& val, std::size_t index)
|
||||
{
|
||||
mpz_combit(val.data(), index);
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ powm(const I1& a, I2 b, I3 c)
|
||||
}
|
||||
|
||||
template <class Integer>
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, unsigned>::type lsb(const Integer& val)
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, std::size_t>::type lsb(const Integer& val)
|
||||
{
|
||||
if (val <= 0)
|
||||
{
|
||||
@@ -129,7 +129,7 @@ BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::
|
||||
}
|
||||
|
||||
template <class Integer>
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, unsigned>::type msb(Integer val)
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, std::size_t>::type msb(Integer val)
|
||||
{
|
||||
if (val <= 0)
|
||||
{
|
||||
@@ -146,7 +146,7 @@ BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::
|
||||
}
|
||||
|
||||
template <class Integer>
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, bool>::type bit_test(const Integer& val, unsigned index)
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, bool>::type bit_test(const Integer& val, std::size_t index)
|
||||
{
|
||||
Integer mask = 1;
|
||||
if (index >= sizeof(Integer) * CHAR_BIT)
|
||||
@@ -157,7 +157,7 @@ BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::
|
||||
}
|
||||
|
||||
template <class Integer>
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer&>::type bit_set(Integer& val, unsigned index)
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer&>::type bit_set(Integer& val, std::size_t index)
|
||||
{
|
||||
Integer mask = 1;
|
||||
if (index >= sizeof(Integer) * CHAR_BIT)
|
||||
@@ -169,7 +169,7 @@ BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::
|
||||
}
|
||||
|
||||
template <class Integer>
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer&>::type bit_unset(Integer& val, unsigned index)
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer&>::type bit_unset(Integer& val, std::size_t index)
|
||||
{
|
||||
Integer mask = 1;
|
||||
if (index >= sizeof(Integer) * CHAR_BIT)
|
||||
@@ -181,7 +181,7 @@ BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::
|
||||
}
|
||||
|
||||
template <class Integer>
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer&>::type bit_flip(Integer& val, unsigned index)
|
||||
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value, Integer&>::type bit_flip(Integer& val, std::size_t index)
|
||||
{
|
||||
Integer mask = 1;
|
||||
if (index >= sizeof(Integer) * CHAR_BIT)
|
||||
@@ -288,7 +288,7 @@ BOOST_MP_CXX14_CONSTEXPR Integer bitwise_sqrt(const Integer& x, Integer& r)
|
||||
r = 0;
|
||||
return s;
|
||||
}
|
||||
int g = msb(x);
|
||||
std::ptrdiff_t g = msb(x);
|
||||
if (g == 0)
|
||||
{
|
||||
r = 1;
|
||||
|
||||
@@ -530,37 +530,37 @@ inline void eval_right_shift(logged_adaptor<Backend>& arg, const logged_adaptor<
|
||||
}
|
||||
|
||||
template <class Backend, class T>
|
||||
inline unsigned eval_integer_modulus(const logged_adaptor<Backend>& arg, const T& a)
|
||||
inline T eval_integer_modulus(const logged_adaptor<Backend>& arg, const T& a)
|
||||
{
|
||||
using default_ops::eval_integer_modulus;
|
||||
log_prefix_event(arg.value(), a, "integer-modulus");
|
||||
unsigned r = eval_integer_modulus(arg.value(), a);
|
||||
T r = eval_integer_modulus(arg.value(), a);
|
||||
log_postfix_event(arg.value(), r, "integer-modulus");
|
||||
return r;
|
||||
}
|
||||
|
||||
template <class Backend>
|
||||
inline unsigned eval_lsb(const logged_adaptor<Backend>& arg)
|
||||
inline std::size_t eval_lsb(const logged_adaptor<Backend>& arg)
|
||||
{
|
||||
using default_ops::eval_lsb;
|
||||
log_prefix_event(arg.value(), "least-significant-bit");
|
||||
unsigned r = eval_lsb(arg.value());
|
||||
std::size_t r = eval_lsb(arg.value());
|
||||
log_postfix_event(arg.value(), r, "least-significant-bit");
|
||||
return r;
|
||||
}
|
||||
|
||||
template <class Backend>
|
||||
inline unsigned eval_msb(const logged_adaptor<Backend>& arg)
|
||||
inline std::size_t eval_msb(const logged_adaptor<Backend>& arg)
|
||||
{
|
||||
using default_ops::eval_msb;
|
||||
log_prefix_event(arg.value(), "most-significant-bit");
|
||||
unsigned r = eval_msb(arg.value());
|
||||
std::size_t r = eval_msb(arg.value());
|
||||
log_postfix_event(arg.value(), r, "most-significant-bit");
|
||||
return r;
|
||||
}
|
||||
|
||||
template <class Backend>
|
||||
inline bool eval_bit_test(const logged_adaptor<Backend>& arg, unsigned a)
|
||||
inline bool eval_bit_test(const logged_adaptor<Backend>& arg, std::size_t a)
|
||||
{
|
||||
using default_ops::eval_bit_test;
|
||||
log_prefix_event(arg.value(), a, "bit-test");
|
||||
@@ -570,7 +570,7 @@ inline bool eval_bit_test(const logged_adaptor<Backend>& arg, unsigned a)
|
||||
}
|
||||
|
||||
template <class Backend>
|
||||
inline void eval_bit_set(const logged_adaptor<Backend>& arg, unsigned a)
|
||||
inline void eval_bit_set(const logged_adaptor<Backend>& arg, std::size_t a)
|
||||
{
|
||||
using default_ops::eval_bit_set;
|
||||
log_prefix_event(arg.value(), a, "bit-set");
|
||||
@@ -578,7 +578,7 @@ inline void eval_bit_set(const logged_adaptor<Backend>& arg, unsigned a)
|
||||
log_postfix_event(arg.value(), arg, "bit-set");
|
||||
}
|
||||
template <class Backend>
|
||||
inline void eval_bit_unset(const logged_adaptor<Backend>& arg, unsigned a)
|
||||
inline void eval_bit_unset(const logged_adaptor<Backend>& arg, std::size_t a)
|
||||
{
|
||||
using default_ops::eval_bit_unset;
|
||||
log_prefix_event(arg.value(), a, "bit-unset");
|
||||
@@ -586,7 +586,7 @@ inline void eval_bit_unset(const logged_adaptor<Backend>& arg, unsigned a)
|
||||
log_postfix_event(arg.value(), arg, "bit-unset");
|
||||
}
|
||||
template <class Backend>
|
||||
inline void eval_bit_flip(const logged_adaptor<Backend>& arg, unsigned a)
|
||||
inline void eval_bit_flip(const logged_adaptor<Backend>& arg, std::size_t a)
|
||||
{
|
||||
using default_ops::eval_bit_flip;
|
||||
log_prefix_event(arg.value(), a, "bit-flip");
|
||||
|
||||
@@ -27,7 +27,7 @@ bool check_small_factors(const I& n)
|
||||
|
||||
std::uint32_t m1 = integer_modulus(n, pp1);
|
||||
|
||||
for (unsigned i = 0; i < sizeof(small_factors1) / sizeof(small_factors1[0]); ++i)
|
||||
for (std::size_t i = 0; i < sizeof(small_factors1) / sizeof(small_factors1[0]); ++i)
|
||||
{
|
||||
BOOST_MP_ASSERT(pp1 % small_factors1[i] == 0);
|
||||
if (m1 % small_factors1[i] == 0)
|
||||
@@ -40,7 +40,7 @@ bool check_small_factors(const I& n)
|
||||
|
||||
m1 = integer_modulus(n, pp2);
|
||||
|
||||
for (unsigned i = 0; i < sizeof(small_factors2) / sizeof(small_factors2[0]); ++i)
|
||||
for (std::size_t i = 0; i < sizeof(small_factors2) / sizeof(small_factors2[0]); ++i)
|
||||
{
|
||||
BOOST_MP_ASSERT(pp2 % small_factors2[i] == 0);
|
||||
if (m1 % small_factors2[i] == 0)
|
||||
@@ -53,7 +53,7 @@ bool check_small_factors(const I& n)
|
||||
|
||||
m1 = integer_modulus(n, pp3);
|
||||
|
||||
for (unsigned i = 0; i < sizeof(small_factors3) / sizeof(small_factors3[0]); ++i)
|
||||
for (std::size_t i = 0; i < sizeof(small_factors3) / sizeof(small_factors3[0]); ++i)
|
||||
{
|
||||
BOOST_MP_ASSERT(pp3 % small_factors3[i] == 0);
|
||||
if (m1 % small_factors3[i] == 0)
|
||||
@@ -66,7 +66,7 @@ bool check_small_factors(const I& n)
|
||||
|
||||
m1 = integer_modulus(n, pp4);
|
||||
|
||||
for (unsigned i = 0; i < sizeof(small_factors4) / sizeof(small_factors4[0]); ++i)
|
||||
for (std::size_t i = 0; i < sizeof(small_factors4) / sizeof(small_factors4[0]); ++i)
|
||||
{
|
||||
BOOST_MP_ASSERT(pp4 % small_factors4[i] == 0);
|
||||
if (m1 % small_factors4[i] == 0)
|
||||
@@ -89,11 +89,11 @@ bool check_small_factors(const I& n)
|
||||
181u * 191u * 193u * 197u,
|
||||
199u * 211u * 223u * 227u};
|
||||
|
||||
for (unsigned k = 0; k < sizeof(pp5) / sizeof(*pp5); ++k)
|
||||
for (std::size_t k = 0; k < sizeof(pp5) / sizeof(*pp5); ++k)
|
||||
{
|
||||
m1 = integer_modulus(n, pp5[k]);
|
||||
|
||||
for (unsigned i = 0; i < 4; ++i)
|
||||
for (std::size_t i = 0; i < 4; ++i)
|
||||
{
|
||||
BOOST_MP_ASSERT(pp5[k] % small_factors5[k][i] == 0);
|
||||
if (m1 % small_factors5[k][i] == 0)
|
||||
@@ -103,7 +103,7 @@ bool check_small_factors(const I& n)
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool is_small_prime(unsigned n)
|
||||
inline bool is_small_prime(std::size_t n)
|
||||
{
|
||||
constexpr const unsigned char p[] =
|
||||
{
|
||||
@@ -113,7 +113,7 @@ inline bool is_small_prime(unsigned n)
|
||||
127u, 131u, 137u, 139u, 149u, 151u, 157u, 163u,
|
||||
167u, 173u, 179u, 181u, 191u, 193u, 197u, 199u,
|
||||
211u, 223u, 227u};
|
||||
for (unsigned i = 0; i < sizeof(p) / sizeof(*p); ++i)
|
||||
for (std::size_t i = 0; i < sizeof(p) / sizeof(*p); ++i)
|
||||
{
|
||||
if (n == p[i])
|
||||
return true;
|
||||
@@ -138,7 +138,7 @@ cast_to_unsigned(const I& val)
|
||||
|
||||
template <class I, class Engine>
|
||||
typename std::enable_if<number_category<I>::value == number_kind_integer, bool>::type
|
||||
miller_rabin_test(const I& n, unsigned trials, Engine& gen)
|
||||
miller_rabin_test(const I& n, std::size_t trials, Engine& gen)
|
||||
{
|
||||
using number_type = I;
|
||||
|
||||
@@ -162,7 +162,7 @@ miller_rabin_test(const I& n, unsigned trials, Engine& gen)
|
||||
return false;
|
||||
|
||||
q = n - 1;
|
||||
unsigned k = lsb(q);
|
||||
std::size_t k = lsb(q);
|
||||
q >>= k;
|
||||
|
||||
// Declare our random number generator:
|
||||
@@ -171,11 +171,11 @@ miller_rabin_test(const I& n, unsigned trials, Engine& gen)
|
||||
//
|
||||
// Execute the trials:
|
||||
//
|
||||
for (unsigned i = 0; i < trials; ++i)
|
||||
for (std::size_t i = 0; i < trials; ++i)
|
||||
{
|
||||
x = dist(gen);
|
||||
y = powm(x, q, n);
|
||||
unsigned j = 0;
|
||||
std::size_t j = 0;
|
||||
while (true)
|
||||
{
|
||||
if (y == nm1)
|
||||
@@ -196,21 +196,21 @@ miller_rabin_test(const I& n, unsigned trials, Engine& gen)
|
||||
|
||||
template <class I>
|
||||
typename std::enable_if<number_category<I>::value == number_kind_integer, bool>::type
|
||||
miller_rabin_test(const I& x, unsigned trials)
|
||||
miller_rabin_test(const I& x, std::size_t trials)
|
||||
{
|
||||
static std::mt19937 gen;
|
||||
return miller_rabin_test(x, trials, gen);
|
||||
}
|
||||
|
||||
template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class Engine>
|
||||
bool miller_rabin_test(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& n, unsigned trials, Engine& gen)
|
||||
bool miller_rabin_test(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& n, std::size_t trials, Engine& gen)
|
||||
{
|
||||
using number_type = typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type;
|
||||
return miller_rabin_test(number_type(n), trials, gen);
|
||||
}
|
||||
|
||||
template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
|
||||
bool miller_rabin_test(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& n, unsigned trials)
|
||||
bool miller_rabin_test(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& n, std::size_t trials)
|
||||
{
|
||||
using number_type = typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type;
|
||||
return miller_rabin_test(number_type(n), trials);
|
||||
|
||||
@@ -234,8 +234,8 @@ struct rational_adaptor
|
||||
}
|
||||
int compare(const rational_adaptor& o) const
|
||||
{
|
||||
int s1 = eval_get_sign(*this);
|
||||
int s2 = eval_get_sign(o);
|
||||
std::ptrdiff_t s1 = eval_get_sign(*this);
|
||||
std::ptrdiff_t s2 = eval_get_sign(o);
|
||||
if (s1 != s2)
|
||||
{
|
||||
return s1 < s2 ? -1 : 1;
|
||||
|
||||
@@ -795,7 +795,7 @@ inline void eval_qr(const tommath_int& x, const tommath_int& y,
|
||||
detail::check_tommath_result(mp_div(const_cast< ::mp_int*>(&x.data()), const_cast< ::mp_int*>(&y.data()), &q.data(), &r.data()));
|
||||
}
|
||||
|
||||
inline unsigned eval_lsb(const tommath_int& val)
|
||||
inline std::size_t eval_lsb(const tommath_int& val)
|
||||
{
|
||||
int c = eval_get_sign(val);
|
||||
if (c == 0)
|
||||
@@ -809,7 +809,7 @@ inline unsigned eval_lsb(const tommath_int& val)
|
||||
return mp_cnt_lsb(const_cast< ::mp_int*>(&val.data()));
|
||||
}
|
||||
|
||||
inline unsigned eval_msb(const tommath_int& val)
|
||||
inline std::size_t eval_msb(const tommath_int& val)
|
||||
{
|
||||
int c = eval_get_sign(val);
|
||||
if (c == 0)
|
||||
|
||||
@@ -201,25 +201,25 @@ int main()
|
||||
}
|
||||
// lsb:
|
||||
{
|
||||
constexpr int i1 = lsb(si1);
|
||||
constexpr std::size_t i1 = lsb(si1);
|
||||
small_int_backend nc(si1);
|
||||
int nci = lsb(nc);
|
||||
std::size_t nci = lsb(nc);
|
||||
BOOST_CHECK_EQUAL(nci, i1);
|
||||
|
||||
constexpr std::int32_t k = boost::multiprecision::lsb(i);
|
||||
std::int32_t ii(i);
|
||||
constexpr std::size_t k = boost::multiprecision::lsb(i);
|
||||
std::size_t ii(i);
|
||||
ii = boost::multiprecision::lsb(ii);
|
||||
BOOST_CHECK_EQUAL(ii, k);
|
||||
}
|
||||
// msb:
|
||||
{
|
||||
constexpr int i1 = msb(si1);
|
||||
constexpr std::size_t i1 = msb(si1);
|
||||
small_int_backend nc(si1);
|
||||
int nci = msb(nc);
|
||||
std::size_t nci = msb(nc);
|
||||
BOOST_CHECK_EQUAL(nci, i1);
|
||||
|
||||
constexpr std::int32_t k = boost::multiprecision::msb(i);
|
||||
std::int32_t ii(i);
|
||||
constexpr std::size_t k = boost::multiprecision::msb(i);
|
||||
std::size_t ii(i);
|
||||
ii = boost::multiprecision::msb(ii);
|
||||
BOOST_CHECK_EQUAL(ii, k);
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#include <boost/multiprecision/cpp_int.hpp>
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -19,7 +19,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
using type = boost::multiprecision::int256_t;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
using type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET>;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#include <boost/multiprecision/cpp_int.hpp>
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -24,7 +24,7 @@ struct related_type<boost::multiprecision::cpp_rational>
|
||||
{
|
||||
using type = boost::multiprecision::cpp_int;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
using type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET>;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#include <boost/multiprecision/cpp_int.hpp>
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -19,7 +19,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
using type = boost::multiprecision::int256_t;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
using type = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET>;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -16,7 +16,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -16,7 +16,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>
|
||||
{};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -20,7 +20,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>
|
||||
{};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -20,7 +20,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>
|
||||
{};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -20,7 +20,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -16,7 +16,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>
|
||||
{};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -20,7 +20,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>
|
||||
{};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -20,7 +20,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -16,7 +16,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>
|
||||
{};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -20,7 +20,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -16,7 +16,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -16,7 +16,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -18,7 +18,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>
|
||||
{};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -20,7 +20,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -16,7 +16,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -21,7 +21,7 @@ struct related_type<boost::multiprecision::cpp_rational>
|
||||
{
|
||||
typedef boost::multiprecision::cpp_int type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -16,7 +16,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -16,7 +16,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
@@ -19,7 +19,7 @@ struct related_type<boost::multiprecision::cpp_int>
|
||||
{
|
||||
typedef boost::multiprecision::int256_t type;
|
||||
};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
#include "test_arithmetic.hpp"
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public std::integral_constant<bool, false>
|
||||
{};
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ T generate_random(unsigned bits_wanted)
|
||||
template <class T>
|
||||
struct is_checked_cpp_int : public std::integral_constant<bool, false>
|
||||
{};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>
|
||||
{};
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ struct unchecked_type
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct unchecked_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::unchecked, Allocator>, ExpressionTemplates> type;
|
||||
|
||||
@@ -70,7 +70,7 @@ T generate_random(unsigned bits_wanted)
|
||||
template <class T>
|
||||
struct is_checked_cpp_int : public std::integral_constant<bool, false>
|
||||
{};
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET>
|
||||
struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public std::integral_constant<bool, true>
|
||||
{};
|
||||
|
||||
|
||||
+4
-4
@@ -20,7 +20,7 @@
|
||||
// Just exclude that combination from testing for now as it's purely a testing issue
|
||||
// and we have other compilers that cover this sanity check...
|
||||
//
|
||||
#if 1// !(defined(__clang__) && (__cplusplus > 201300))
|
||||
#if !(defined(__clang__) && (__cplusplus > 201300))
|
||||
|
||||
using boost::multiprecision::cpp_int;
|
||||
|
||||
@@ -79,9 +79,9 @@ namespace boost {
|
||||
namespace multiprecision {
|
||||
namespace backends {
|
||||
|
||||
unsigned total_lehmer_gcd_calls = 0;
|
||||
unsigned total_lehmer_gcd_bits_saved = 0;
|
||||
unsigned total_lehmer_gcd_cycles = 0;
|
||||
std::size_t total_lehmer_gcd_calls = 0;
|
||||
std::size_t total_lehmer_gcd_bits_saved = 0;
|
||||
std::size_t total_lehmer_gcd_cycles = 0;
|
||||
|
||||
}}}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ struct unchecked_type
|
||||
};
|
||||
|
||||
#ifdef TEST_CPP_INT
|
||||
template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
template <std::size_t MinBits, std::size_t MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates>
|
||||
struct unchecked_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> >
|
||||
{
|
||||
typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::unchecked, Allocator>, ExpressionTemplates> type;
|
||||
|
||||
Reference in New Issue
Block a user