/usr/include/boost/multiprecision/cpp_int
Edit: /usr/include/boost/multiprecision/cpp_int/comparison.hpp (18352B)
///////////////////////////////////////////////////////////////
// Copyright 2012 John Maddock. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
//
// Comparison operators for cpp_int_backend:
//
#ifndef BOOST_MP_CPP_INT_COMPARISON_HPP
#define BOOST_MP_CPP_INT_COMPARISON_HPP
#include
#include
namespace boost { namespace multiprecision { namespace backends {
#ifdef BOOST_MSVC
#pragma warning(push)
#pragma warning(disable : 4018 4389 4996)
#endif
//
// Start with non-trivial cpp_int's:
//
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_eq(const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT
{
return (a.sign() == b.sign()) && (a.size() == b.size()) && std_constexpr::equal(a.limbs(), a.limbs() + a.size(), b.limbs());
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value && !is_trivial_cpp_int >::value,
bool>::type
eval_eq(const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT
{
return (a.sign() == b.sign()) && (a.size() == b.size()) && std_constexpr::equal(a.limbs(), a.limbs() + a.size(), b.limbs());
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_eq(const cpp_int_backend& a, limb_type b) BOOST_NOEXCEPT
{
return (a.sign() == false) && (a.size() == 1) && (*a.limbs() == b);
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_eq(const cpp_int_backend& a, signed_limb_type b) BOOST_NOEXCEPT
{
return (a.sign() == (b < 0)) && (a.size() == 1) && (*a.limbs() == boost::multiprecision::detail::unsigned_abs(b));
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_eq(const cpp_int_backend& a, limb_type b) BOOST_NOEXCEPT
{
return (a.size() == 1) && (*a.limbs() == b);
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_eq(const cpp_int_backend& a, signed_limb_type b) BOOST_NOEXCEPT
{
return (b < 0) ? eval_eq(a, cpp_int_backend(b)) : eval_eq(a, static_cast(b)); // Use bit pattern of b for comparison
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_lt(const cpp_int_backend& a, limb_type b) BOOST_NOEXCEPT
{
if (a.sign())
return true;
if (a.size() > 1)
return false;
return *a.limbs() < b;
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_lt(const cpp_int_backend& a, signed_limb_type b) BOOST_NOEXCEPT
{
if ((b == 0) || (a.sign() != (b < 0)))
return a.sign();
if (a.sign())
{
if (a.size() > 1)
return true;
return *a.limbs() > boost::multiprecision::detail::unsigned_abs(b);
}
else
{
if (a.size() > 1)
return false;
return *a.limbs() < boost::multiprecision::detail::unsigned_abs(b);
}
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_lt(const cpp_int_backend& a, limb_type b) BOOST_NOEXCEPT
{
if (a.size() > 1)
return false;
return *a.limbs() < b;
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_lt(const cpp_int_backend& a, signed_limb_type b) BOOST_NOEXCEPT
{
return (b < 0) ? a.compare(b) < 0 : eval_lt(a, static_cast(b)); // Use bit pattern of b for comparison
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_gt(const cpp_int_backend& a, limb_type b) BOOST_NOEXCEPT
{
if (a.sign())
return false;
if (a.size() > 1)
return true;
return *a.limbs() > b;
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_gt(const cpp_int_backend& a, signed_limb_type b) BOOST_NOEXCEPT
{
if (b == 0)
return !a.sign() && ((a.size() > 1) || *a.limbs());
if (a.sign() != (b < 0))
return !a.sign();
if (a.sign())
{
if (a.size() > 1)
return false;
return *a.limbs() < boost::multiprecision::detail::unsigned_abs(b);
}
else
{
if (a.size() > 1)
return true;
return *a.limbs() > boost::multiprecision::detail::unsigned_abs(b);
}
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_gt(const cpp_int_backend& a, limb_type b) BOOST_NOEXCEPT
{
if (a.size() > 1)
return true;
return *a.limbs() > b;
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
!is_trivial_cpp_int >::value,
bool>::type
eval_gt(const cpp_int_backend& a, signed_limb_type b) BOOST_NOEXCEPT
{
return (b < 0) ? a.compare(b) > 0 : eval_gt(a, static_cast(b)); // Use bit pattern of b for comparison.
}
//
// And again for trivial cpp_ints:
//
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_trivial_cpp_int >::value,
bool>::value
eval_eq(const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT
{
return (a.sign() == b.sign()) && (*a.limbs() == *b.limbs());
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_trivial_cpp_int >::value,
bool>::value
eval_eq(const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT
{
return *a.limbs() == *b.limbs();
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_unsigned::value && is_trivial_cpp_int >::value,
bool>::type
eval_eq(const cpp_int_backend& a, U b) BOOST_NOEXCEPT
{
return !a.sign() && (*a.limbs() == b);
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_signed::value && is_trivial_cpp_int >::value,
bool>::type
eval_eq(const cpp_int_backend& a, S b) BOOST_NOEXCEPT
{
return (a.sign() == (b < 0)) && (*a.limbs() == boost::multiprecision::detail::unsigned_abs(b));
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_unsigned::value && is_trivial_cpp_int >::value,
bool>::type
eval_eq(const cpp_int_backend& a, U b) BOOST_NOEXCEPT
{
return *a.limbs() == b;
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_signed::value && is_trivial_cpp_int >::value,
bool>::type
eval_eq(const cpp_int_backend& a, S b) BOOST_NOEXCEPT
{
typedef typename make_unsigned::type ui_type;
if (b < 0)
{
cpp_int_backend t(b);
return *a.limbs() == *t.limbs();
}
else
{
return *a.limbs() == static_cast(b);
}
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_trivial_cpp_int >::value,
bool>::type
eval_lt(const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT
{
if (a.sign() != b.sign())
return a.sign();
return a.sign() ? *a.limbs() > *b.limbs() : *a.limbs() < *b.limbs();
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_trivial_cpp_int >::value,
bool>::type
eval_lt(const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT
{
return *a.limbs() < *b.limbs();
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_unsigned::value && is_trivial_cpp_int >::value,
bool>::type
eval_lt(const cpp_int_backend& a, U b) BOOST_NOEXCEPT
{
if (a.sign())
return true;
return *a.limbs() < b;
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_signed::value && is_trivial_cpp_int >::value,
bool>::type
eval_lt(const cpp_int_backend& a, S b) BOOST_NOEXCEPT
{
if (a.sign() != (b < 0))
return a.sign();
return a.sign() ? (*a.limbs() > boost::multiprecision::detail::unsigned_abs(b)) : (*a.limbs() < boost::multiprecision::detail::unsigned_abs(b));
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_unsigned::value && is_trivial_cpp_int >::value,
bool>::type
eval_lt(const cpp_int_backend& a, U b) BOOST_NOEXCEPT
{
return *a.limbs() < b;
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_signed::value && is_trivial_cpp_int >::value,
bool>::type
eval_lt(const cpp_int_backend& a, S b) BOOST_NOEXCEPT
{
typedef typename make_unsigned::type ui_type;
if (b < 0)
{
cpp_int_backend t(b);
return *a.limbs() < *t.limbs();
}
else
{
return *a.limbs() < static_cast(b);
}
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_trivial_cpp_int >::value,
bool>::type
eval_gt(const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT
{
if (a.sign() != b.sign())
return !a.sign();
return a.sign() ? *a.limbs() < *b.limbs() : *a.limbs() > *b.limbs();
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_trivial_cpp_int >::value,
bool>::type
eval_gt(const cpp_int_backend& a, const cpp_int_backend& b) BOOST_NOEXCEPT
{
return *a.limbs() > *b.limbs();
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_unsigned::value && is_trivial_cpp_int >::value,
bool>::type
eval_gt(const cpp_int_backend& a, U b) BOOST_NOEXCEPT
{
if (a.sign())
return false;
return *a.limbs() > b;
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_signed::value && is_trivial_cpp_int >::value,
bool>::type
eval_gt(const cpp_int_backend& a, S b) BOOST_NOEXCEPT
{
if (a.sign() != (b < 0))
return !a.sign();
return a.sign() ? (*a.limbs() < boost::multiprecision::detail::unsigned_abs(b)) : (*a.limbs() > boost::multiprecision::detail::unsigned_abs(b));
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_unsigned::value && is_trivial_cpp_int >::value,
bool>::type
eval_gt(const cpp_int_backend& a, U b) BOOST_NOEXCEPT
{
return *a.limbs() > b;
}
template
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
is_signed::value && is_trivial_cpp_int >::value,
bool>::type
eval_gt(const cpp_int_backend& a, S b) BOOST_NOEXCEPT
{
typedef typename make_unsigned::type ui_type;
if (b < 0)
{
cpp_int_backend t(b);
return *a.limbs() > *t.limbs();
}
else
{
return *a.limbs() > static_cast(b);
}
}
#ifdef BOOST_MSVC
#pragma warning(pop)
#endif
}}} // namespace boost::multiprecision::backends
#endif