/////////////////////////////////////////////////////////////////////////////// // Copyright 2023 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_MP_FWD_HPP #define BOOST_MP_FWD_HPP #include namespace boost { namespace multiprecision { enum expression_template_option { et_off = 0, et_on = 1 }; template struct expression_template_default { static constexpr expression_template_option value = et_on; }; template ::value> class number; template struct is_number : public std::integral_constant {}; template struct is_number > : public std::integral_constant {}; namespace detail { // Forward-declare an expression wrapper template struct expression; } // namespace detail enum cpp_integer_type { signed_magnitude = 1, unsigned_magnitude = 0, signed_packed = 3, unsigned_packed = 2 }; enum cpp_int_check_type { checked = 1, unchecked = 0 }; enum mpfr_allocation_type { allocate_stack, allocate_dynamic }; template void log_postfix_event(const Backend&, const char* /*event_description*/); template void log_postfix_event(const Backend&, const T&, const char* /*event_description*/); template void log_prefix_event(const Backend&, const char* /*event_description*/); template void log_prefix_event(const Backend&, const T&, const char* /*event_description*/); template void log_prefix_event(const Backend&, const T&, const U&, const char* /*event_description*/); template void log_prefix_event(const Backend&, const T&, const U&, const V&, const char* /*event_description*/); namespace backends { template struct debug_adaptor; template struct logged_adaptor; template struct complex_adaptor; enum digit_base_type { digit_base_2 = 2, digit_base_10 = 10 }; template class cpp_bin_float; template class cpp_dec_float; template >::type> struct cpp_int_backend; struct float128_backend; struct gmp_int; struct gmp_rational; template struct gmp_float; template struct mpc_complex_backend; template struct mpfi_float_backend; template struct mpfr_float_backend; template <> struct mpfr_float_backend<0, allocate_stack>; template struct rational_adaptor; struct tommath_int; } using boost::multiprecision::backends::complex_adaptor; using boost::multiprecision::backends::debug_adaptor; using boost::multiprecision::backends::logged_adaptor; using backends::cpp_bin_float; using backends::digit_base_10; using backends::digit_base_2; using boost::multiprecision::backends::cpp_dec_float; using boost::multiprecision::backends::cpp_int_backend; using boost::multiprecision::backends::float128_backend; using boost::multiprecision::backends::gmp_float; using boost::multiprecision::backends::gmp_int; using boost::multiprecision::backends::gmp_rational; using boost::multiprecision::backends::mpc_complex_backend; using boost::multiprecision::backends::mpfi_float_backend; using boost::multiprecision::backends::mpfr_float_backend; using boost::multiprecision::backends::rational_adaptor; using boost::multiprecision::backends::tommath_int; template struct expression_template_default > { static constexpr expression_template_option value = std::is_void::value ? et_off : et_on; }; template struct expression_template_default > { static constexpr expression_template_option value = et_off; }; template struct expression_template_default > : public expression_template_default {}; using complex128 = number, et_off>; using cpp_bin_float_50 = number >; using cpp_bin_float_100 = number >; using cpp_bin_float_single = number, et_off>; using cpp_bin_float_double = number, et_off>; using cpp_bin_float_double_extended = number, et_off>; using cpp_bin_float_quad = number, et_off>; using cpp_bin_float_oct = number, et_off>; template using cpp_complex_backend = complex_adaptor >; template using cpp_complex = number >, ExpressionTemplates>; using cpp_complex_50 = cpp_complex<50>; using cpp_complex_100 = cpp_complex<100>; using cpp_complex_single = cpp_complex<24, backends::digit_base_2, void, std::int16_t, -126, 127>; using cpp_complex_double = cpp_complex<53, backends::digit_base_2, void, std::int16_t, -1022, 1023>; using cpp_complex_extended = cpp_complex<64, backends::digit_base_2, void, std::int16_t, -16382, 16383>; using cpp_complex_quad = cpp_complex<113, backends::digit_base_2, void, std::int16_t, -16382, 16383>; using cpp_complex_oct = cpp_complex<237, backends::digit_base_2, void, std::int32_t, -262142, 262143>; using cpp_dec_float_50 = number >; using cpp_dec_float_100 = number >; using cpp_int = number >; using cpp_rational_backend = rational_adaptor >; using cpp_rational = number; // Fixed precision unsigned types: using uint128_t = number >; using uint256_t = number >; using uint512_t = number >; using uint1024_t = number >; // Fixed precision signed types: using int128_t = number >; using int256_t = number >; using int512_t = number >; using int1024_t = number >; // Over again, but with checking enabled this time: using checked_cpp_int = number >; using checked_cpp_rational_backend = rational_adaptor >; using checked_cpp_rational = number; // Fixed precision unsigned types: using checked_uint128_t = number >; using checked_uint256_t = number >; using checked_uint512_t = number >; using checked_uint1024_t = number >; // Fixed precision signed types: using checked_int128_t = number >; using checked_int256_t = number >; using checked_int512_t = number >; using checked_int1024_t = number >; template using debug_adaptor_t = number, Number::et>; template using logged_adaptor_t = number, Number::et>; using float128 = number; using mpf_float_50 = number >; using mpf_float_100 = number >; using mpf_float_500 = number >; using mpf_float_1000 = number >; using mpf_float = number >; using mpz_int = number; using mpq_rational = number; using mpc_complex_50 = number >; using mpc_complex_100 = number >; using mpc_complex_500 = number >; using mpc_complex_1000 = number >; using mpc_complex = number >; using mpfi_float_50 = number >; using mpfi_float_100 = number >; using mpfi_float_500 = number >; using mpfi_float_1000 = number >; using mpfi_float = number >; using mpfr_float_50 = number >; using mpfr_float_100 = number >; using mpfr_float_500 = number >; using mpfr_float_1000 = number >; using mpfr_float = number >; using static_mpfr_float_50 = number >; using static_mpfr_float_100 = number >; using tom_int = number; using tommath_rational = rational_adaptor; using tom_rational = number; } } #endif