/usr/include/boost/multiprecision/detail
Edit: /usr/include/boost/multiprecision/detail/default_ops.hpp (224929B)
///////////////////////////////////////////////////////////////////////////////
// Copyright 2011 John Maddock. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_MATH_BIG_NUM_DEF_OPS
#define BOOST_MATH_BIG_NUM_DEF_OPS
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW
#include
#endif
#ifndef INSTRUMENT_BACKEND
#ifndef BOOST_MP_INSTRUMENT
#define INSTRUMENT_BACKEND(x)
#else
#define INSTRUMENT_BACKEND(x) \
std::cout << BOOST_STRINGIZE(x) << " = " << x.str(0, std::ios_base::scientific) << std::endl;
#endif
#endif
namespace boost {
namespace multiprecision {
namespace detail {
template
struct is_backend;
template
void generic_interconvert(To& to, const From& from, const mpl::int_& /*to_type*/, const mpl::int_& /*from_type*/);
template
void generic_interconvert(To& to, const From& from, const mpl::int_& /*to_type*/, const mpl::int_& /*from_type*/);
template
void generic_interconvert(To& to, const From& from, const mpl::int_& /*to_type*/, const mpl::int_& /*from_type*/);
template
void generic_interconvert(To& to, const From& from, const mpl::int_& /*to_type*/, const mpl::int_& /*from_type*/);
template
void generic_interconvert(To& to, const From& from, const mpl::int_& /*to_type*/, const mpl::int_& /*from_type*/);
} // namespace detail
namespace default_ops {
#ifdef BOOST_MSVC
// warning C4127: conditional expression is constant
// warning C4146: unary minus operator applied to unsigned type, result still unsigned
#pragma warning(push)
#pragma warning(disable : 4127 4146)
#endif
//
// Default versions of mixed arithmetic, these just construct a temporary
// from the arithmetic value and then do the arithmetic on that, two versions
// of each depending on whether the backend can be directly constructed from type V.
//
// Note that we have to provide *all* the template parameters to class number when used in
// enable_if as MSVC-10 won't compile the code if we rely on a computed-default parameter.
// Since the result of the test doesn't depend on whether expression templates are on or off
// we just use et_on everywhere. We could use a BOOST_WORKAROUND but that just obfuscates the
// code even more....
//
template
inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c::value>::type
eval_add(T& result, V const& v)
{
T t;
t = v;
eval_add(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c::value>::type
eval_add(T& result, V const& v)
{
T t(v);
eval_add(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c::value>::type
eval_subtract(T& result, V const& v)
{
T t;
t = v;
eval_subtract(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c::value>::type
eval_subtract(T& result, V const& v)
{
T t(v);
eval_subtract(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c::value>::type
eval_multiply(T& result, V const& v)
{
T t;
t = v;
eval_multiply(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c::value>::type
eval_multiply(T& result, V const& v)
{
T t(v);
eval_multiply(result, t);
}
template
BOOST_MP_CXX14_CONSTEXPR void eval_multiply(T& t, const U& u, const V& v);
template
inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c::value && is_same::value>::type eval_multiply_add(T& t, const U& u, const V& v)
{
T z;
eval_multiply(z, u, v);
eval_add(t, z);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c::value && is_same::value>::type eval_multiply_add(T& t, const U& u, const V& v)
{
eval_multiply_add(t, v, u);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c::value && is_same::value>::type eval_multiply_subtract(T& t, const U& u, const V& v)
{
T z;
eval_multiply(z, u, v);
eval_subtract(t, z);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c::value && is_same::value>::type eval_multiply_subtract(T& t, const U& u, const V& v)
{
eval_multiply_subtract(t, v, u);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type
eval_divide(T& result, V const& v)
{
T t;
t = v;
eval_divide(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type
eval_divide(T& result, V const& v)
{
T t(v);
eval_divide(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type
eval_modulus(T& result, V const& v)
{
T t;
t = v;
eval_modulus(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type
eval_modulus(T& result, V const& v)
{
T t(v);
eval_modulus(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type
eval_bitwise_and(T& result, V const& v)
{
T t;
t = v;
eval_bitwise_and(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type
eval_bitwise_and(T& result, V const& v)
{
T t(v);
eval_bitwise_and(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type
eval_bitwise_or(T& result, V const& v)
{
T t;
t = v;
eval_bitwise_or(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type
eval_bitwise_or(T& result, V const& v)
{
T t(v);
eval_bitwise_or(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type
eval_bitwise_xor(T& result, V const& v)
{
T t;
t = v;
eval_bitwise_xor(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type
eval_bitwise_xor(T& result, V const& v)
{
T t(v);
eval_bitwise_xor(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type
eval_complement(T& result, V const& v)
{
T t;
t = v;
eval_complement(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type
eval_complement(T& result, V const& v)
{
T t(v);
eval_complement(result, t);
}
//
// Default versions of 3-arg arithmetic functions, these mostly just forward to the 2 arg versions:
//
template
BOOST_MP_CXX14_CONSTEXPR void eval_add(T& t, const U& u, const V& v);
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_add_default(T& t, const T& u, const T& v)
{
if (&t == &v)
{
eval_add(t, u);
}
else if (&t == &u)
{
eval_add(t, v);
}
else
{
t = u;
eval_add(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type eval_add_default(T& t, const T& u, const U& v)
{
T vv;
vv = v;
eval_add(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type eval_add_default(T& t, const T& u, const U& v)
{
T vv(v);
eval_add(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value>::type eval_add_default(T& t, const U& u, const T& v)
{
eval_add(t, v, u);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_add_default(T& t, const U& u, const V& v)
{
if (is_same::value && ((void*)&t == (void*)&v))
{
eval_add(t, u);
}
else
{
t = u;
eval_add(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_add(T& t, const U& u, const V& v)
{
eval_add_default(t, u, v);
}
template
void BOOST_MP_CXX14_CONSTEXPR eval_subtract(T& t, const U& u, const V& v);
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_subtract_default(T& t, const T& u, const T& v)
{
if ((&t == &v) && is_signed_number::value)
{
eval_subtract(t, u);
t.negate();
}
else if (&t == &u)
{
eval_subtract(t, v);
}
else
{
t = u;
eval_subtract(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type eval_subtract_default(T& t, const T& u, const U& v)
{
T vv;
vv = v;
eval_subtract(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type eval_subtract_default(T& t, const T& u, const U& v)
{
T vv(v);
eval_subtract(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_signed_number::value>::type eval_subtract_default(T& t, const U& u, const T& v)
{
eval_subtract(t, v, u);
t.negate();
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value && is_unsigned_number::value>::type eval_subtract_default(T& t, const U& u, const T& v)
{
T temp;
temp = u;
eval_subtract(t, temp, v);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value && is_unsigned_number::value>::type eval_subtract_default(T& t, const U& u, const T& v)
{
T temp(u);
eval_subtract(t, temp, v);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_subtract_default(T& t, const U& u, const V& v)
{
if (is_same::value && ((void*)&t == (void*)&v))
{
eval_subtract(t, u);
t.negate();
}
else
{
t = u;
eval_subtract(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(T& t, const U& u, const V& v)
{
eval_subtract_default(t, u, v);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_multiply_default(T& t, const T& u, const T& v)
{
if (&t == &v)
{
eval_multiply(t, u);
}
else if (&t == &u)
{
eval_multiply(t, v);
}
else
{
t = u;
eval_multiply(t, v);
}
}
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1900)
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type eval_multiply_default(T& t, const T& u, const U& v)
{
T vv;
vv = v;
eval_multiply(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type eval_multiply_default(T& t, const T& u, const U& v)
{
T vv(v);
eval_multiply(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value>::type eval_multiply_default(T& t, const U& u, const T& v)
{
eval_multiply(t, v, u);
}
#endif
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_multiply_default(T& t, const U& u, const V& v)
{
if (is_same::value && ((void*)&t == (void*)&v))
{
eval_multiply(t, u);
}
else
{
t = number::canonical_value(u);
eval_multiply(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_multiply(T& t, const U& u, const V& v)
{
eval_multiply_default(t, u, v);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_multiply_add(T& t, const T& u, const T& v, const T& x)
{
if ((void*)&x == (void*)&t)
{
T z;
z = number::canonical_value(x);
eval_multiply_add(t, u, v, z);
}
else
{
eval_multiply(t, u, v);
eval_add(t, x);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename boost::disable_if_c::value, T>::type make_T(const U& u)
{
T t;
t = number::canonical_value(u);
return t;
}
template
inline BOOST_MP_CXX14_CONSTEXPR const T& make_T(const T& t)
{
return t;
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c::value && is_same::value>::type eval_multiply_add(T& t, const U& u, const V& v, const X& x)
{
eval_multiply_add(t, make_T(u), make_T(v), make_T(x));
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c::value && is_same::value>::type eval_multiply_add(T& t, const U& u, const V& v, const X& x)
{
eval_multiply_add(t, v, u, x);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c::value && is_same::value>::type eval_multiply_subtract(T& t, const U& u, const V& v, const X& x)
{
if ((void*)&x == (void*)&t)
{
T z;
z = x;
eval_multiply_subtract(t, u, v, z);
}
else
{
eval_multiply(t, u, v);
eval_subtract(t, x);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c::value && is_same::value>::type eval_multiply_subtract(T& t, const U& u, const V& v, const X& x)
{
eval_multiply_subtract(t, v, u, x);
}
template
BOOST_MP_CXX14_CONSTEXPR void eval_divide(T& t, const U& u, const V& v);
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_divide_default(T& t, const T& u, const T& v)
{
if (&t == &u)
eval_divide(t, v);
else if (&t == &v)
{
T temp;
eval_divide(temp, u, v);
temp.swap(t);
}
else
{
t = u;
eval_divide(t, v);
}
}
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1900)
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type eval_divide_default(T& t, const T& u, const U& v)
{
T vv;
vv = v;
eval_divide(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type eval_divide_default(T& t, const T& u, const U& v)
{
T vv(v);
eval_divide(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type eval_divide_default(T& t, const U& u, const T& v)
{
T uu;
uu = u;
eval_divide(t, uu, v);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type eval_divide_default(T& t, const U& u, const T& v)
{
T uu(u);
eval_divide(t, uu, v);
}
#endif
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_divide_default(T& t, const U& u, const V& v)
{
if (is_same::value && ((void*)&t == (void*)&v))
{
T temp;
temp = u;
eval_divide(temp, v);
t = temp;
}
else
{
t = u;
eval_divide(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_divide(T& t, const U& u, const V& v)
{
eval_divide_default(t, u, v);
}
template
BOOST_MP_CXX14_CONSTEXPR void eval_modulus(T& t, const U& u, const V& v);
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_modulus_default(T& t, const T& u, const T& v)
{
if (&t == &u)
eval_modulus(t, v);
else if (&t == &v)
{
T temp;
eval_modulus(temp, u, v);
temp.swap(t);
}
else
{
t = u;
eval_modulus(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type eval_modulus_default(T& t, const T& u, const U& v)
{
T vv;
vv = v;
eval_modulus(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type eval_modulus_default(T& t, const T& u, const U& v)
{
T vv(v);
eval_modulus(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type eval_modulus_default(T& t, const U& u, const T& v)
{
T uu;
uu = u;
eval_modulus(t, uu, v);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type eval_modulus_default(T& t, const U& u, const T& v)
{
T uu(u);
eval_modulus(t, uu, v);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_modulus_default(T& t, const U& u, const V& v)
{
if (is_same::value && ((void*)&t == (void*)&v))
{
T temp(u);
eval_modulus(temp, v);
t = temp;
}
else
{
t = u;
eval_modulus(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_modulus(T& t, const U& u, const V& v)
{
eval_modulus_default(t, u, v);
}
template
BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_and(T& t, const U& u, const V& v);
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_and_default(T& t, const T& u, const T& v)
{
if (&t == &v)
{
eval_bitwise_and(t, u);
}
else if (&t == &u)
{
eval_bitwise_and(t, v);
}
else
{
t = u;
eval_bitwise_and(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c::value>::type eval_bitwise_and_default(T& t, const T& u, const U& v)
{
T vv;
vv = v;
eval_bitwise_and(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c::value>::type eval_bitwise_and_default(T& t, const T& u, const U& v)
{
T vv(v);
eval_bitwise_and(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value>::type eval_bitwise_and_default(T& t, const U& u, const T& v)
{
eval_bitwise_and(t, v, u);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c::value || is_same::value>::type eval_bitwise_and_default(T& t, const U& u, const V& v)
{
t = u;
eval_bitwise_and(t, v);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_and(T& t, const U& u, const V& v)
{
eval_bitwise_and_default(t, u, v);
}
template
BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_or(T& t, const U& u, const V& v);
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_or_default(T& t, const T& u, const T& v)
{
if (&t == &v)
{
eval_bitwise_or(t, u);
}
else if (&t == &u)
{
eval_bitwise_or(t, v);
}
else
{
t = u;
eval_bitwise_or(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type eval_bitwise_or_default(T& t, const T& u, const U& v)
{
T vv;
vv = v;
eval_bitwise_or(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type eval_bitwise_or_default(T& t, const T& u, const U& v)
{
T vv(v);
eval_bitwise_or(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value>::type eval_bitwise_or_default(T& t, const U& u, const T& v)
{
eval_bitwise_or(t, v, u);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_or_default(T& t, const U& u, const V& v)
{
if (is_same::value && ((void*)&t == (void*)&v))
{
eval_bitwise_or(t, u);
}
else
{
t = u;
eval_bitwise_or(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_or(T& t, const U& u, const V& v)
{
eval_bitwise_or_default(t, u, v);
}
template
BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_xor(T& t, const U& u, const V& v);
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_xor_default(T& t, const T& u, const T& v)
{
if (&t == &v)
{
eval_bitwise_xor(t, u);
}
else if (&t == &u)
{
eval_bitwise_xor(t, v);
}
else
{
t = u;
eval_bitwise_xor(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && !is_convertible::value>::type eval_bitwise_xor_default(T& t, const T& u, const U& v)
{
T vv;
vv = v;
eval_bitwise_xor(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value && is_convertible::value>::type eval_bitwise_xor_default(T& t, const T& u, const U& v)
{
T vv(v);
eval_bitwise_xor(t, u, vv);
}
template
inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c >::value>::type eval_bitwise_xor_default(T& t, const U& u, const T& v)
{
eval_bitwise_xor(t, v, u);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_xor_default(T& t, const U& u, const V& v)
{
if (is_same::value && ((void*)&t == (void*)&v))
{
eval_bitwise_xor(t, u);
}
else
{
t = u;
eval_bitwise_xor(t, v);
}
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_xor(T& t, const U& u, const V& v)
{
eval_bitwise_xor_default(t, u, v);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_increment(T& val)
{
typedef typename mpl::front::type ui_type;
eval_add(val, static_cast(1u));
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_decrement(T& val)
{
typedef typename mpl::front::type ui_type;
eval_subtract(val, static_cast(1u));
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_left_shift(T& result, const T& arg, const V val)
{
result = arg;
eval_left_shift(result, val);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void eval_right_shift(T& result, const T& arg, const V val)
{
result = arg;
eval_right_shift(result, val);
}
template
inline BOOST_MP_CXX14_CONSTEXPR bool eval_is_zero(const T& val)
{
typedef typename mpl::front::type ui_type;
return val.compare(static_cast(0)) == 0;
}
template
inline BOOST_MP_CXX14_CONSTEXPR int eval_get_sign(const T& val)
{
typedef typename mpl::front::type ui_type;
return val.compare(static_cast(0));
}
template
inline BOOST_MP_CXX14_CONSTEXPR void assign_components_imp(T& result, const V& v1, const U& v2, const mpl::int_&)
{
result = v1;
T t;
t = v2;
eval_divide(result, t);
}
template
inline BOOST_MP_CXX14_CONSTEXPR void assign_components_imp(T& result, const V& v1, const U& v2, const mpl::int_&)
{
typedef typename component_type >::type component_number_type;
component_number_type x(v1), y(v2);
assign_components(result, x.backend(), y.backend());
}
template
inline BOOST_MP_CXX14_CONSTEXPR void assign_components(T& result, const V& v1, const U& v2)
{
return assign_components_imp(result, v1, v2, typename number_category::type());
}
#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW
template
inline void assign_from_string_view(Result& result, const std::basic_string_view& view)
{
// since most (all?) backends require a const char* to construct from, we just
// convert to that:
std::string s(view);
result = s.c_str();
}
template
inline void assign_from_string_view(Result& result, const std::basic_string_view& view_x, const std::basic_string_view& view_y)
{
// since most (all?) backends require a const char* to construct from, we just
// convert to that:
std::string x(view_x), y(view_y);
assign_components(result, x.c_str(), y.c_str());
}
#endif
template
struct has_enough_bits
{
template
struct type : public mpl::and_ >, mpl::bool_::digits >= b> >
{};
};
template
struct terminal
{
BOOST_MP_CXX14_CONSTEXPR terminal(const R& v) : value(v) {}
BOOST_MP_CXX14_CONSTEXPR terminal() {}
BOOST_MP_CXX14_CONSTEXPR terminal& operator=(R val)
{
value = val;
return *this;
}
R value;
BOOST_MP_CXX14_CONSTEXPR operator R() const { return value; }
};
template