mqt-core 3.3.2__cp314-cp314t-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mqt/core/__init__.py +77 -0
- mqt/core/__main__.py +55 -0
- mqt/core/_commands.py +52 -0
- mqt/core/_compat/__init__.py +11 -0
- mqt/core/_compat/typing.py +29 -0
- mqt/core/_version.py +34 -0
- mqt/core/_version.pyi +12 -0
- mqt/core/dd.cpython-314t-darwin.so +0 -0
- mqt/core/dd.pyi +1016 -0
- mqt/core/dd_evaluation.py +368 -0
- mqt/core/fomac.cpython-314t-darwin.so +0 -0
- mqt/core/fomac.pyi +125 -0
- mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
- mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
- mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
- mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
- mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
- mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
- mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
- mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
- mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
- mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
- mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
- mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
- mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
- mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
- mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
- mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
- mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
- mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
- mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
- mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
- mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
- mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
- mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
- mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
- mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
- mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
- mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
- mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
- mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
- mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
- mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
- mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
- mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
- mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
- mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
- mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
- mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
- mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
- mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
- mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
- mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
- mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
- mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
- mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
- mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
- mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
- mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
- mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
- mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
- mqt/core/include/mqt-core/boost/config.hpp +67 -0
- mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
- mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
- mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
- mqt/core/include/mqt-core/boost/limits.hpp +146 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
- mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
- mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
- mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
- mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
- mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
- mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
- mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
- mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
- mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
- mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
- mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
- mqt/core/include/mqt-core/boost/version.hpp +32 -0
- mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
- mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
- mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
- mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
- mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
- mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
- mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
- mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
- mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
- mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
- mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
- mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
- mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
- mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
- mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
- mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
- mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
- mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
- mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
- mqt/core/include/mqt-core/dd/Export.hpp +438 -0
- mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
- mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
- mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
- mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
- mqt/core/include/mqt-core/dd/Node.hpp +223 -0
- mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
- mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
- mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
- mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
- mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
- mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
- mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
- mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
- mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
- mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
- mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
- mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
- mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
- mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
- mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
- mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
- mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
- mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
- mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
- mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
- mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
- mqt/core/include/mqt-core/ir/Register.hpp +125 -0
- mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
- mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
- mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
- mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
- mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
- mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
- mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
- mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
- mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
- mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
- mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
- mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
- mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
- mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
- mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
- mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
- mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
- mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
- mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
- mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
- mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
- mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
- mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
- mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
- mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
- mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
- mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
- mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
- mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
- mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
- mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
- mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
- mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
- mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
- mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
- mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
- mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
- mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
- mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
- mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
- mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
- mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
- mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
- mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
- mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
- mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
- mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
- mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
- mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
- mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
- mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
- mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
- mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
- mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
- mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
- mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
- mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
- mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
- mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
- mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
- mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
- mqt/core/include/nlohmann/detail/hash.hpp +129 -0
- mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
- mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
- mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
- mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
- mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
- mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
- mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
- mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
- mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
- mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
- mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
- mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
- mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
- mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
- mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
- mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
- mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
- mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
- mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
- mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
- mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
- mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
- mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
- mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
- mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
- mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
- mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
- mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
- mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
- mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
- mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
- mqt/core/include/nlohmann/json.hpp +5306 -0
- mqt/core/include/nlohmann/json_fwd.hpp +75 -0
- mqt/core/include/nlohmann/ordered_map.hpp +359 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
- mqt/core/include/qdmi/qdmi/client.h +990 -0
- mqt/core/include/qdmi/qdmi/constants.h +1139 -0
- mqt/core/include/qdmi/qdmi/device.h +602 -0
- mqt/core/include/qdmi/qdmi/types.h +78 -0
- mqt/core/include/spdlog/async.h +99 -0
- mqt/core/include/spdlog/async_logger-inl.h +84 -0
- mqt/core/include/spdlog/async_logger.h +74 -0
- mqt/core/include/spdlog/cfg/argv.h +40 -0
- mqt/core/include/spdlog/cfg/env.h +36 -0
- mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
- mqt/core/include/spdlog/cfg/helpers.h +29 -0
- mqt/core/include/spdlog/common-inl.h +68 -0
- mqt/core/include/spdlog/common.h +406 -0
- mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
- mqt/core/include/spdlog/details/backtracer.h +45 -0
- mqt/core/include/spdlog/details/circular_q.h +115 -0
- mqt/core/include/spdlog/details/console_globals.h +28 -0
- mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
- mqt/core/include/spdlog/details/file_helper.h +61 -0
- mqt/core/include/spdlog/details/fmt_helper.h +141 -0
- mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
- mqt/core/include/spdlog/details/log_msg.h +40 -0
- mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
- mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
- mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
- mqt/core/include/spdlog/details/null_mutex.h +35 -0
- mqt/core/include/spdlog/details/os-inl.h +606 -0
- mqt/core/include/spdlog/details/os.h +127 -0
- mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
- mqt/core/include/spdlog/details/periodic_worker.h +58 -0
- mqt/core/include/spdlog/details/registry-inl.h +270 -0
- mqt/core/include/spdlog/details/registry.h +131 -0
- mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
- mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
- mqt/core/include/spdlog/details/tcp_client.h +127 -0
- mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
- mqt/core/include/spdlog/details/thread_pool.h +117 -0
- mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
- mqt/core/include/spdlog/details/udp_client.h +81 -0
- mqt/core/include/spdlog/details/windows_include.h +11 -0
- mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
- mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
- mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
- mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
- mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
- mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
- mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
- mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
- mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
- mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
- mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
- mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
- mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
- mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
- mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
- mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
- mqt/core/include/spdlog/fmt/chrono.h +23 -0
- mqt/core/include/spdlog/fmt/compile.h +23 -0
- mqt/core/include/spdlog/fmt/fmt.h +30 -0
- mqt/core/include/spdlog/fmt/ostr.h +23 -0
- mqt/core/include/spdlog/fmt/ranges.h +23 -0
- mqt/core/include/spdlog/fmt/std.h +24 -0
- mqt/core/include/spdlog/fmt/xchar.h +23 -0
- mqt/core/include/spdlog/formatter.h +17 -0
- mqt/core/include/spdlog/fwd.h +18 -0
- mqt/core/include/spdlog/logger-inl.h +198 -0
- mqt/core/include/spdlog/logger.h +379 -0
- mqt/core/include/spdlog/mdc.h +52 -0
- mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
- mqt/core/include/spdlog/pattern_formatter.h +118 -0
- mqt/core/include/spdlog/sinks/android_sink.h +137 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
- mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
- mqt/core/include/spdlog/sinks/base_sink.h +51 -0
- mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
- mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
- mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
- mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
- mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
- mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
- mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
- mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
- mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
- mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
- mqt/core/include/spdlog/sinks/null_sink.h +41 -0
- mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
- mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
- mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
- mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
- mqt/core/include/spdlog/sinks/sink.h +34 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
- mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
- mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
- mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
- mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
- mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
- mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
- mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
- mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
- mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
- mqt/core/include/spdlog/spdlog-inl.h +96 -0
- mqt/core/include/spdlog/spdlog.h +357 -0
- mqt/core/include/spdlog/stopwatch.h +66 -0
- mqt/core/include/spdlog/tweakme.h +148 -0
- mqt/core/include/spdlog/version.h +11 -0
- mqt/core/ir/__init__.pyi +2078 -0
- mqt/core/ir/operations.pyi +1011 -0
- mqt/core/ir/registers.pyi +91 -0
- mqt/core/ir/symbolic.pyi +177 -0
- mqt/core/ir.cpython-314t-darwin.so +0 -0
- mqt/core/lib/libmqt-core-algorithms.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-algorithms.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-algorithms.dylib +0 -0
- mqt/core/lib/libmqt-core-circuit-optimizer.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-circuit-optimizer.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-circuit-optimizer.dylib +0 -0
- mqt/core/lib/libmqt-core-dd.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-dd.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-dd.dylib +0 -0
- mqt/core/lib/libmqt-core-ds.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-ds.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-ds.dylib +0 -0
- mqt/core/lib/libmqt-core-fomac.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-fomac.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-fomac.dylib +0 -0
- mqt/core/lib/libmqt-core-ir.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-ir.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-ir.dylib +0 -0
- mqt/core/lib/libmqt-core-na-fomac.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-na-fomac.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-na-fomac.dylib +0 -0
- mqt/core/lib/libmqt-core-na.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-na.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-na.dylib +0 -0
- mqt/core/lib/libmqt-core-qasm.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-qasm.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-qasm.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-driver.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-driver.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-driver.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device-gen.a +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device.dylib +0 -0
- mqt/core/lib/libmqt-core-zx.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-zx.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-zx.dylib +0 -0
- mqt/core/lib/libspdlog.a +0 -0
- mqt/core/lib/pkgconfig/spdlog.pc +13 -0
- mqt/core/na/__init__.py +12 -0
- mqt/core/na/fomac.cpython-314t-darwin.so +0 -0
- mqt/core/na/fomac.pyi +117 -0
- mqt/core/plugins/__init__.py +9 -0
- mqt/core/plugins/qiskit/__init__.py +19 -0
- mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
- mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
- mqt/core/py.typed +2 -0
- mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
- mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
- mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
- mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
- mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
- mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +446 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +109 -0
- mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
- mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
- mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
- mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
- mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
- mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
- mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +118 -0
- mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
- mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
- mqt_core-3.3.2.dist-info/METADATA +210 -0
- mqt_core-3.3.2.dist-info/RECORD +546 -0
- mqt_core-3.3.2.dist-info/WHEEL +6 -0
- mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
- mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
|
@@ -0,0 +1,687 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright 2011 John Maddock. Distributed under the Boost
|
|
3
|
+
// Software License, Version 1.0. (See accompanying file
|
|
4
|
+
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
5
|
+
|
|
6
|
+
#ifndef BOOST_MP_GENERIC_INTERCONVERT_HPP
|
|
7
|
+
#define BOOST_MP_GENERIC_INTERCONVERT_HPP
|
|
8
|
+
|
|
9
|
+
#include <cmath>
|
|
10
|
+
#include <limits>
|
|
11
|
+
#include <boost/multiprecision/detail/standalone_config.hpp>
|
|
12
|
+
#include <boost/multiprecision/detail/default_ops.hpp>
|
|
13
|
+
#include <boost/multiprecision/detail/no_exceptions_support.hpp>
|
|
14
|
+
#include <boost/multiprecision/detail/assert.hpp>
|
|
15
|
+
#include <boost/multiprecision/detail/functions/trunc.hpp>
|
|
16
|
+
|
|
17
|
+
#ifdef BOOST_MSVC
|
|
18
|
+
#pragma warning(push)
|
|
19
|
+
#pragma warning(disable : 4127 6326)
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
namespace boost { namespace multiprecision { namespace detail {
|
|
23
|
+
|
|
24
|
+
template <class To, class From>
|
|
25
|
+
inline To do_cast(const From& from)
|
|
26
|
+
{
|
|
27
|
+
return static_cast<To>(from);
|
|
28
|
+
}
|
|
29
|
+
template <class To, class B, ::boost::multiprecision::expression_template_option et>
|
|
30
|
+
inline To do_cast(const number<B, et>& from)
|
|
31
|
+
{
|
|
32
|
+
return from.template convert_to<To>();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
template <class To, class From>
|
|
36
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_floating_point>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/)
|
|
37
|
+
{
|
|
38
|
+
using default_ops::eval_add;
|
|
39
|
+
using default_ops::eval_bitwise_and;
|
|
40
|
+
using default_ops::eval_convert_to;
|
|
41
|
+
using default_ops::eval_get_sign;
|
|
42
|
+
using default_ops::eval_is_zero;
|
|
43
|
+
using default_ops::eval_ldexp;
|
|
44
|
+
using default_ops::eval_right_shift;
|
|
45
|
+
// smallest unsigned type handled natively by "From" is likely to be it's limb_type:
|
|
46
|
+
using l_limb_type = typename canonical<unsigned char, From>::type;
|
|
47
|
+
// get the corresponding type that we can assign to "To":
|
|
48
|
+
using to_type = typename canonical<l_limb_type, To>::type;
|
|
49
|
+
From t(from);
|
|
50
|
+
bool is_neg = eval_get_sign(t) < 0;
|
|
51
|
+
if (is_neg)
|
|
52
|
+
t.negate();
|
|
53
|
+
// Pick off the first limb:
|
|
54
|
+
l_limb_type limb;
|
|
55
|
+
l_limb_type mask = static_cast<l_limb_type>(~static_cast<l_limb_type>(0));
|
|
56
|
+
From fl;
|
|
57
|
+
eval_bitwise_and(fl, t, mask);
|
|
58
|
+
eval_convert_to(&limb, fl);
|
|
59
|
+
to = static_cast<to_type>(limb);
|
|
60
|
+
eval_right_shift(t, std::numeric_limits<l_limb_type>::digits);
|
|
61
|
+
//
|
|
62
|
+
// Then keep picking off more limbs until "t" is zero:
|
|
63
|
+
//
|
|
64
|
+
To l;
|
|
65
|
+
unsigned shift = std::numeric_limits<l_limb_type>::digits;
|
|
66
|
+
while (!eval_is_zero(t))
|
|
67
|
+
{
|
|
68
|
+
eval_bitwise_and(fl, t, mask);
|
|
69
|
+
eval_convert_to(&limb, fl);
|
|
70
|
+
l = static_cast<to_type>(limb);
|
|
71
|
+
eval_right_shift(t, std::numeric_limits<l_limb_type>::digits);
|
|
72
|
+
eval_ldexp(l, l, shift);
|
|
73
|
+
eval_add(to, l);
|
|
74
|
+
shift += std::numeric_limits<l_limb_type>::digits;
|
|
75
|
+
}
|
|
76
|
+
//
|
|
77
|
+
// Finish off by setting the sign:
|
|
78
|
+
//
|
|
79
|
+
if (is_neg)
|
|
80
|
+
to.negate();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
template <class To, class From>
|
|
84
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_integer>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/)
|
|
85
|
+
{
|
|
86
|
+
using default_ops::eval_bitwise_and;
|
|
87
|
+
using default_ops::eval_bitwise_or;
|
|
88
|
+
using default_ops::eval_convert_to;
|
|
89
|
+
using default_ops::eval_get_sign;
|
|
90
|
+
using default_ops::eval_is_zero;
|
|
91
|
+
using default_ops::eval_left_shift;
|
|
92
|
+
using default_ops::eval_right_shift;
|
|
93
|
+
// smallest unsigned type handled natively by "From" is likely to be it's limb_type:
|
|
94
|
+
using limb_type = typename canonical<unsigned char, From>::type;
|
|
95
|
+
// get the corresponding type that we can assign to "To":
|
|
96
|
+
using to_type = typename canonical<limb_type, To>::type;
|
|
97
|
+
From t(from);
|
|
98
|
+
bool is_neg = eval_get_sign(t) < 0;
|
|
99
|
+
if (is_neg)
|
|
100
|
+
t.negate();
|
|
101
|
+
// Pick off the first limb:
|
|
102
|
+
limb_type limb;
|
|
103
|
+
limb_type mask = static_cast<limb_type>(~static_cast<limb_type>(0));
|
|
104
|
+
From fl;
|
|
105
|
+
eval_bitwise_and(fl, t, mask);
|
|
106
|
+
eval_convert_to(&limb, fl);
|
|
107
|
+
to = static_cast<to_type>(limb);
|
|
108
|
+
eval_right_shift(t, std::numeric_limits<limb_type>::digits);
|
|
109
|
+
//
|
|
110
|
+
// Then keep picking off more limbs until "t" is zero:
|
|
111
|
+
//
|
|
112
|
+
To l;
|
|
113
|
+
unsigned shift = std::numeric_limits<limb_type>::digits;
|
|
114
|
+
while (!eval_is_zero(t))
|
|
115
|
+
{
|
|
116
|
+
eval_bitwise_and(fl, t, mask);
|
|
117
|
+
eval_convert_to(&limb, fl);
|
|
118
|
+
l = static_cast<to_type>(limb);
|
|
119
|
+
eval_right_shift(t, std::numeric_limits<limb_type>::digits);
|
|
120
|
+
eval_left_shift(l, shift);
|
|
121
|
+
eval_bitwise_or(to, l);
|
|
122
|
+
shift += std::numeric_limits<limb_type>::digits;
|
|
123
|
+
}
|
|
124
|
+
//
|
|
125
|
+
// Finish off by setting the sign:
|
|
126
|
+
//
|
|
127
|
+
if (is_neg)
|
|
128
|
+
to.negate();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
template <class To, class From>
|
|
132
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_floating_point>& /*to_type*/, const std::integral_constant<int, number_kind_floating_point>& /*from_type*/)
|
|
133
|
+
{
|
|
134
|
+
#ifdef BOOST_MSVC
|
|
135
|
+
#pragma warning(push)
|
|
136
|
+
//#pragma warning(disable : 4127)
|
|
137
|
+
#endif
|
|
138
|
+
//
|
|
139
|
+
// The code here only works when the radix of "From" is 2, we could try shifting by other
|
|
140
|
+
// radixes but it would complicate things.... use a string conversion when the radix is other
|
|
141
|
+
// than 2:
|
|
142
|
+
//
|
|
143
|
+
BOOST_IF_CONSTEXPR(std::numeric_limits<number<From> >::radix != 2)
|
|
144
|
+
{
|
|
145
|
+
to = from.str(0, std::ios_base::fmtflags()).c_str();
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
else
|
|
149
|
+
{
|
|
150
|
+
using ui_type = typename canonical<unsigned char, To>::type;
|
|
151
|
+
|
|
152
|
+
using default_ops::eval_add;
|
|
153
|
+
using default_ops::eval_convert_to;
|
|
154
|
+
using default_ops::eval_fpclassify;
|
|
155
|
+
using default_ops::eval_get_sign;
|
|
156
|
+
using default_ops::eval_is_zero;
|
|
157
|
+
using default_ops::eval_subtract;
|
|
158
|
+
|
|
159
|
+
//
|
|
160
|
+
// First classify the input, then handle the special cases:
|
|
161
|
+
//
|
|
162
|
+
int c = eval_fpclassify(from);
|
|
163
|
+
|
|
164
|
+
if (c == static_cast<int>(FP_ZERO))
|
|
165
|
+
{
|
|
166
|
+
to = ui_type(0);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
else if (c == static_cast<int>(FP_NAN))
|
|
170
|
+
{
|
|
171
|
+
to = static_cast<const char*>("nan");
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
else if (c == static_cast<int>(FP_INFINITE))
|
|
175
|
+
{
|
|
176
|
+
to = static_cast<const char*>("inf");
|
|
177
|
+
if (eval_get_sign(from) < 0)
|
|
178
|
+
to.negate();
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
typename From::exponent_type e;
|
|
183
|
+
From f, term;
|
|
184
|
+
to = ui_type(0);
|
|
185
|
+
|
|
186
|
+
eval_frexp(f, from, &e);
|
|
187
|
+
|
|
188
|
+
constexpr int shift = std::numeric_limits<std::intmax_t>::digits - 1;
|
|
189
|
+
|
|
190
|
+
while (!eval_is_zero(f))
|
|
191
|
+
{
|
|
192
|
+
// extract int sized bits from f:
|
|
193
|
+
eval_ldexp(f, f, shift);
|
|
194
|
+
eval_floor(term, f);
|
|
195
|
+
e -= shift;
|
|
196
|
+
eval_ldexp(to, to, shift);
|
|
197
|
+
typename boost::multiprecision::detail::canonical<std::intmax_t, To>::type ll;
|
|
198
|
+
eval_convert_to(&ll, term);
|
|
199
|
+
eval_add(to, ll);
|
|
200
|
+
eval_subtract(f, term);
|
|
201
|
+
}
|
|
202
|
+
using to_exponent = typename To::exponent_type;
|
|
203
|
+
if (e > (std::numeric_limits<to_exponent>::max)())
|
|
204
|
+
{
|
|
205
|
+
to = static_cast<const char*>("inf");
|
|
206
|
+
if (eval_get_sign(from) < 0)
|
|
207
|
+
to.negate();
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (e < (std::numeric_limits<to_exponent>::min)())
|
|
211
|
+
{
|
|
212
|
+
to = ui_type(0);
|
|
213
|
+
if (eval_get_sign(from) < 0)
|
|
214
|
+
to.negate();
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
eval_ldexp(to, to, static_cast<to_exponent>(e));
|
|
218
|
+
}
|
|
219
|
+
#ifdef BOOST_MSVC
|
|
220
|
+
#pragma warning(pop)
|
|
221
|
+
#endif
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
template <class To, class From>
|
|
225
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_rational>& /*to_type*/, const std::integral_constant<int, number_kind_rational>& /*from_type*/)
|
|
226
|
+
{
|
|
227
|
+
using to_component_type = typename component_type<number<To> >::type;
|
|
228
|
+
|
|
229
|
+
number<From> t(from);
|
|
230
|
+
to_component_type n(numerator(t)), d(denominator(t));
|
|
231
|
+
using default_ops::assign_components;
|
|
232
|
+
assign_components(to, n.backend(), d.backend());
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
template <class To, class From>
|
|
236
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_rational>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/)
|
|
237
|
+
{
|
|
238
|
+
using to_component_type = typename component_type<number<To> >::type;
|
|
239
|
+
|
|
240
|
+
number<From> t(from);
|
|
241
|
+
to_component_type n(t), d(1);
|
|
242
|
+
using default_ops::assign_components;
|
|
243
|
+
assign_components(to, n.backend(), d.backend());
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
template <class LargeInteger>
|
|
247
|
+
inline typename std::enable_if<is_signed_number<LargeInteger>::value>::type make_positive(LargeInteger& val)
|
|
248
|
+
{
|
|
249
|
+
if (val.sign() < 0)
|
|
250
|
+
val = -val;
|
|
251
|
+
}
|
|
252
|
+
template <class LargeInteger>
|
|
253
|
+
inline typename std::enable_if<!is_signed_number<LargeInteger>::value>::type make_positive(LargeInteger&){}
|
|
254
|
+
|
|
255
|
+
template <class R, class LargeInteger>
|
|
256
|
+
R safe_convert_to_float(const LargeInteger& i)
|
|
257
|
+
{
|
|
258
|
+
if (!i)
|
|
259
|
+
return R(0);
|
|
260
|
+
BOOST_IF_CONSTEXPR(std::numeric_limits<R>::is_specialized && std::numeric_limits<R>::max_exponent)
|
|
261
|
+
{
|
|
262
|
+
using std::ldexp;
|
|
263
|
+
|
|
264
|
+
LargeInteger val(i);
|
|
265
|
+
make_positive(val);
|
|
266
|
+
std::size_t mb = msb(val);
|
|
267
|
+
if (mb >= std::numeric_limits<R>::max_exponent)
|
|
268
|
+
{
|
|
269
|
+
int scale_factor = static_cast<int>(mb) + 1 - std::numeric_limits<R>::max_exponent;
|
|
270
|
+
BOOST_MP_ASSERT(scale_factor >= 1);
|
|
271
|
+
val >>= scale_factor;
|
|
272
|
+
R result = val.template convert_to<R>();
|
|
273
|
+
BOOST_IF_CONSTEXPR(std::numeric_limits<R>::digits == 0 || std::numeric_limits<R>::digits >= std::numeric_limits<R>::max_exponent)
|
|
274
|
+
{
|
|
275
|
+
//
|
|
276
|
+
// Calculate and add on the remainder, only if there are more
|
|
277
|
+
// digits in the mantissa that the size of the exponent, in
|
|
278
|
+
// other words if we are dropping digits in the conversion
|
|
279
|
+
// otherwise:
|
|
280
|
+
//
|
|
281
|
+
LargeInteger remainder(i);
|
|
282
|
+
remainder &= (LargeInteger(1) << scale_factor) - 1;
|
|
283
|
+
result += ldexp(safe_convert_to_float<R>(remainder), -scale_factor);
|
|
284
|
+
}
|
|
285
|
+
return i.sign() < 0 ? static_cast<R>(-result) : result;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return i.template convert_to<R>();
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
template <class To, class Integer>
|
|
292
|
+
inline typename std::enable_if<!(is_number<To>::value || std::is_floating_point<To>::value)>::type
|
|
293
|
+
generic_convert_rational_to_float_imp(To& result, const Integer& n, const Integer& d, const std::integral_constant<bool, true>&)
|
|
294
|
+
{
|
|
295
|
+
//
|
|
296
|
+
// If we get here, then there's something about one type or the other
|
|
297
|
+
// that prevents an exactly rounded result from being calculated
|
|
298
|
+
// (or at least it's not clear how to implement such a thing).
|
|
299
|
+
//
|
|
300
|
+
using default_ops::eval_divide;
|
|
301
|
+
number<To> fn(safe_convert_to_float<number<To> >(n)), fd(safe_convert_to_float<number<To> >(d));
|
|
302
|
+
eval_divide(result, fn.backend(), fd.backend());
|
|
303
|
+
}
|
|
304
|
+
template <class To, class Integer>
|
|
305
|
+
inline typename std::enable_if<is_number<To>::value || std::is_floating_point<To>::value>::type
|
|
306
|
+
generic_convert_rational_to_float_imp(To& result, const Integer& n, const Integer& d, const std::integral_constant<bool, true>&)
|
|
307
|
+
{
|
|
308
|
+
//
|
|
309
|
+
// If we get here, then there's something about one type or the other
|
|
310
|
+
// that prevents an exactly rounded result from being calculated
|
|
311
|
+
// (or at least it's not clear how to implement such a thing).
|
|
312
|
+
//
|
|
313
|
+
To fd(safe_convert_to_float<To>(d));
|
|
314
|
+
result = safe_convert_to_float<To>(n);
|
|
315
|
+
result /= fd;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
template <class To, class Integer>
|
|
319
|
+
typename std::enable_if<is_number<To>::value || std::is_floating_point<To>::value>::type
|
|
320
|
+
generic_convert_rational_to_float_imp(To& result, Integer& num, Integer& denom, const std::integral_constant<bool, false>&)
|
|
321
|
+
{
|
|
322
|
+
//
|
|
323
|
+
// If we get here, then the precision of type To is known, and the integer type is unbounded
|
|
324
|
+
// so we can use integer division plus manipulation of the remainder to get an exactly
|
|
325
|
+
// rounded result.
|
|
326
|
+
//
|
|
327
|
+
if (num == 0)
|
|
328
|
+
{
|
|
329
|
+
result = 0;
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
bool s = false;
|
|
333
|
+
if (num < 0)
|
|
334
|
+
{
|
|
335
|
+
s = true;
|
|
336
|
+
num = -num;
|
|
337
|
+
}
|
|
338
|
+
std::ptrdiff_t denom_bits = msb(denom);
|
|
339
|
+
std::ptrdiff_t shift = std::numeric_limits<To>::digits + denom_bits - msb(num);
|
|
340
|
+
if (shift > 0)
|
|
341
|
+
num <<= shift;
|
|
342
|
+
else if (shift < 0)
|
|
343
|
+
denom <<= boost::multiprecision::detail::unsigned_abs(shift);
|
|
344
|
+
Integer q, r;
|
|
345
|
+
divide_qr(num, denom, q, r);
|
|
346
|
+
std::ptrdiff_t q_bits = msb(q);
|
|
347
|
+
if (q_bits == std::numeric_limits<To>::digits - 1)
|
|
348
|
+
{
|
|
349
|
+
//
|
|
350
|
+
// Round up if 2 * r > denom:
|
|
351
|
+
//
|
|
352
|
+
r <<= 1;
|
|
353
|
+
int c = r.compare(denom);
|
|
354
|
+
if (c > 0)
|
|
355
|
+
++q;
|
|
356
|
+
else if ((c == 0) && (q & 1u))
|
|
357
|
+
{
|
|
358
|
+
++q;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
else
|
|
362
|
+
{
|
|
363
|
+
BOOST_MP_ASSERT(q_bits == std::numeric_limits<To>::digits);
|
|
364
|
+
//
|
|
365
|
+
// We basically already have the rounding info:
|
|
366
|
+
//
|
|
367
|
+
if (q & 1u)
|
|
368
|
+
{
|
|
369
|
+
if (r || (q & 2u))
|
|
370
|
+
++q;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
using std::ldexp;
|
|
374
|
+
result = do_cast<To>(q);
|
|
375
|
+
result = ldexp(result, static_cast<int>(-shift));
|
|
376
|
+
if (s)
|
|
377
|
+
result = -result;
|
|
378
|
+
}
|
|
379
|
+
template <class To, class Integer>
|
|
380
|
+
inline typename std::enable_if<!(is_number<To>::value || std::is_floating_point<To>::value)>::type
|
|
381
|
+
generic_convert_rational_to_float_imp(To& result, Integer& num, Integer& denom, const std::integral_constant<bool, false>& tag)
|
|
382
|
+
{
|
|
383
|
+
number<To> t;
|
|
384
|
+
generic_convert_rational_to_float_imp(t, num, denom, tag);
|
|
385
|
+
result = t.backend();
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
template <class To, class From>
|
|
389
|
+
inline void generic_convert_rational_to_float(To& result, const From& f)
|
|
390
|
+
{
|
|
391
|
+
//
|
|
392
|
+
// Type From is always a Backend to number<>, or an
|
|
393
|
+
// instance of number<>, but we allow
|
|
394
|
+
// To to be either a Backend type, or a real number type,
|
|
395
|
+
// that way we can call this from generic conversions, and
|
|
396
|
+
// from specific conversions to built in types.
|
|
397
|
+
//
|
|
398
|
+
using actual_from_type = typename std::conditional<is_number<From>::value, From, number<From> >::type ;
|
|
399
|
+
using actual_to_type = typename std::conditional<is_number<To>::value || std::is_floating_point<To>::value, To, number<To> >::type ;
|
|
400
|
+
using integer_type = typename component_type<actual_from_type>::type ;
|
|
401
|
+
using dispatch_tag = std::integral_constant<bool, !std::numeric_limits<integer_type>::is_specialized || std::numeric_limits<integer_type>::is_bounded || !std::numeric_limits<actual_to_type>::is_specialized || !std::numeric_limits<actual_to_type>::is_bounded || (std::numeric_limits<actual_to_type>::radix != 2)>;
|
|
402
|
+
|
|
403
|
+
integer_type n(numerator(static_cast<actual_from_type>(f))), d(denominator(static_cast<actual_from_type>(f)));
|
|
404
|
+
generic_convert_rational_to_float_imp(result, n, d, dispatch_tag());
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
template <class To, class From>
|
|
408
|
+
inline void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_floating_point>& /*to_type*/, const std::integral_constant<int, number_kind_rational>& /*from_type*/)
|
|
409
|
+
{
|
|
410
|
+
generic_convert_rational_to_float(to, from);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
template <class To, class From>
|
|
414
|
+
void generic_interconvert_float2rational(To& to, const From& from, const std::integral_constant<int, 2>& /*radix*/)
|
|
415
|
+
{
|
|
416
|
+
using std::ldexp;
|
|
417
|
+
using std::frexp;
|
|
418
|
+
using ui_type = typename std::tuple_element<0, typename To::unsigned_types>::type;
|
|
419
|
+
constexpr int shift = std::numeric_limits<long long>::digits;
|
|
420
|
+
typename From::exponent_type e;
|
|
421
|
+
typename component_type<number<To>>::type num, denom;
|
|
422
|
+
number<From> val(from);
|
|
423
|
+
val = frexp(val, &e);
|
|
424
|
+
while (val)
|
|
425
|
+
{
|
|
426
|
+
val = ldexp(val, shift);
|
|
427
|
+
e -= shift;
|
|
428
|
+
long long ll = boost::multiprecision::detail::lltrunc(val);
|
|
429
|
+
val -= ll;
|
|
430
|
+
num <<= shift;
|
|
431
|
+
num += ll;
|
|
432
|
+
}
|
|
433
|
+
denom = ui_type(1u);
|
|
434
|
+
if (e < 0)
|
|
435
|
+
denom <<= -e;
|
|
436
|
+
else if (e > 0)
|
|
437
|
+
num <<= e;
|
|
438
|
+
assign_components(to, num.backend(), denom.backend());
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
template <class To, class From, int Radix>
|
|
442
|
+
void generic_interconvert_float2rational(To& to, const From& from, const std::integral_constant<int, Radix>& /*radix*/)
|
|
443
|
+
{
|
|
444
|
+
using std::ilogb;
|
|
445
|
+
using std::scalbn;
|
|
446
|
+
using std::pow;
|
|
447
|
+
using std::abs;
|
|
448
|
+
//
|
|
449
|
+
// This is almost the same as the binary case above, but we have to use
|
|
450
|
+
// scalbn and ilogb rather than ldexp and frexp, we also only extract
|
|
451
|
+
// one Radix digit at a time which is terribly inefficient!
|
|
452
|
+
//
|
|
453
|
+
using ui_type = typename std::tuple_element<0, typename To::unsigned_types>::type;
|
|
454
|
+
typename From::exponent_type e;
|
|
455
|
+
typename component_type<number<To>>::type num, denom;
|
|
456
|
+
number<From> val(from);
|
|
457
|
+
|
|
458
|
+
if (!val)
|
|
459
|
+
{
|
|
460
|
+
to = ui_type(0u);
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
e = ilogb(val);
|
|
465
|
+
val = scalbn(val, -e);
|
|
466
|
+
while (val)
|
|
467
|
+
{
|
|
468
|
+
long long ll = boost::multiprecision::detail::lltrunc(val);
|
|
469
|
+
val -= ll;
|
|
470
|
+
val = scalbn(val, 1);
|
|
471
|
+
num *= Radix;
|
|
472
|
+
num += ll;
|
|
473
|
+
--e;
|
|
474
|
+
}
|
|
475
|
+
++e;
|
|
476
|
+
denom = ui_type(Radix);
|
|
477
|
+
denom = pow(denom, abs(e));
|
|
478
|
+
if (e > 0)
|
|
479
|
+
{
|
|
480
|
+
num *= denom;
|
|
481
|
+
denom = 1;
|
|
482
|
+
}
|
|
483
|
+
assign_components(to, num.backend(), denom.backend());
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
template <class To, class From>
|
|
487
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_rational>& /*to_type*/, const std::integral_constant<int, number_kind_floating_point>& /*from_type*/)
|
|
488
|
+
{
|
|
489
|
+
generic_interconvert_float2rational(to, from, std::integral_constant<int, std::numeric_limits<number<From> >::is_specialized ? std::numeric_limits<number<From> >::radix : 2>());
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
template <class To, class From>
|
|
493
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_integer>& /*to_type*/, const std::integral_constant<int, number_kind_rational>& /*from_type*/)
|
|
494
|
+
{
|
|
495
|
+
number<From> t(from);
|
|
496
|
+
number<To> result(numerator(t) / denominator(t));
|
|
497
|
+
to = result.backend();
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
template <class To, class From>
|
|
501
|
+
void generic_interconvert_float2int(To& to, const From& from, const std::integral_constant<int, 2>& /*radix*/)
|
|
502
|
+
{
|
|
503
|
+
using std::frexp;
|
|
504
|
+
using std::ldexp;
|
|
505
|
+
|
|
506
|
+
using exponent_type = typename From::exponent_type;
|
|
507
|
+
constexpr exponent_type shift = std::numeric_limits<long long>::digits;
|
|
508
|
+
exponent_type e;
|
|
509
|
+
number<To> num(0u);
|
|
510
|
+
number<From> val(from);
|
|
511
|
+
val = frexp(val, &e);
|
|
512
|
+
bool neg = false;
|
|
513
|
+
if (val.sign() < 0)
|
|
514
|
+
{
|
|
515
|
+
val.backend().negate();
|
|
516
|
+
neg = true;
|
|
517
|
+
}
|
|
518
|
+
while (e > 0)
|
|
519
|
+
{
|
|
520
|
+
exponent_type s = (std::min)(e, shift);
|
|
521
|
+
val = ldexp(val, s);
|
|
522
|
+
e -= s;
|
|
523
|
+
long long ll = boost::multiprecision::detail::lltrunc(val);
|
|
524
|
+
val -= ll;
|
|
525
|
+
num <<= s;
|
|
526
|
+
num += ll;
|
|
527
|
+
}
|
|
528
|
+
to = num.backend();
|
|
529
|
+
if (neg)
|
|
530
|
+
to.negate();
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
template <class To, class From, int Radix>
|
|
534
|
+
void generic_interconvert_float2int(To& to, const From& from, const std::integral_constant<int, Radix>& /*radix*/)
|
|
535
|
+
{
|
|
536
|
+
using std::ilogb;
|
|
537
|
+
using std::scalbn;
|
|
538
|
+
//
|
|
539
|
+
// This is almost the same as the binary case above, but we have to use
|
|
540
|
+
// scalbn and ilogb rather than ldexp and frexp, we also only extract
|
|
541
|
+
// one Radix digit at a time which is terribly inefficient!
|
|
542
|
+
//
|
|
543
|
+
typename From::exponent_type e;
|
|
544
|
+
number<To> num(0u);
|
|
545
|
+
number<From> val(from);
|
|
546
|
+
e = ilogb(val);
|
|
547
|
+
val = scalbn(val, -e);
|
|
548
|
+
while (e >= 0)
|
|
549
|
+
{
|
|
550
|
+
long long ll = boost::multiprecision::detail::lltrunc(val);
|
|
551
|
+
val -= ll;
|
|
552
|
+
val = scalbn(val, 1);
|
|
553
|
+
num *= Radix;
|
|
554
|
+
num += ll;
|
|
555
|
+
--e;
|
|
556
|
+
}
|
|
557
|
+
to = num.backend();
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
template <class To, class From>
|
|
561
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_integer>& /*to_type*/, const std::integral_constant<int, number_kind_floating_point>& /*from_type*/)
|
|
562
|
+
{
|
|
563
|
+
generic_interconvert_float2int(to, from, std::integral_constant<int, (std::numeric_limits<number<From> >::is_specialized ? std::numeric_limits<number<From> >::radix : 2)>());
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
template <class To, class From, class tag>
|
|
567
|
+
void generic_interconvert_complex_to_scalar(To& to, const From& from, const std::integral_constant<bool, true>&, const tag&)
|
|
568
|
+
{
|
|
569
|
+
// We just want the real part, and "to" is the correct type already:
|
|
570
|
+
eval_real(to, from);
|
|
571
|
+
|
|
572
|
+
To im;
|
|
573
|
+
eval_imag(im, from);
|
|
574
|
+
if (!eval_is_zero(im))
|
|
575
|
+
BOOST_MP_THROW_EXCEPTION(std::runtime_error("Could not convert imaginary number to scalar."));
|
|
576
|
+
}
|
|
577
|
+
template <class To, class From>
|
|
578
|
+
void generic_interconvert_complex_to_scalar(To& to, const From& from, const std::integral_constant<bool, false>&, const std::integral_constant<bool, true>&)
|
|
579
|
+
{
|
|
580
|
+
using component_number = typename component_type<number<From> >::type;
|
|
581
|
+
using component_backend = typename component_number::backend_type ;
|
|
582
|
+
//
|
|
583
|
+
// Get the real part and copy-construct the result from it:
|
|
584
|
+
//
|
|
585
|
+
scoped_precision_options<component_number> scope(from);
|
|
586
|
+
component_backend r;
|
|
587
|
+
generic_interconvert_complex_to_scalar(r, from, std::integral_constant<bool, true>(), std::integral_constant<bool, true>());
|
|
588
|
+
to = r;
|
|
589
|
+
}
|
|
590
|
+
template <class To, class From>
|
|
591
|
+
void generic_interconvert_complex_to_scalar(To& to, const From& from, const std::integral_constant<bool, false>&, const std::integral_constant<bool, false>&)
|
|
592
|
+
{
|
|
593
|
+
using component_number = typename component_type<number<From> >::type;
|
|
594
|
+
using component_backend = typename component_number::backend_type;
|
|
595
|
+
//
|
|
596
|
+
// Get the real part and use a generic_interconvert to type To:
|
|
597
|
+
//
|
|
598
|
+
scoped_precision_options<component_number> scope(from);
|
|
599
|
+
component_backend r;
|
|
600
|
+
generic_interconvert_complex_to_scalar(r, from, std::integral_constant<bool, true>(), std::integral_constant<bool, true>());
|
|
601
|
+
generic_interconvert(to, r, std::integral_constant<int, number_category<To>::value>(), std::integral_constant<int, number_category<component_backend>::value>());
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
template <class To, class From>
|
|
605
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_floating_point>& /*to_type*/, const std::integral_constant<int, number_kind_complex>& /*from_type*/)
|
|
606
|
+
{
|
|
607
|
+
using component_number = typename component_type<number<From> >::type;
|
|
608
|
+
using component_backend = typename component_number::backend_type ;
|
|
609
|
+
|
|
610
|
+
generic_interconvert_complex_to_scalar(to, from, std::integral_constant<bool, std::is_same<component_backend, To>::value>(), std::integral_constant<bool, std::is_constructible<To, const component_backend&>::value>());
|
|
611
|
+
}
|
|
612
|
+
template <class To, class From>
|
|
613
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_integer>& /*to_type*/, const std::integral_constant<int, number_kind_complex>& /*from_type*/)
|
|
614
|
+
{
|
|
615
|
+
using component_number = typename component_type<number<From> >::type;
|
|
616
|
+
using component_backend = typename component_number::backend_type ;
|
|
617
|
+
|
|
618
|
+
generic_interconvert_complex_to_scalar(to, from, std::integral_constant<bool, std::is_same<component_backend, To>::value>(), std::integral_constant<bool, std::is_constructible<To, const component_backend&>::value>());
|
|
619
|
+
}
|
|
620
|
+
template <class To, class From>
|
|
621
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_rational>& /*to_type*/, const std::integral_constant<int, number_kind_complex>& /*from_type*/)
|
|
622
|
+
{
|
|
623
|
+
using component_number = typename component_type<number<From> >::type;
|
|
624
|
+
using component_backend = typename component_number::backend_type ;
|
|
625
|
+
|
|
626
|
+
generic_interconvert_complex_to_scalar(to, from, std::integral_constant<bool, std::is_same<component_backend, To>::value>(), std::integral_constant<bool, std::is_constructible<To, const component_backend&>::value>());
|
|
627
|
+
}
|
|
628
|
+
template <class To, class From>
|
|
629
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_complex>& /*to_type*/, const std::integral_constant<int, number_kind_integer>& /*from_type*/)
|
|
630
|
+
{
|
|
631
|
+
using component_number = typename component_type<number<To> >::type;
|
|
632
|
+
|
|
633
|
+
scoped_source_precision<number<From> > scope1;
|
|
634
|
+
scoped_precision_options<component_number> scope2(number<To>::thread_default_precision(), number<To>::thread_default_variable_precision_options());
|
|
635
|
+
(void)scope1;
|
|
636
|
+
(void)scope2;
|
|
637
|
+
|
|
638
|
+
number<From> f(from);
|
|
639
|
+
component_number scalar(f);
|
|
640
|
+
number<To> result(scalar);
|
|
641
|
+
to = result.backend();
|
|
642
|
+
}
|
|
643
|
+
template <class To, class From>
|
|
644
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_complex>& /*to_type*/, const std::integral_constant<int, number_kind_rational>& /*from_type*/)
|
|
645
|
+
{
|
|
646
|
+
using component_number = typename component_type<number<To> >::type;
|
|
647
|
+
|
|
648
|
+
scoped_source_precision<number<From> > scope1;
|
|
649
|
+
scoped_precision_options<component_number> scope2(number<To>::thread_default_precision(), number<To>::thread_default_variable_precision_options());
|
|
650
|
+
(void)scope1;
|
|
651
|
+
(void)scope2;
|
|
652
|
+
|
|
653
|
+
number<From> f(from);
|
|
654
|
+
component_number scalar(f);
|
|
655
|
+
number<To> result(scalar);
|
|
656
|
+
to = result.backend();
|
|
657
|
+
}
|
|
658
|
+
template <class To, class From>
|
|
659
|
+
void generic_interconvert(To& to, const From& from, const std::integral_constant<int, number_kind_complex>& /*to_type*/, const std::integral_constant<int, number_kind_floating_point>& /*from_type*/)
|
|
660
|
+
{
|
|
661
|
+
using component_number = typename component_type<number<To> >::type;
|
|
662
|
+
|
|
663
|
+
scoped_source_precision<number<From> > scope1;
|
|
664
|
+
scoped_precision_options<component_number> scope2(number<To>::thread_default_precision(), number<To>::thread_default_variable_precision_options());
|
|
665
|
+
(void)scope1;
|
|
666
|
+
(void)scope2;
|
|
667
|
+
|
|
668
|
+
number<From> f(from);
|
|
669
|
+
component_number scalar(f);
|
|
670
|
+
number<To> result(scalar);
|
|
671
|
+
to = result.backend();
|
|
672
|
+
}
|
|
673
|
+
template <class To, class From, int Tag1, int Tag2>
|
|
674
|
+
void generic_interconvert(To& /*to*/, const From& /*from*/, const std::integral_constant<int, Tag1>& /*to_type*/, const std::integral_constant<int, Tag2>& /*from_type*/)
|
|
675
|
+
{
|
|
676
|
+
static_assert(sizeof(To) == 0, "Sorry, you asked for a conversion bewteen types that hasn't been implemented yet!!");
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
} // namespace boost::multiprecision::detail
|
|
682
|
+
|
|
683
|
+
#ifdef BOOST_MSVC
|
|
684
|
+
#pragma warning(pop)
|
|
685
|
+
#endif
|
|
686
|
+
|
|
687
|
+
#endif // BOOST_MP_GENERIC_INTERCONVERT_HPP
|