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,889 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright 2012 John Maddock. Distributed under the Boost
|
|
3
|
+
// Software License, Version 1.0. (See accompanying file
|
|
4
|
+
// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
|
|
5
|
+
//
|
|
6
|
+
// Comparison operators for cpp_int_backend:
|
|
7
|
+
//
|
|
8
|
+
#ifndef BOOST_MP_CPP_INT_BITWISE_HPP
|
|
9
|
+
#define BOOST_MP_CPP_INT_BITWISE_HPP
|
|
10
|
+
|
|
11
|
+
#include <stdexcept>
|
|
12
|
+
#include <type_traits>
|
|
13
|
+
#include <boost/multiprecision/detail/endian.hpp>
|
|
14
|
+
#include <boost/multiprecision/detail/no_exceptions_support.hpp>
|
|
15
|
+
#include <boost/multiprecision/detail/assert.hpp>
|
|
16
|
+
|
|
17
|
+
#ifdef BOOST_MSVC
|
|
18
|
+
#pragma warning(push)
|
|
19
|
+
#pragma warning(disable : 4319)
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
namespace boost { namespace multiprecision { namespace backends {
|
|
24
|
+
|
|
25
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
26
|
+
BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
|
27
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
28
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const std::integral_constant<int, checked>&)
|
|
29
|
+
{
|
|
30
|
+
if (result.sign() || o.sign())
|
|
31
|
+
BOOST_MP_THROW_EXCEPTION(std::range_error("Bitwise operations on negative values results in undefined behavior."));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
35
|
+
BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
|
36
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&,
|
|
37
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>&, const std::integral_constant<int, unchecked>&) {}
|
|
38
|
+
|
|
39
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
|
40
|
+
BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
|
41
|
+
const cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>& result, const std::integral_constant<int, checked>&)
|
|
42
|
+
{
|
|
43
|
+
if (result.sign())
|
|
44
|
+
BOOST_MP_THROW_EXCEPTION(std::range_error("Bitwise operations on negative values results in undefined behavior."));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
|
48
|
+
BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
|
49
|
+
const cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>&, const std::integral_constant<int, checked>&) {}
|
|
50
|
+
|
|
51
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
|
52
|
+
BOOST_MP_CXX14_CONSTEXPR void is_valid_bitwise_op(
|
|
53
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>&, const std::integral_constant<int, unchecked>&) {}
|
|
54
|
+
|
|
55
|
+
template <class CppInt1, class CppInt2, class Op>
|
|
56
|
+
BOOST_MP_CXX14_CONSTEXPR void bitwise_op(
|
|
57
|
+
CppInt1& result,
|
|
58
|
+
const CppInt2& o,
|
|
59
|
+
Op op, const std::integral_constant<bool, true>&) noexcept((is_non_throwing_cpp_int<CppInt1>::value))
|
|
60
|
+
{
|
|
61
|
+
//
|
|
62
|
+
// There are 4 cases:
|
|
63
|
+
// * Both positive.
|
|
64
|
+
// * result negative, o positive.
|
|
65
|
+
// * o negative, result positive.
|
|
66
|
+
// * Both negative.
|
|
67
|
+
//
|
|
68
|
+
// When one arg is negative we convert to 2's complement form "on the fly",
|
|
69
|
+
// and then convert back to signed-magnitude form at the end.
|
|
70
|
+
//
|
|
71
|
+
// Note however, that if the type is checked, then bitwise ops on negative values
|
|
72
|
+
// are not permitted and an exception will result.
|
|
73
|
+
//
|
|
74
|
+
is_valid_bitwise_op(result, o, typename CppInt1::checked_type());
|
|
75
|
+
//
|
|
76
|
+
// First figure out how big the result needs to be and set up some data:
|
|
77
|
+
//
|
|
78
|
+
std::size_t rs = result.size();
|
|
79
|
+
std::size_t os = o.size();
|
|
80
|
+
std::size_t m(0), x(0);
|
|
81
|
+
minmax(rs, os, m, x);
|
|
82
|
+
result.resize(x, x);
|
|
83
|
+
typename CppInt1::limb_pointer pr = result.limbs();
|
|
84
|
+
typename CppInt2::const_limb_pointer po = o.limbs();
|
|
85
|
+
for (std::size_t i = rs; i < x; ++i)
|
|
86
|
+
pr[i] = 0;
|
|
87
|
+
|
|
88
|
+
limb_type next_limb = 0;
|
|
89
|
+
|
|
90
|
+
if (!result.sign())
|
|
91
|
+
{
|
|
92
|
+
if (!o.sign())
|
|
93
|
+
{
|
|
94
|
+
for (std::size_t i = 0; i < os; ++i)
|
|
95
|
+
pr[i] = op(pr[i], po[i]);
|
|
96
|
+
for (std::size_t i = os; i < x; ++i)
|
|
97
|
+
pr[i] = op(pr[i], limb_type(0));
|
|
98
|
+
}
|
|
99
|
+
else
|
|
100
|
+
{
|
|
101
|
+
// "o" is negative:
|
|
102
|
+
double_limb_type carry = 1;
|
|
103
|
+
for (std::size_t i = 0; i < os; ++i)
|
|
104
|
+
{
|
|
105
|
+
carry += static_cast<double_limb_type>(~po[i]);
|
|
106
|
+
pr[i] = op(pr[i], static_cast<limb_type>(carry));
|
|
107
|
+
carry >>= CppInt1::limb_bits;
|
|
108
|
+
}
|
|
109
|
+
for (std::size_t i = os; i < x; ++i)
|
|
110
|
+
{
|
|
111
|
+
carry += static_cast<double_limb_type>(~limb_type(0));
|
|
112
|
+
pr[i] = op(pr[i], static_cast<limb_type>(carry));
|
|
113
|
+
carry >>= CppInt1::limb_bits;
|
|
114
|
+
}
|
|
115
|
+
// Set the overflow into the "extra" limb:
|
|
116
|
+
carry += static_cast<double_limb_type>(~limb_type(0));
|
|
117
|
+
next_limb = op(limb_type(0), static_cast<limb_type>(carry));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else
|
|
121
|
+
{
|
|
122
|
+
if (!o.sign())
|
|
123
|
+
{
|
|
124
|
+
// "result" is negative:
|
|
125
|
+
double_limb_type carry = 1;
|
|
126
|
+
for (std::size_t i = 0; i < os; ++i)
|
|
127
|
+
{
|
|
128
|
+
carry += static_cast<double_limb_type>(~pr[i]);
|
|
129
|
+
pr[i] = op(static_cast<limb_type>(carry), po[i]);
|
|
130
|
+
carry >>= CppInt1::limb_bits;
|
|
131
|
+
}
|
|
132
|
+
for (std::size_t i = os; i < x; ++i)
|
|
133
|
+
{
|
|
134
|
+
carry += static_cast<double_limb_type>(~pr[i]);
|
|
135
|
+
pr[i] = op(static_cast<limb_type>(carry), limb_type(0));
|
|
136
|
+
carry >>= CppInt1::limb_bits;
|
|
137
|
+
}
|
|
138
|
+
// Set the overflow into the "extra" limb:
|
|
139
|
+
carry += static_cast<double_limb_type>(~limb_type(0));
|
|
140
|
+
next_limb = op(static_cast<limb_type>(carry), limb_type(0));
|
|
141
|
+
}
|
|
142
|
+
else
|
|
143
|
+
{
|
|
144
|
+
// both are negative:
|
|
145
|
+
double_limb_type r_carry = 1;
|
|
146
|
+
double_limb_type o_carry = 1;
|
|
147
|
+
for (std::size_t i = 0; i < os; ++i)
|
|
148
|
+
{
|
|
149
|
+
r_carry += static_cast<double_limb_type>(~pr[i]);
|
|
150
|
+
o_carry += static_cast<double_limb_type>(~po[i]);
|
|
151
|
+
pr[i] = op(static_cast<limb_type>(r_carry), static_cast<limb_type>(o_carry));
|
|
152
|
+
r_carry >>= CppInt1::limb_bits;
|
|
153
|
+
o_carry >>= CppInt1::limb_bits;
|
|
154
|
+
}
|
|
155
|
+
for (std::size_t i = os; i < x; ++i)
|
|
156
|
+
{
|
|
157
|
+
r_carry += static_cast<double_limb_type>(~pr[i]);
|
|
158
|
+
o_carry += static_cast<double_limb_type>(~limb_type(0));
|
|
159
|
+
pr[i] = op(static_cast<limb_type>(r_carry), static_cast<limb_type>(o_carry));
|
|
160
|
+
r_carry >>= CppInt1::limb_bits;
|
|
161
|
+
o_carry >>= CppInt1::limb_bits;
|
|
162
|
+
}
|
|
163
|
+
// Set the overflow into the "extra" limb:
|
|
164
|
+
r_carry += static_cast<double_limb_type>(~limb_type(0));
|
|
165
|
+
o_carry += static_cast<double_limb_type>(~limb_type(0));
|
|
166
|
+
next_limb = op(static_cast<limb_type>(r_carry), static_cast<limb_type>(o_carry));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//
|
|
170
|
+
// See if the result is negative or not:
|
|
171
|
+
//
|
|
172
|
+
if (static_cast<signed_limb_type>(next_limb) < 0)
|
|
173
|
+
{
|
|
174
|
+
double_limb_type carry = 1;
|
|
175
|
+
for (std::size_t i = 0; i < x; ++i)
|
|
176
|
+
{
|
|
177
|
+
carry += static_cast<double_limb_type>(~pr[i]);
|
|
178
|
+
pr[i] = static_cast<limb_type>(carry);
|
|
179
|
+
carry >>= CppInt1::limb_bits;
|
|
180
|
+
}
|
|
181
|
+
if (carry)
|
|
182
|
+
{
|
|
183
|
+
result.resize(x + 1, x);
|
|
184
|
+
if (result.size() > x)
|
|
185
|
+
result.limbs()[x] = static_cast<limb_type>(carry);
|
|
186
|
+
}
|
|
187
|
+
result.sign(true);
|
|
188
|
+
}
|
|
189
|
+
else
|
|
190
|
+
result.sign(false);
|
|
191
|
+
|
|
192
|
+
result.normalize();
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
template <class CppInt1, class CppInt2, class Op>
|
|
196
|
+
BOOST_MP_CXX14_CONSTEXPR void bitwise_op(
|
|
197
|
+
CppInt1& result,
|
|
198
|
+
const CppInt2& o,
|
|
199
|
+
Op op, const std::integral_constant<bool, false>&) noexcept((is_non_throwing_cpp_int<CppInt1>::value))
|
|
200
|
+
{
|
|
201
|
+
//
|
|
202
|
+
// Both arguments are unsigned types, very simple case handled as a special case.
|
|
203
|
+
//
|
|
204
|
+
// First figure out how big the result needs to be and set up some data:
|
|
205
|
+
//
|
|
206
|
+
std::size_t rs = result.size();
|
|
207
|
+
std::size_t os = o.size();
|
|
208
|
+
std::size_t m(0), x(0);
|
|
209
|
+
minmax(rs, os, m, x);
|
|
210
|
+
result.resize(x, x);
|
|
211
|
+
typename CppInt1::limb_pointer pr = result.limbs();
|
|
212
|
+
typename CppInt2::const_limb_pointer po = o.limbs();
|
|
213
|
+
for (std::size_t i = rs; i < x; ++i)
|
|
214
|
+
pr[i] = 0;
|
|
215
|
+
|
|
216
|
+
for (std::size_t i = 0; i < os; ++i)
|
|
217
|
+
pr[i] = op(pr[i], po[i]);
|
|
218
|
+
for (std::size_t i = os; i < x; ++i)
|
|
219
|
+
pr[i] = op(pr[i], limb_type(0));
|
|
220
|
+
|
|
221
|
+
result.normalize();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
struct bit_and
|
|
225
|
+
{
|
|
226
|
+
BOOST_MP_CXX14_CONSTEXPR limb_type operator()(limb_type a, limb_type b) const noexcept { return a & b; }
|
|
227
|
+
};
|
|
228
|
+
struct bit_or
|
|
229
|
+
{
|
|
230
|
+
BOOST_MP_CXX14_CONSTEXPR limb_type operator()(limb_type a, limb_type b) const noexcept { return a | b; }
|
|
231
|
+
};
|
|
232
|
+
struct bit_xor
|
|
233
|
+
{
|
|
234
|
+
BOOST_MP_CXX14_CONSTEXPR limb_type operator()(limb_type a, limb_type b) const noexcept { return a ^ b; }
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
238
|
+
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
|
239
|
+
eval_bitwise_and(
|
|
240
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
241
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
242
|
+
{
|
|
243
|
+
bitwise_op(result, o, bit_and(),
|
|
244
|
+
std::integral_constant<bool, std::numeric_limits<number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> > >::is_signed || std::numeric_limits<number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> > >::is_signed > ());
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
248
|
+
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
|
249
|
+
eval_bitwise_or(
|
|
250
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
251
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
252
|
+
{
|
|
253
|
+
bitwise_op(result, o, bit_or(),
|
|
254
|
+
std::integral_constant<bool, std::numeric_limits<number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> > >::is_signed || std::numeric_limits<number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> > >::is_signed > ());
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
258
|
+
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
|
259
|
+
eval_bitwise_xor(
|
|
260
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
261
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
262
|
+
{
|
|
263
|
+
bitwise_op(result, o, bit_xor(),
|
|
264
|
+
std::integral_constant<bool, std::numeric_limits<number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> > >::is_signed || std::numeric_limits<number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> > >::is_signed > ());
|
|
265
|
+
}
|
|
266
|
+
//
|
|
267
|
+
// Again for operands which are single limbs:
|
|
268
|
+
//
|
|
269
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
|
270
|
+
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type
|
|
271
|
+
eval_bitwise_and(
|
|
272
|
+
cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,
|
|
273
|
+
limb_type l) noexcept
|
|
274
|
+
{
|
|
275
|
+
result.limbs()[0] &= l;
|
|
276
|
+
result.resize(1, 1);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
|
280
|
+
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type
|
|
281
|
+
eval_bitwise_or(
|
|
282
|
+
cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,
|
|
283
|
+
limb_type l) noexcept
|
|
284
|
+
{
|
|
285
|
+
result.limbs()[0] |= l;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
|
289
|
+
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type
|
|
290
|
+
eval_bitwise_xor(
|
|
291
|
+
cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,
|
|
292
|
+
limb_type l) noexcept
|
|
293
|
+
{
|
|
294
|
+
result.limbs()[0] ^= l;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
298
|
+
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
|
299
|
+
eval_complement(
|
|
300
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
301
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
302
|
+
{
|
|
303
|
+
static_assert(((Checked1 != checked) || (Checked2 != checked)), "Attempt to take the complement of a signed type results in undefined behavior.");
|
|
304
|
+
// Increment and negate:
|
|
305
|
+
result = o;
|
|
306
|
+
eval_increment(result);
|
|
307
|
+
result.negate();
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
|
311
|
+
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
|
312
|
+
eval_complement(
|
|
313
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
314
|
+
const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
315
|
+
{
|
|
316
|
+
std::size_t os = o.size();
|
|
317
|
+
result.resize(SIZE_MAX, os);
|
|
318
|
+
for (std::size_t i = 0; i < os; ++i)
|
|
319
|
+
result.limbs()[i] = ~o.limbs()[i];
|
|
320
|
+
for (std::size_t i = os; i < result.size(); ++i)
|
|
321
|
+
result.limbs()[i] = ~static_cast<limb_type>(0);
|
|
322
|
+
result.normalize();
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
template <class Int>
|
|
326
|
+
inline void left_shift_byte(Int& result, double_limb_type s)
|
|
327
|
+
{
|
|
328
|
+
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
|
329
|
+
limb_type shift = static_cast<limb_type>(s % Int::limb_bits);
|
|
330
|
+
std::size_t ors = result.size();
|
|
331
|
+
if ((ors == 1) && (!*result.limbs()))
|
|
332
|
+
return; // shifting zero yields zero.
|
|
333
|
+
std::size_t rs = ors;
|
|
334
|
+
if (shift && (result.limbs()[ors - 1] >> (Int::limb_bits - shift)))
|
|
335
|
+
++rs; // Most significant limb will overflow when shifted
|
|
336
|
+
rs += offset;
|
|
337
|
+
result.resize(rs, rs);
|
|
338
|
+
rs = result.size();
|
|
339
|
+
|
|
340
|
+
typename Int::limb_pointer pr = result.limbs();
|
|
341
|
+
|
|
342
|
+
if (rs != ors)
|
|
343
|
+
pr[rs - 1] = 0u;
|
|
344
|
+
std::size_t bytes = static_cast<std::size_t>(s / CHAR_BIT);
|
|
345
|
+
std::size_t len = (std::min)(ors * sizeof(limb_type), rs * sizeof(limb_type) - bytes);
|
|
346
|
+
if (bytes >= rs * sizeof(limb_type))
|
|
347
|
+
result = static_cast<limb_type>(0u);
|
|
348
|
+
else
|
|
349
|
+
{
|
|
350
|
+
unsigned char* pc = reinterpret_cast<unsigned char*>(pr);
|
|
351
|
+
std::memmove(pc + bytes, pc, len);
|
|
352
|
+
std::memset(pc, 0, bytes);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
template <class Int>
|
|
357
|
+
inline BOOST_MP_CXX14_CONSTEXPR void left_shift_limb(Int& result, double_limb_type s)
|
|
358
|
+
{
|
|
359
|
+
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
|
360
|
+
limb_type shift = static_cast<limb_type>(s % Int::limb_bits);
|
|
361
|
+
|
|
362
|
+
std::size_t ors = result.size();
|
|
363
|
+
if ((ors == 1) && (!*result.limbs()))
|
|
364
|
+
return; // shifting zero yields zero.
|
|
365
|
+
std::size_t rs = ors;
|
|
366
|
+
if (shift && (result.limbs()[ors - 1] >> (Int::limb_bits - shift)))
|
|
367
|
+
++rs; // Most significant limb will overflow when shifted
|
|
368
|
+
rs += offset;
|
|
369
|
+
result.resize(rs, rs);
|
|
370
|
+
|
|
371
|
+
typename Int::limb_pointer pr = result.limbs();
|
|
372
|
+
|
|
373
|
+
if (offset > rs)
|
|
374
|
+
{
|
|
375
|
+
// The result is shifted past the end of the result:
|
|
376
|
+
result = static_cast<limb_type>(0);
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
std::size_t i = rs - result.size();
|
|
381
|
+
for (; i < ors; ++i)
|
|
382
|
+
pr[rs - 1 - i] = pr[ors - 1 - i];
|
|
383
|
+
#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION
|
|
384
|
+
if (BOOST_MP_IS_CONST_EVALUATED(s))
|
|
385
|
+
{
|
|
386
|
+
for (; i < rs; ++i)
|
|
387
|
+
pr[rs - 1 - i] = 0;
|
|
388
|
+
}
|
|
389
|
+
else
|
|
390
|
+
#endif
|
|
391
|
+
{
|
|
392
|
+
std::memset(pr, 0, (rs - i) * sizeof(*pr));
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
template <class Int>
|
|
397
|
+
inline BOOST_MP_CXX14_CONSTEXPR void left_shift_generic(Int& result, double_limb_type s)
|
|
398
|
+
{
|
|
399
|
+
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
|
400
|
+
limb_type shift = static_cast<limb_type>(s % Int::limb_bits);
|
|
401
|
+
|
|
402
|
+
std::size_t ors = result.size();
|
|
403
|
+
if ((ors == 1) && (!*result.limbs()))
|
|
404
|
+
return; // shifting zero yields zero.
|
|
405
|
+
std::size_t rs = ors;
|
|
406
|
+
if (shift && (result.limbs()[ors - 1] >> (Int::limb_bits - shift)))
|
|
407
|
+
++rs; // Most significant limb will overflow when shifted
|
|
408
|
+
rs += offset;
|
|
409
|
+
result.resize(rs, rs);
|
|
410
|
+
bool truncated = result.size() != rs;
|
|
411
|
+
|
|
412
|
+
typename Int::limb_pointer pr = result.limbs();
|
|
413
|
+
|
|
414
|
+
if (offset > rs)
|
|
415
|
+
{
|
|
416
|
+
// The result is shifted past the end of the result:
|
|
417
|
+
result = static_cast<limb_type>(0);
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
std::size_t i = rs - result.size();
|
|
422
|
+
// This code only works when shift is non-zero, otherwise we invoke undefined behaviour!
|
|
423
|
+
BOOST_MP_ASSERT(shift);
|
|
424
|
+
if (!truncated)
|
|
425
|
+
{
|
|
426
|
+
if (rs > ors + offset)
|
|
427
|
+
{
|
|
428
|
+
pr[rs - 1 - i] = pr[ors - 1 - i] >> (Int::limb_bits - shift);
|
|
429
|
+
--rs;
|
|
430
|
+
}
|
|
431
|
+
else
|
|
432
|
+
{
|
|
433
|
+
pr[rs - 1 - i] = pr[ors - 1 - i] << shift;
|
|
434
|
+
if (ors > 1)
|
|
435
|
+
pr[rs - 1 - i] |= pr[ors - 2 - i] >> (Int::limb_bits - shift);
|
|
436
|
+
++i;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
for (; rs - i >= static_cast<std::size_t>(static_cast<std::size_t>(2u) + offset); ++i)
|
|
440
|
+
{
|
|
441
|
+
pr[rs - 1 - i] = pr[rs - 1 - i - offset] << shift;
|
|
442
|
+
pr[rs - 1 - i] |= pr[rs - 2 - i - offset] >> (Int::limb_bits - shift);
|
|
443
|
+
}
|
|
444
|
+
if (rs - i >= static_cast<std::size_t>(static_cast<std::size_t>(1u) + offset))
|
|
445
|
+
{
|
|
446
|
+
pr[rs - 1 - i] = pr[rs - 1 - i - offset] << shift;
|
|
447
|
+
++i;
|
|
448
|
+
}
|
|
449
|
+
#ifndef BOOST_MP_NO_CONSTEXPR_DETECTION
|
|
450
|
+
if (BOOST_MP_IS_CONST_EVALUATED(s))
|
|
451
|
+
{
|
|
452
|
+
for (; i < rs; ++i)
|
|
453
|
+
pr[rs - 1 - i] = 0;
|
|
454
|
+
}
|
|
455
|
+
else
|
|
456
|
+
#endif
|
|
457
|
+
{
|
|
458
|
+
std::memset(pr, 0, (rs - i) * sizeof(*pr));
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1>
|
|
463
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value>::type
|
|
464
|
+
eval_left_shift(
|
|
465
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
466
|
+
double_limb_type s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
467
|
+
{
|
|
468
|
+
is_valid_bitwise_op(result, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());
|
|
469
|
+
if (!s)
|
|
470
|
+
return;
|
|
471
|
+
|
|
472
|
+
#if BOOST_MP_ENDIAN_LITTLE_BYTE && defined(BOOST_MP_USE_LIMB_SHIFT)
|
|
473
|
+
constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits - 1;
|
|
474
|
+
constexpr limb_type byte_shift_mask = CHAR_BIT - 1;
|
|
475
|
+
|
|
476
|
+
if ((s & limb_shift_mask) == 0)
|
|
477
|
+
{
|
|
478
|
+
left_shift_limb(result, s);
|
|
479
|
+
}
|
|
480
|
+
#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION
|
|
481
|
+
else if ((s & byte_shift_mask) == 0)
|
|
482
|
+
#else
|
|
483
|
+
else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))
|
|
484
|
+
#endif
|
|
485
|
+
{
|
|
486
|
+
left_shift_byte(result, s);
|
|
487
|
+
}
|
|
488
|
+
#elif BOOST_MP_ENDIAN_LITTLE_BYTE
|
|
489
|
+
constexpr limb_type byte_shift_mask = CHAR_BIT - 1;
|
|
490
|
+
|
|
491
|
+
#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION
|
|
492
|
+
if ((s & byte_shift_mask) == 0)
|
|
493
|
+
#else
|
|
494
|
+
constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits - 1;
|
|
495
|
+
if (BOOST_MP_IS_CONST_EVALUATED(s) && ((s & limb_shift_mask) == 0))
|
|
496
|
+
left_shift_limb(result, s);
|
|
497
|
+
else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))
|
|
498
|
+
#endif
|
|
499
|
+
{
|
|
500
|
+
left_shift_byte(result, s);
|
|
501
|
+
}
|
|
502
|
+
#else
|
|
503
|
+
constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::limb_bits - 1;
|
|
504
|
+
|
|
505
|
+
if ((s & limb_shift_mask) == 0)
|
|
506
|
+
{
|
|
507
|
+
left_shift_limb(result, s);
|
|
508
|
+
}
|
|
509
|
+
#endif
|
|
510
|
+
else
|
|
511
|
+
{
|
|
512
|
+
left_shift_generic(result, s);
|
|
513
|
+
}
|
|
514
|
+
//
|
|
515
|
+
// We may have shifted off the end and have leading zeros:
|
|
516
|
+
//
|
|
517
|
+
result.normalize();
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
template <class Int>
|
|
521
|
+
inline void right_shift_byte(Int& result, double_limb_type s)
|
|
522
|
+
{
|
|
523
|
+
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
|
524
|
+
BOOST_MP_ASSERT((s % CHAR_BIT) == 0);
|
|
525
|
+
std::size_t ors = result.size();
|
|
526
|
+
std::size_t rs = ors;
|
|
527
|
+
if (offset >= rs)
|
|
528
|
+
{
|
|
529
|
+
result = limb_type(0);
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
rs -= offset;
|
|
533
|
+
typename Int::limb_pointer pr = result.limbs();
|
|
534
|
+
unsigned char* pc = reinterpret_cast<unsigned char*>(pr);
|
|
535
|
+
limb_type shift = static_cast<limb_type>(s / CHAR_BIT);
|
|
536
|
+
std::memmove(pc, pc + shift, ors * sizeof(pr[0]) - shift);
|
|
537
|
+
shift = (sizeof(limb_type) - shift % sizeof(limb_type)) * CHAR_BIT;
|
|
538
|
+
if (shift < Int::limb_bits)
|
|
539
|
+
{
|
|
540
|
+
pr[ors - offset - 1] &= (static_cast<limb_type>(1u) << shift) - 1;
|
|
541
|
+
if (!pr[ors - offset - 1] && (rs > 1))
|
|
542
|
+
--rs;
|
|
543
|
+
}
|
|
544
|
+
result.resize(rs, rs);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
template <class Int>
|
|
548
|
+
inline BOOST_MP_CXX14_CONSTEXPR void right_shift_limb(Int& result, double_limb_type s)
|
|
549
|
+
{
|
|
550
|
+
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
|
551
|
+
BOOST_MP_ASSERT((s % Int::limb_bits) == 0);
|
|
552
|
+
std::size_t ors = result.size();
|
|
553
|
+
std::size_t rs = ors;
|
|
554
|
+
if (offset >= rs)
|
|
555
|
+
{
|
|
556
|
+
result = limb_type(0);
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
rs -= offset;
|
|
560
|
+
typename Int::limb_pointer pr = result.limbs();
|
|
561
|
+
std::size_t i = 0;
|
|
562
|
+
for (; i < rs; ++i)
|
|
563
|
+
pr[i] = pr[i + offset];
|
|
564
|
+
result.resize(rs, rs);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
template <class Int>
|
|
568
|
+
inline BOOST_MP_CXX14_CONSTEXPR void right_shift_generic(Int& result, double_limb_type s)
|
|
569
|
+
{
|
|
570
|
+
limb_type offset = static_cast<limb_type>(s / Int::limb_bits);
|
|
571
|
+
limb_type shift = static_cast<limb_type>(s % Int::limb_bits);
|
|
572
|
+
std::size_t ors = result.size();
|
|
573
|
+
std::size_t rs = ors;
|
|
574
|
+
if (offset >= rs)
|
|
575
|
+
{
|
|
576
|
+
result = limb_type(0);
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
rs -= offset;
|
|
580
|
+
typename Int::limb_pointer pr = result.limbs();
|
|
581
|
+
if ((pr[ors - 1] >> shift) == 0)
|
|
582
|
+
{
|
|
583
|
+
if (--rs == 0)
|
|
584
|
+
{
|
|
585
|
+
result = limb_type(0);
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
std::size_t i = 0;
|
|
590
|
+
|
|
591
|
+
// This code only works for non-zero shift, otherwise we invoke undefined behaviour!
|
|
592
|
+
BOOST_MP_ASSERT(shift);
|
|
593
|
+
for (; i + offset + 1 < ors; ++i)
|
|
594
|
+
{
|
|
595
|
+
pr[i] = pr[i + offset] >> shift;
|
|
596
|
+
pr[i] |= pr[i + offset + 1] << (Int::limb_bits - shift);
|
|
597
|
+
}
|
|
598
|
+
pr[i] = pr[i + offset] >> shift;
|
|
599
|
+
result.resize(rs, rs);
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
|
603
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value>::type
|
|
604
|
+
eval_right_shift(
|
|
605
|
+
cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>& result,
|
|
606
|
+
double_limb_type s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1> >::value))
|
|
607
|
+
{
|
|
608
|
+
is_valid_bitwise_op(result, typename cpp_int_backend<MinBits1, MaxBits1, unsigned_magnitude, Checked1, Allocator1>::checked_type());
|
|
609
|
+
if (!s)
|
|
610
|
+
return;
|
|
611
|
+
|
|
612
|
+
#if BOOST_MP_ENDIAN_LITTLE_BYTE && defined(BOOST_MP_USE_LIMB_SHIFT)
|
|
613
|
+
constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;
|
|
614
|
+
constexpr limb_type byte_shift_mask = CHAR_BIT - 1;
|
|
615
|
+
|
|
616
|
+
if ((s & limb_shift_mask) == 0)
|
|
617
|
+
right_shift_limb(result, s);
|
|
618
|
+
#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION
|
|
619
|
+
else if ((s & byte_shift_mask) == 0)
|
|
620
|
+
#else
|
|
621
|
+
else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))
|
|
622
|
+
#endif
|
|
623
|
+
right_shift_byte(result, s);
|
|
624
|
+
#elif BOOST_MP_ENDIAN_LITTLE_BYTE
|
|
625
|
+
constexpr limb_type byte_shift_mask = CHAR_BIT - 1;
|
|
626
|
+
|
|
627
|
+
#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION
|
|
628
|
+
if ((s & byte_shift_mask) == 0)
|
|
629
|
+
#else
|
|
630
|
+
constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;
|
|
631
|
+
if (BOOST_MP_IS_CONST_EVALUATED(s) && ((s & limb_shift_mask) == 0))
|
|
632
|
+
right_shift_limb(result, s);
|
|
633
|
+
else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))
|
|
634
|
+
#endif
|
|
635
|
+
right_shift_byte(result, s);
|
|
636
|
+
#else
|
|
637
|
+
constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;
|
|
638
|
+
|
|
639
|
+
if ((s & limb_shift_mask) == 0)
|
|
640
|
+
right_shift_limb(result, s);
|
|
641
|
+
#endif
|
|
642
|
+
else
|
|
643
|
+
right_shift_generic(result, s);
|
|
644
|
+
}
|
|
645
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_int_check_type Checked1, class Allocator1>
|
|
646
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<!is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1> >::value>::type
|
|
647
|
+
eval_right_shift(
|
|
648
|
+
cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>& result,
|
|
649
|
+
double_limb_type s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1> >::value))
|
|
650
|
+
{
|
|
651
|
+
is_valid_bitwise_op(result, typename cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::checked_type());
|
|
652
|
+
if (!s)
|
|
653
|
+
return;
|
|
654
|
+
|
|
655
|
+
bool is_neg = result.sign();
|
|
656
|
+
if (is_neg)
|
|
657
|
+
eval_increment(result);
|
|
658
|
+
|
|
659
|
+
#if BOOST_MP_ENDIAN_LITTLE_BYTE && defined(BOOST_MP_USE_LIMB_SHIFT)
|
|
660
|
+
constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;
|
|
661
|
+
constexpr limb_type byte_shift_mask = CHAR_BIT - 1;
|
|
662
|
+
|
|
663
|
+
if ((s & limb_shift_mask) == 0)
|
|
664
|
+
right_shift_limb(result, s);
|
|
665
|
+
#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION
|
|
666
|
+
else if ((s & byte_shift_mask) == 0)
|
|
667
|
+
#else
|
|
668
|
+
else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))
|
|
669
|
+
#endif
|
|
670
|
+
right_shift_byte(result, s);
|
|
671
|
+
#elif BOOST_MP_ENDIAN_LITTLE_BYTE
|
|
672
|
+
constexpr limb_type byte_shift_mask = CHAR_BIT - 1;
|
|
673
|
+
|
|
674
|
+
#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION
|
|
675
|
+
if ((s & byte_shift_mask) == 0)
|
|
676
|
+
#else
|
|
677
|
+
constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;
|
|
678
|
+
if (BOOST_MP_IS_CONST_EVALUATED(s) && ((s & limb_shift_mask) == 0))
|
|
679
|
+
right_shift_limb(result, s);
|
|
680
|
+
else if (((s & byte_shift_mask) == 0) && !BOOST_MP_IS_CONST_EVALUATED(s))
|
|
681
|
+
#endif
|
|
682
|
+
right_shift_byte(result, s);
|
|
683
|
+
#else
|
|
684
|
+
constexpr limb_type limb_shift_mask = cpp_int_backend<MinBits1, MaxBits1, signed_magnitude, Checked1, Allocator1>::limb_bits - 1;
|
|
685
|
+
|
|
686
|
+
if ((s & limb_shift_mask) == 0)
|
|
687
|
+
right_shift_limb(result, s);
|
|
688
|
+
#endif
|
|
689
|
+
else
|
|
690
|
+
right_shift_generic(result, s);
|
|
691
|
+
if (is_neg)
|
|
692
|
+
eval_decrement(result);
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
//
|
|
696
|
+
// Over again for trivial cpp_int's:
|
|
697
|
+
//
|
|
698
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class T>
|
|
699
|
+
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value >::type
|
|
700
|
+
eval_left_shift(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, T s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
701
|
+
{
|
|
702
|
+
is_valid_bitwise_op(result, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());
|
|
703
|
+
*result.limbs() = detail::checked_left_shift(*result.limbs(), s, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());
|
|
704
|
+
result.normalize();
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, class T>
|
|
708
|
+
BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value >::type
|
|
709
|
+
eval_right_shift(cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result, T s) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
710
|
+
{
|
|
711
|
+
// Nothing to check here... just make sure we don't invoke undefined behavior:
|
|
712
|
+
is_valid_bitwise_op(result, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());
|
|
713
|
+
*result.limbs() = (static_cast<unsigned>(s) >= sizeof(*result.limbs()) * CHAR_BIT) ? 0 : (result.sign() ? ((--*result.limbs()) >> s) + 1 : *result.limbs() >> s);
|
|
714
|
+
if (result.sign() && (*result.limbs() == 0))
|
|
715
|
+
result = static_cast<signed_limb_type>(-1);
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
719
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
|
720
|
+
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type
|
|
721
|
+
eval_complement(
|
|
722
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
723
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
724
|
+
{
|
|
725
|
+
static_assert(((Checked1 != checked) || (Checked2 != checked)), "Attempt to take the complement of a signed type results in undefined behavior.");
|
|
726
|
+
//
|
|
727
|
+
// If we're not checked then emulate 2's complement behavior:
|
|
728
|
+
//
|
|
729
|
+
if (o.sign())
|
|
730
|
+
{
|
|
731
|
+
*result.limbs() = *o.limbs() - 1;
|
|
732
|
+
result.sign(false);
|
|
733
|
+
}
|
|
734
|
+
else
|
|
735
|
+
{
|
|
736
|
+
*result.limbs() = 1 + *o.limbs();
|
|
737
|
+
result.sign(true);
|
|
738
|
+
}
|
|
739
|
+
result.normalize();
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
743
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
|
744
|
+
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
|
745
|
+
eval_complement(
|
|
746
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
747
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
748
|
+
{
|
|
749
|
+
*result.limbs() = ~*o.limbs();
|
|
750
|
+
result.normalize();
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
754
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
|
755
|
+
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
|
756
|
+
eval_bitwise_and(
|
|
757
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
758
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
759
|
+
{
|
|
760
|
+
*result.limbs() &= *o.limbs();
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
764
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
|
765
|
+
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type
|
|
766
|
+
eval_bitwise_and(
|
|
767
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
768
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
769
|
+
{
|
|
770
|
+
is_valid_bitwise_op(result, o, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());
|
|
771
|
+
|
|
772
|
+
using default_ops::eval_bit_test;
|
|
773
|
+
using default_ops::eval_increment;
|
|
774
|
+
|
|
775
|
+
if (result.sign() || o.sign())
|
|
776
|
+
{
|
|
777
|
+
constexpr std::size_t m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;
|
|
778
|
+
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t1(result);
|
|
779
|
+
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t2(o);
|
|
780
|
+
eval_bitwise_and(t1, t2);
|
|
781
|
+
bool s = eval_bit_test(t1, m + 1);
|
|
782
|
+
if (s)
|
|
783
|
+
{
|
|
784
|
+
eval_complement(t1, t1);
|
|
785
|
+
eval_increment(t1);
|
|
786
|
+
}
|
|
787
|
+
result = t1;
|
|
788
|
+
result.sign(s);
|
|
789
|
+
}
|
|
790
|
+
else
|
|
791
|
+
{
|
|
792
|
+
*result.limbs() &= *o.limbs();
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
797
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
|
798
|
+
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
|
799
|
+
eval_bitwise_or(
|
|
800
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
801
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
802
|
+
{
|
|
803
|
+
*result.limbs() |= *o.limbs();
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
807
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
|
808
|
+
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type
|
|
809
|
+
eval_bitwise_or(
|
|
810
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
811
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
812
|
+
{
|
|
813
|
+
is_valid_bitwise_op(result, o, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());
|
|
814
|
+
|
|
815
|
+
using default_ops::eval_bit_test;
|
|
816
|
+
using default_ops::eval_increment;
|
|
817
|
+
|
|
818
|
+
if (result.sign() || o.sign())
|
|
819
|
+
{
|
|
820
|
+
constexpr std::size_t m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;
|
|
821
|
+
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t1(result);
|
|
822
|
+
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t2(o);
|
|
823
|
+
eval_bitwise_or(t1, t2);
|
|
824
|
+
bool s = eval_bit_test(t1, m + 1);
|
|
825
|
+
if (s)
|
|
826
|
+
{
|
|
827
|
+
eval_complement(t1, t1);
|
|
828
|
+
eval_increment(t1);
|
|
829
|
+
}
|
|
830
|
+
result = t1;
|
|
831
|
+
result.sign(s);
|
|
832
|
+
}
|
|
833
|
+
else
|
|
834
|
+
{
|
|
835
|
+
*result.limbs() |= *o.limbs();
|
|
836
|
+
result.normalize();
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
841
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
|
842
|
+
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && is_unsigned_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_unsigned_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value>::type
|
|
843
|
+
eval_bitwise_xor(
|
|
844
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
845
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
846
|
+
{
|
|
847
|
+
*result.limbs() ^= *o.limbs();
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
template <std::size_t MinBits1, std::size_t MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, std::size_t MinBits2, std::size_t MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
|
|
851
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
|
852
|
+
is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value && (is_signed_number<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value || is_signed_number<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value)>::type
|
|
853
|
+
eval_bitwise_xor(
|
|
854
|
+
cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& result,
|
|
855
|
+
const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o) noexcept((is_non_throwing_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value))
|
|
856
|
+
{
|
|
857
|
+
is_valid_bitwise_op(result, o, typename cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>::checked_type());
|
|
858
|
+
|
|
859
|
+
using default_ops::eval_bit_test;
|
|
860
|
+
using default_ops::eval_increment;
|
|
861
|
+
|
|
862
|
+
if (result.sign() || o.sign())
|
|
863
|
+
{
|
|
864
|
+
constexpr std::size_t m = detail::static_unsigned_max<detail::static_unsigned_max<MinBits1, MinBits2>::value, detail::static_unsigned_max<MaxBits1, MaxBits2>::value>::value;
|
|
865
|
+
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t1(result);
|
|
866
|
+
cpp_int_backend<m + 1, m + 1, unsigned_magnitude, unchecked, void> t2(o);
|
|
867
|
+
eval_bitwise_xor(t1, t2);
|
|
868
|
+
bool s = eval_bit_test(t1, m + 1);
|
|
869
|
+
if (s)
|
|
870
|
+
{
|
|
871
|
+
eval_complement(t1, t1);
|
|
872
|
+
eval_increment(t1);
|
|
873
|
+
}
|
|
874
|
+
result = t1;
|
|
875
|
+
result.sign(s);
|
|
876
|
+
}
|
|
877
|
+
else
|
|
878
|
+
{
|
|
879
|
+
*result.limbs() ^= *o.limbs();
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
}}} // namespace boost::multiprecision::backends
|
|
884
|
+
|
|
885
|
+
#ifdef BOOST_MSVC
|
|
886
|
+
#pragma warning(pop)
|
|
887
|
+
#endif
|
|
888
|
+
|
|
889
|
+
#endif
|