mqt-core 3.3.2__cp312-cp312-win_amd64.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 +89 -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/bin/mqt-core-algorithms.dll +0 -0
- mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
- mqt/core/bin/mqt-core-dd.dll +0 -0
- mqt/core/bin/mqt-core-ds.dll +0 -0
- mqt/core/bin/mqt-core-fomac.dll +0 -0
- mqt/core/bin/mqt-core-ir.dll +0 -0
- mqt/core/bin/mqt-core-na-fomac.dll +0 -0
- mqt/core/bin/mqt-core-na.dll +0 -0
- mqt/core/bin/mqt-core-qasm.dll +0 -0
- mqt/core/bin/mqt-core-qdmi-driver.dll +0 -0
- mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
- mqt/core/bin/mqt-core-zx.dll +0 -0
- mqt/core/dd.cp312-win_amd64.pyd +0 -0
- mqt/core/dd.pyi +1016 -0
- mqt/core/dd_evaluation.py +368 -0
- mqt/core/fomac.cp312-win_amd64.pyd +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.cp312-win_amd64.pyd +0 -0
- mqt/core/lib/mqt-core-algorithms.lib +0 -0
- mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
- mqt/core/lib/mqt-core-dd.lib +0 -0
- mqt/core/lib/mqt-core-ds.lib +0 -0
- mqt/core/lib/mqt-core-fomac.lib +0 -0
- mqt/core/lib/mqt-core-ir.lib +0 -0
- mqt/core/lib/mqt-core-na-fomac.lib +0 -0
- mqt/core/lib/mqt-core-na.lib +0 -0
- mqt/core/lib/mqt-core-qasm.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-driver.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
- mqt/core/lib/mqt-core-zx.lib +0 -0
- mqt/core/lib/pkgconfig/spdlog.pc +13 -0
- mqt/core/lib/spdlog.lib +0 -0
- mqt/core/na/__init__.py +12 -0
- mqt/core/na/fomac.cp312-win_amd64.pyd +0 -0
- mqt/core/na/fomac.pyi +117 -0
- mqt/core/nlohmann_json.natvis +278 -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 +445 -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 +110 -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 +121 -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/DELVEWHEEL +2 -0
- mqt_core-3.3.2.dist-info/METADATA +210 -0
- mqt_core-3.3.2.dist-info/RECORD +537 -0
- mqt_core-3.3.2.dist-info/WHEEL +5 -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
- mqt_core.libs/msvcp140.dll +0 -0
|
@@ -0,0 +1,988 @@
|
|
|
1
|
+
// __ _____ _____ _____
|
|
2
|
+
// __| | __| | | | JSON for Modern C++
|
|
3
|
+
// | | |__ | | | | | | version 3.12.0
|
|
4
|
+
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|
5
|
+
//
|
|
6
|
+
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
|
|
7
|
+
// SPDX-License-Identifier: MIT
|
|
8
|
+
|
|
9
|
+
#pragma once
|
|
10
|
+
|
|
11
|
+
#include <algorithm> // all_of
|
|
12
|
+
#include <cctype> // isdigit
|
|
13
|
+
#include <cerrno> // errno, ERANGE
|
|
14
|
+
#include <cstdlib> // strtoull
|
|
15
|
+
#ifndef JSON_NO_IO
|
|
16
|
+
#include <iosfwd> // ostream
|
|
17
|
+
#endif // JSON_NO_IO
|
|
18
|
+
#include <limits> // max
|
|
19
|
+
#include <numeric> // accumulate
|
|
20
|
+
#include <string> // string
|
|
21
|
+
#include <utility> // move
|
|
22
|
+
#include <vector> // vector
|
|
23
|
+
|
|
24
|
+
#include <nlohmann/detail/exceptions.hpp>
|
|
25
|
+
#include <nlohmann/detail/macro_scope.hpp>
|
|
26
|
+
#include <nlohmann/detail/string_concat.hpp>
|
|
27
|
+
#include <nlohmann/detail/string_escape.hpp>
|
|
28
|
+
#include <nlohmann/detail/value_t.hpp>
|
|
29
|
+
|
|
30
|
+
NLOHMANN_JSON_NAMESPACE_BEGIN
|
|
31
|
+
|
|
32
|
+
/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document
|
|
33
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/
|
|
34
|
+
template<typename RefStringType>
|
|
35
|
+
class json_pointer
|
|
36
|
+
{
|
|
37
|
+
// allow basic_json to access private members
|
|
38
|
+
NLOHMANN_BASIC_JSON_TPL_DECLARATION
|
|
39
|
+
friend class basic_json;
|
|
40
|
+
|
|
41
|
+
template<typename>
|
|
42
|
+
friend class json_pointer;
|
|
43
|
+
|
|
44
|
+
template<typename T>
|
|
45
|
+
struct string_t_helper
|
|
46
|
+
{
|
|
47
|
+
using type = T;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
NLOHMANN_BASIC_JSON_TPL_DECLARATION
|
|
51
|
+
struct string_t_helper<NLOHMANN_BASIC_JSON_TPL>
|
|
52
|
+
{
|
|
53
|
+
using type = StringType;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
public:
|
|
57
|
+
// for backwards compatibility accept BasicJsonType
|
|
58
|
+
using string_t = typename string_t_helper<RefStringType>::type;
|
|
59
|
+
|
|
60
|
+
/// @brief create JSON pointer
|
|
61
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/json_pointer/
|
|
62
|
+
explicit json_pointer(const string_t& s = "")
|
|
63
|
+
: reference_tokens(split(s))
|
|
64
|
+
{}
|
|
65
|
+
|
|
66
|
+
/// @brief return a string representation of the JSON pointer
|
|
67
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/to_string/
|
|
68
|
+
string_t to_string() const
|
|
69
|
+
{
|
|
70
|
+
return std::accumulate(reference_tokens.begin(), reference_tokens.end(),
|
|
71
|
+
string_t{},
|
|
72
|
+
[](const string_t& a, const string_t& b)
|
|
73
|
+
{
|
|
74
|
+
return detail::concat(a, '/', detail::escape(b));
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// @brief return a string representation of the JSON pointer
|
|
79
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_string/
|
|
80
|
+
JSON_HEDLEY_DEPRECATED_FOR(3.11.0, to_string())
|
|
81
|
+
operator string_t() const
|
|
82
|
+
{
|
|
83
|
+
return to_string();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
#ifndef JSON_NO_IO
|
|
87
|
+
/// @brief write string representation of the JSON pointer to stream
|
|
88
|
+
/// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/
|
|
89
|
+
friend std::ostream& operator<<(std::ostream& o, const json_pointer& ptr)
|
|
90
|
+
{
|
|
91
|
+
o << ptr.to_string();
|
|
92
|
+
return o;
|
|
93
|
+
}
|
|
94
|
+
#endif
|
|
95
|
+
|
|
96
|
+
/// @brief append another JSON pointer at the end of this JSON pointer
|
|
97
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/
|
|
98
|
+
json_pointer& operator/=(const json_pointer& ptr)
|
|
99
|
+
{
|
|
100
|
+
reference_tokens.insert(reference_tokens.end(),
|
|
101
|
+
ptr.reference_tokens.begin(),
|
|
102
|
+
ptr.reference_tokens.end());
|
|
103
|
+
return *this;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/// @brief append an unescaped reference token at the end of this JSON pointer
|
|
107
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/
|
|
108
|
+
json_pointer& operator/=(string_t token)
|
|
109
|
+
{
|
|
110
|
+
push_back(std::move(token));
|
|
111
|
+
return *this;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/// @brief append an array index at the end of this JSON pointer
|
|
115
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/
|
|
116
|
+
json_pointer& operator/=(std::size_t array_idx)
|
|
117
|
+
{
|
|
118
|
+
return *this /= std::to_string(array_idx);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/// @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer
|
|
122
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/
|
|
123
|
+
friend json_pointer operator/(const json_pointer& lhs,
|
|
124
|
+
const json_pointer& rhs)
|
|
125
|
+
{
|
|
126
|
+
return json_pointer(lhs) /= rhs;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/// @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer
|
|
130
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/
|
|
131
|
+
friend json_pointer operator/(const json_pointer& lhs, string_t token) // NOLINT(performance-unnecessary-value-param)
|
|
132
|
+
{
|
|
133
|
+
return json_pointer(lhs) /= std::move(token);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/// @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer
|
|
137
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/
|
|
138
|
+
friend json_pointer operator/(const json_pointer& lhs, std::size_t array_idx)
|
|
139
|
+
{
|
|
140
|
+
return json_pointer(lhs) /= array_idx;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/// @brief returns the parent of this JSON pointer
|
|
144
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/parent_pointer/
|
|
145
|
+
json_pointer parent_pointer() const
|
|
146
|
+
{
|
|
147
|
+
if (empty())
|
|
148
|
+
{
|
|
149
|
+
return *this;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
json_pointer res = *this;
|
|
153
|
+
res.pop_back();
|
|
154
|
+
return res;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/// @brief remove last reference token
|
|
158
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/pop_back/
|
|
159
|
+
void pop_back()
|
|
160
|
+
{
|
|
161
|
+
if (JSON_HEDLEY_UNLIKELY(empty()))
|
|
162
|
+
{
|
|
163
|
+
JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
reference_tokens.pop_back();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/// @brief return last reference token
|
|
170
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/back/
|
|
171
|
+
const string_t& back() const
|
|
172
|
+
{
|
|
173
|
+
if (JSON_HEDLEY_UNLIKELY(empty()))
|
|
174
|
+
{
|
|
175
|
+
JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return reference_tokens.back();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/// @brief append an unescaped token at the end of the reference pointer
|
|
182
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/push_back/
|
|
183
|
+
void push_back(const string_t& token)
|
|
184
|
+
{
|
|
185
|
+
reference_tokens.push_back(token);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/// @brief append an unescaped token at the end of the reference pointer
|
|
189
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/push_back/
|
|
190
|
+
void push_back(string_t&& token)
|
|
191
|
+
{
|
|
192
|
+
reference_tokens.push_back(std::move(token));
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/// @brief return whether pointer points to the root document
|
|
196
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/empty/
|
|
197
|
+
bool empty() const noexcept
|
|
198
|
+
{
|
|
199
|
+
return reference_tokens.empty();
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private:
|
|
203
|
+
/*!
|
|
204
|
+
@param[in] s reference token to be converted into an array index
|
|
205
|
+
|
|
206
|
+
@return integer representation of @a s
|
|
207
|
+
|
|
208
|
+
@throw parse_error.106 if an array index begins with '0'
|
|
209
|
+
@throw parse_error.109 if an array index begins not with a digit
|
|
210
|
+
@throw out_of_range.404 if string @a s could not be converted to an integer
|
|
211
|
+
@throw out_of_range.410 if an array index exceeds size_type
|
|
212
|
+
*/
|
|
213
|
+
template<typename BasicJsonType>
|
|
214
|
+
static typename BasicJsonType::size_type array_index(const string_t& s)
|
|
215
|
+
{
|
|
216
|
+
using size_type = typename BasicJsonType::size_type;
|
|
217
|
+
|
|
218
|
+
// error condition (cf. RFC 6901, Sect. 4)
|
|
219
|
+
if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0'))
|
|
220
|
+
{
|
|
221
|
+
JSON_THROW(detail::parse_error::create(106, 0, detail::concat("array index '", s, "' must not begin with '0'"), nullptr));
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// error condition (cf. RFC 6901, Sect. 4)
|
|
225
|
+
if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9')))
|
|
226
|
+
{
|
|
227
|
+
JSON_THROW(detail::parse_error::create(109, 0, detail::concat("array index '", s, "' is not a number"), nullptr));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const char* p = s.c_str();
|
|
231
|
+
char* p_end = nullptr; // NOLINT(misc-const-correctness)
|
|
232
|
+
errno = 0; // strtoull doesn't reset errno
|
|
233
|
+
const unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int)
|
|
234
|
+
if (p == p_end // invalid input or empty string
|
|
235
|
+
|| errno == ERANGE // out of range
|
|
236
|
+
|| JSON_HEDLEY_UNLIKELY(static_cast<std::size_t>(p_end - p) != s.size())) // incomplete read
|
|
237
|
+
{
|
|
238
|
+
JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", s, "'"), nullptr));
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// only triggered on special platforms (like 32bit), see also
|
|
242
|
+
// https://github.com/nlohmann/json/pull/2203
|
|
243
|
+
if (res >= static_cast<unsigned long long>((std::numeric_limits<size_type>::max)())) // NOLINT(runtime/int)
|
|
244
|
+
{
|
|
245
|
+
JSON_THROW(detail::out_of_range::create(410, detail::concat("array index ", s, " exceeds size_type"), nullptr)); // LCOV_EXCL_LINE
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return static_cast<size_type>(res);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
JSON_PRIVATE_UNLESS_TESTED:
|
|
252
|
+
json_pointer top() const
|
|
253
|
+
{
|
|
254
|
+
if (JSON_HEDLEY_UNLIKELY(empty()))
|
|
255
|
+
{
|
|
256
|
+
JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr));
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
json_pointer result = *this;
|
|
260
|
+
result.reference_tokens = {reference_tokens[0]};
|
|
261
|
+
return result;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
private:
|
|
265
|
+
/*!
|
|
266
|
+
@brief create and return a reference to the pointed to value
|
|
267
|
+
|
|
268
|
+
@complexity Linear in the number of reference tokens.
|
|
269
|
+
|
|
270
|
+
@throw parse_error.109 if array index is not a number
|
|
271
|
+
@throw type_error.313 if value cannot be unflattened
|
|
272
|
+
*/
|
|
273
|
+
template<typename BasicJsonType>
|
|
274
|
+
BasicJsonType& get_and_create(BasicJsonType& j) const
|
|
275
|
+
{
|
|
276
|
+
auto* result = &j;
|
|
277
|
+
|
|
278
|
+
// in case no reference tokens exist, return a reference to the JSON value
|
|
279
|
+
// j which will be overwritten by a primitive value
|
|
280
|
+
for (const auto& reference_token : reference_tokens)
|
|
281
|
+
{
|
|
282
|
+
switch (result->type())
|
|
283
|
+
{
|
|
284
|
+
case detail::value_t::null:
|
|
285
|
+
{
|
|
286
|
+
if (reference_token == "0")
|
|
287
|
+
{
|
|
288
|
+
// start a new array if reference token is 0
|
|
289
|
+
result = &result->operator[](0);
|
|
290
|
+
}
|
|
291
|
+
else
|
|
292
|
+
{
|
|
293
|
+
// start a new object otherwise
|
|
294
|
+
result = &result->operator[](reference_token);
|
|
295
|
+
}
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
case detail::value_t::object:
|
|
300
|
+
{
|
|
301
|
+
// create an entry in the object
|
|
302
|
+
result = &result->operator[](reference_token);
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
case detail::value_t::array:
|
|
307
|
+
{
|
|
308
|
+
// create an entry in the array
|
|
309
|
+
result = &result->operator[](array_index<BasicJsonType>(reference_token));
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/*
|
|
314
|
+
The following code is only reached if there exists a reference
|
|
315
|
+
token _and_ the current value is primitive. In this case, we have
|
|
316
|
+
an error situation, because primitive values may only occur as
|
|
317
|
+
single value; that is, with an empty list of reference tokens.
|
|
318
|
+
*/
|
|
319
|
+
case detail::value_t::string:
|
|
320
|
+
case detail::value_t::boolean:
|
|
321
|
+
case detail::value_t::number_integer:
|
|
322
|
+
case detail::value_t::number_unsigned:
|
|
323
|
+
case detail::value_t::number_float:
|
|
324
|
+
case detail::value_t::binary:
|
|
325
|
+
case detail::value_t::discarded:
|
|
326
|
+
default:
|
|
327
|
+
JSON_THROW(detail::type_error::create(313, "invalid value to unflatten", &j));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return *result;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/*!
|
|
335
|
+
@brief return a reference to the pointed to value
|
|
336
|
+
|
|
337
|
+
@note This version does not throw if a value is not present, but tries to
|
|
338
|
+
create nested values instead. For instance, calling this function
|
|
339
|
+
with pointer `"/this/that"` on a null value is equivalent to calling
|
|
340
|
+
`operator[]("this").operator[]("that")` on that value, effectively
|
|
341
|
+
changing the null value to an object.
|
|
342
|
+
|
|
343
|
+
@param[in] ptr a JSON value
|
|
344
|
+
|
|
345
|
+
@return reference to the JSON value pointed to by the JSON pointer
|
|
346
|
+
|
|
347
|
+
@complexity Linear in the length of the JSON pointer.
|
|
348
|
+
|
|
349
|
+
@throw parse_error.106 if an array index begins with '0'
|
|
350
|
+
@throw parse_error.109 if an array index was not a number
|
|
351
|
+
@throw out_of_range.404 if the JSON pointer can not be resolved
|
|
352
|
+
*/
|
|
353
|
+
template<typename BasicJsonType>
|
|
354
|
+
BasicJsonType& get_unchecked(BasicJsonType* ptr) const
|
|
355
|
+
{
|
|
356
|
+
for (const auto& reference_token : reference_tokens)
|
|
357
|
+
{
|
|
358
|
+
// convert null values to arrays or objects before continuing
|
|
359
|
+
if (ptr->is_null())
|
|
360
|
+
{
|
|
361
|
+
// check if reference token is a number
|
|
362
|
+
const bool nums =
|
|
363
|
+
std::all_of(reference_token.begin(), reference_token.end(),
|
|
364
|
+
[](const unsigned char x)
|
|
365
|
+
{
|
|
366
|
+
return std::isdigit(x);
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
// change value to array for numbers or "-" or to object otherwise
|
|
370
|
+
*ptr = (nums || reference_token == "-")
|
|
371
|
+
? detail::value_t::array
|
|
372
|
+
: detail::value_t::object;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
switch (ptr->type())
|
|
376
|
+
{
|
|
377
|
+
case detail::value_t::object:
|
|
378
|
+
{
|
|
379
|
+
// use unchecked object access
|
|
380
|
+
ptr = &ptr->operator[](reference_token);
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
case detail::value_t::array:
|
|
385
|
+
{
|
|
386
|
+
if (reference_token == "-")
|
|
387
|
+
{
|
|
388
|
+
// explicitly treat "-" as index beyond the end
|
|
389
|
+
ptr = &ptr->operator[](ptr->m_data.m_value.array->size());
|
|
390
|
+
}
|
|
391
|
+
else
|
|
392
|
+
{
|
|
393
|
+
// convert array index to number; unchecked access
|
|
394
|
+
ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token));
|
|
395
|
+
}
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
case detail::value_t::null:
|
|
400
|
+
case detail::value_t::string:
|
|
401
|
+
case detail::value_t::boolean:
|
|
402
|
+
case detail::value_t::number_integer:
|
|
403
|
+
case detail::value_t::number_unsigned:
|
|
404
|
+
case detail::value_t::number_float:
|
|
405
|
+
case detail::value_t::binary:
|
|
406
|
+
case detail::value_t::discarded:
|
|
407
|
+
default:
|
|
408
|
+
JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
return *ptr;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/*!
|
|
416
|
+
@throw parse_error.106 if an array index begins with '0'
|
|
417
|
+
@throw parse_error.109 if an array index was not a number
|
|
418
|
+
@throw out_of_range.402 if the array index '-' is used
|
|
419
|
+
@throw out_of_range.404 if the JSON pointer can not be resolved
|
|
420
|
+
*/
|
|
421
|
+
template<typename BasicJsonType>
|
|
422
|
+
BasicJsonType& get_checked(BasicJsonType* ptr) const
|
|
423
|
+
{
|
|
424
|
+
for (const auto& reference_token : reference_tokens)
|
|
425
|
+
{
|
|
426
|
+
switch (ptr->type())
|
|
427
|
+
{
|
|
428
|
+
case detail::value_t::object:
|
|
429
|
+
{
|
|
430
|
+
// note: at performs range check
|
|
431
|
+
ptr = &ptr->at(reference_token);
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
case detail::value_t::array:
|
|
436
|
+
{
|
|
437
|
+
if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
|
|
438
|
+
{
|
|
439
|
+
// "-" always fails the range check
|
|
440
|
+
JSON_THROW(detail::out_of_range::create(402, detail::concat(
|
|
441
|
+
"array index '-' (", std::to_string(ptr->m_data.m_value.array->size()),
|
|
442
|
+
") is out of range"), ptr));
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// note: at performs range check
|
|
446
|
+
ptr = &ptr->at(array_index<BasicJsonType>(reference_token));
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
case detail::value_t::null:
|
|
451
|
+
case detail::value_t::string:
|
|
452
|
+
case detail::value_t::boolean:
|
|
453
|
+
case detail::value_t::number_integer:
|
|
454
|
+
case detail::value_t::number_unsigned:
|
|
455
|
+
case detail::value_t::number_float:
|
|
456
|
+
case detail::value_t::binary:
|
|
457
|
+
case detail::value_t::discarded:
|
|
458
|
+
default:
|
|
459
|
+
JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
return *ptr;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/*!
|
|
467
|
+
@brief return a const reference to the pointed to value
|
|
468
|
+
|
|
469
|
+
@param[in] ptr a JSON value
|
|
470
|
+
|
|
471
|
+
@return const reference to the JSON value pointed to by the JSON
|
|
472
|
+
pointer
|
|
473
|
+
|
|
474
|
+
@throw parse_error.106 if an array index begins with '0'
|
|
475
|
+
@throw parse_error.109 if an array index was not a number
|
|
476
|
+
@throw out_of_range.402 if the array index '-' is used
|
|
477
|
+
@throw out_of_range.404 if the JSON pointer can not be resolved
|
|
478
|
+
*/
|
|
479
|
+
template<typename BasicJsonType>
|
|
480
|
+
const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const
|
|
481
|
+
{
|
|
482
|
+
for (const auto& reference_token : reference_tokens)
|
|
483
|
+
{
|
|
484
|
+
switch (ptr->type())
|
|
485
|
+
{
|
|
486
|
+
case detail::value_t::object:
|
|
487
|
+
{
|
|
488
|
+
// use unchecked object access
|
|
489
|
+
ptr = &ptr->operator[](reference_token);
|
|
490
|
+
break;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
case detail::value_t::array:
|
|
494
|
+
{
|
|
495
|
+
if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
|
|
496
|
+
{
|
|
497
|
+
// "-" cannot be used for const access
|
|
498
|
+
JSON_THROW(detail::out_of_range::create(402, detail::concat("array index '-' (", std::to_string(ptr->m_data.m_value.array->size()), ") is out of range"), ptr));
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// use unchecked array access
|
|
502
|
+
ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token));
|
|
503
|
+
break;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
case detail::value_t::null:
|
|
507
|
+
case detail::value_t::string:
|
|
508
|
+
case detail::value_t::boolean:
|
|
509
|
+
case detail::value_t::number_integer:
|
|
510
|
+
case detail::value_t::number_unsigned:
|
|
511
|
+
case detail::value_t::number_float:
|
|
512
|
+
case detail::value_t::binary:
|
|
513
|
+
case detail::value_t::discarded:
|
|
514
|
+
default:
|
|
515
|
+
JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
return *ptr;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/*!
|
|
523
|
+
@throw parse_error.106 if an array index begins with '0'
|
|
524
|
+
@throw parse_error.109 if an array index was not a number
|
|
525
|
+
@throw out_of_range.402 if the array index '-' is used
|
|
526
|
+
@throw out_of_range.404 if the JSON pointer can not be resolved
|
|
527
|
+
*/
|
|
528
|
+
template<typename BasicJsonType>
|
|
529
|
+
const BasicJsonType& get_checked(const BasicJsonType* ptr) const
|
|
530
|
+
{
|
|
531
|
+
for (const auto& reference_token : reference_tokens)
|
|
532
|
+
{
|
|
533
|
+
switch (ptr->type())
|
|
534
|
+
{
|
|
535
|
+
case detail::value_t::object:
|
|
536
|
+
{
|
|
537
|
+
// note: at performs range check
|
|
538
|
+
ptr = &ptr->at(reference_token);
|
|
539
|
+
break;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
case detail::value_t::array:
|
|
543
|
+
{
|
|
544
|
+
if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
|
|
545
|
+
{
|
|
546
|
+
// "-" always fails the range check
|
|
547
|
+
JSON_THROW(detail::out_of_range::create(402, detail::concat(
|
|
548
|
+
"array index '-' (", std::to_string(ptr->m_data.m_value.array->size()),
|
|
549
|
+
") is out of range"), ptr));
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// note: at performs range check
|
|
553
|
+
ptr = &ptr->at(array_index<BasicJsonType>(reference_token));
|
|
554
|
+
break;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
case detail::value_t::null:
|
|
558
|
+
case detail::value_t::string:
|
|
559
|
+
case detail::value_t::boolean:
|
|
560
|
+
case detail::value_t::number_integer:
|
|
561
|
+
case detail::value_t::number_unsigned:
|
|
562
|
+
case detail::value_t::number_float:
|
|
563
|
+
case detail::value_t::binary:
|
|
564
|
+
case detail::value_t::discarded:
|
|
565
|
+
default:
|
|
566
|
+
JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
return *ptr;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/*!
|
|
574
|
+
@throw parse_error.106 if an array index begins with '0'
|
|
575
|
+
@throw parse_error.109 if an array index was not a number
|
|
576
|
+
*/
|
|
577
|
+
template<typename BasicJsonType>
|
|
578
|
+
bool contains(const BasicJsonType* ptr) const
|
|
579
|
+
{
|
|
580
|
+
for (const auto& reference_token : reference_tokens)
|
|
581
|
+
{
|
|
582
|
+
switch (ptr->type())
|
|
583
|
+
{
|
|
584
|
+
case detail::value_t::object:
|
|
585
|
+
{
|
|
586
|
+
if (!ptr->contains(reference_token))
|
|
587
|
+
{
|
|
588
|
+
// we did not find the key in the object
|
|
589
|
+
return false;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
ptr = &ptr->operator[](reference_token);
|
|
593
|
+
break;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
case detail::value_t::array:
|
|
597
|
+
{
|
|
598
|
+
if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
|
|
599
|
+
{
|
|
600
|
+
// "-" always fails the range check
|
|
601
|
+
return false;
|
|
602
|
+
}
|
|
603
|
+
if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9")))
|
|
604
|
+
{
|
|
605
|
+
// invalid char
|
|
606
|
+
return false;
|
|
607
|
+
}
|
|
608
|
+
if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1))
|
|
609
|
+
{
|
|
610
|
+
if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9')))
|
|
611
|
+
{
|
|
612
|
+
// first char should be between '1' and '9'
|
|
613
|
+
return false;
|
|
614
|
+
}
|
|
615
|
+
for (std::size_t i = 1; i < reference_token.size(); i++)
|
|
616
|
+
{
|
|
617
|
+
if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9')))
|
|
618
|
+
{
|
|
619
|
+
// other char should be between '0' and '9'
|
|
620
|
+
return false;
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
const auto idx = array_index<BasicJsonType>(reference_token);
|
|
626
|
+
if (idx >= ptr->size())
|
|
627
|
+
{
|
|
628
|
+
// index out of range
|
|
629
|
+
return false;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
ptr = &ptr->operator[](idx);
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
case detail::value_t::null:
|
|
637
|
+
case detail::value_t::string:
|
|
638
|
+
case detail::value_t::boolean:
|
|
639
|
+
case detail::value_t::number_integer:
|
|
640
|
+
case detail::value_t::number_unsigned:
|
|
641
|
+
case detail::value_t::number_float:
|
|
642
|
+
case detail::value_t::binary:
|
|
643
|
+
case detail::value_t::discarded:
|
|
644
|
+
default:
|
|
645
|
+
{
|
|
646
|
+
// we do not expect primitive values if there is still a
|
|
647
|
+
// reference token to process
|
|
648
|
+
return false;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// no reference token left means we found a primitive value
|
|
654
|
+
return true;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
/*!
|
|
658
|
+
@brief split the string input to reference tokens
|
|
659
|
+
|
|
660
|
+
@note This function is only called by the json_pointer constructor.
|
|
661
|
+
All exceptions below are documented there.
|
|
662
|
+
|
|
663
|
+
@throw parse_error.107 if the pointer is not empty or begins with '/'
|
|
664
|
+
@throw parse_error.108 if character '~' is not followed by '0' or '1'
|
|
665
|
+
*/
|
|
666
|
+
static std::vector<string_t> split(const string_t& reference_string)
|
|
667
|
+
{
|
|
668
|
+
std::vector<string_t> result;
|
|
669
|
+
|
|
670
|
+
// special case: empty reference string -> no reference tokens
|
|
671
|
+
if (reference_string.empty())
|
|
672
|
+
{
|
|
673
|
+
return result;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
// check if nonempty reference string begins with slash
|
|
677
|
+
if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/'))
|
|
678
|
+
{
|
|
679
|
+
JSON_THROW(detail::parse_error::create(107, 1, detail::concat("JSON pointer must be empty or begin with '/' - was: '", reference_string, "'"), nullptr));
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// extract the reference tokens:
|
|
683
|
+
// - slash: position of the last read slash (or end of string)
|
|
684
|
+
// - start: position after the previous slash
|
|
685
|
+
for (
|
|
686
|
+
// search for the first slash after the first character
|
|
687
|
+
std::size_t slash = reference_string.find_first_of('/', 1),
|
|
688
|
+
// set the beginning of the first reference token
|
|
689
|
+
start = 1;
|
|
690
|
+
// we can stop if start == 0 (if slash == string_t::npos)
|
|
691
|
+
start != 0;
|
|
692
|
+
// set the beginning of the next reference token
|
|
693
|
+
// (will eventually be 0 if slash == string_t::npos)
|
|
694
|
+
start = (slash == string_t::npos) ? 0 : slash + 1,
|
|
695
|
+
// find next slash
|
|
696
|
+
slash = reference_string.find_first_of('/', start))
|
|
697
|
+
{
|
|
698
|
+
// use the text between the beginning of the reference token
|
|
699
|
+
// (start) and the last slash (slash).
|
|
700
|
+
auto reference_token = reference_string.substr(start, slash - start);
|
|
701
|
+
|
|
702
|
+
// check reference tokens are properly escaped
|
|
703
|
+
for (std::size_t pos = reference_token.find_first_of('~');
|
|
704
|
+
pos != string_t::npos;
|
|
705
|
+
pos = reference_token.find_first_of('~', pos + 1))
|
|
706
|
+
{
|
|
707
|
+
JSON_ASSERT(reference_token[pos] == '~');
|
|
708
|
+
|
|
709
|
+
// ~ must be followed by 0 or 1
|
|
710
|
+
if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 ||
|
|
711
|
+
(reference_token[pos + 1] != '0' &&
|
|
712
|
+
reference_token[pos + 1] != '1')))
|
|
713
|
+
{
|
|
714
|
+
JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'", nullptr));
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// finally, store the reference token
|
|
719
|
+
detail::unescape(reference_token);
|
|
720
|
+
result.push_back(reference_token);
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
return result;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
private:
|
|
727
|
+
/*!
|
|
728
|
+
@param[in] reference_string the reference string to the current value
|
|
729
|
+
@param[in] value the value to consider
|
|
730
|
+
@param[in,out] result the result object to insert values to
|
|
731
|
+
|
|
732
|
+
@note Empty objects or arrays are flattened to `null`.
|
|
733
|
+
*/
|
|
734
|
+
template<typename BasicJsonType>
|
|
735
|
+
static void flatten(const string_t& reference_string,
|
|
736
|
+
const BasicJsonType& value,
|
|
737
|
+
BasicJsonType& result)
|
|
738
|
+
{
|
|
739
|
+
switch (value.type())
|
|
740
|
+
{
|
|
741
|
+
case detail::value_t::array:
|
|
742
|
+
{
|
|
743
|
+
if (value.m_data.m_value.array->empty())
|
|
744
|
+
{
|
|
745
|
+
// flatten empty array as null
|
|
746
|
+
result[reference_string] = nullptr;
|
|
747
|
+
}
|
|
748
|
+
else
|
|
749
|
+
{
|
|
750
|
+
// iterate array and use index as reference string
|
|
751
|
+
for (std::size_t i = 0; i < value.m_data.m_value.array->size(); ++i)
|
|
752
|
+
{
|
|
753
|
+
flatten(detail::concat<string_t>(reference_string, '/', std::to_string(i)),
|
|
754
|
+
value.m_data.m_value.array->operator[](i), result);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
break;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
case detail::value_t::object:
|
|
761
|
+
{
|
|
762
|
+
if (value.m_data.m_value.object->empty())
|
|
763
|
+
{
|
|
764
|
+
// flatten empty object as null
|
|
765
|
+
result[reference_string] = nullptr;
|
|
766
|
+
}
|
|
767
|
+
else
|
|
768
|
+
{
|
|
769
|
+
// iterate object and use keys as reference string
|
|
770
|
+
for (const auto& element : *value.m_data.m_value.object)
|
|
771
|
+
{
|
|
772
|
+
flatten(detail::concat<string_t>(reference_string, '/', detail::escape(element.first)), element.second, result);
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
break;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
case detail::value_t::null:
|
|
779
|
+
case detail::value_t::string:
|
|
780
|
+
case detail::value_t::boolean:
|
|
781
|
+
case detail::value_t::number_integer:
|
|
782
|
+
case detail::value_t::number_unsigned:
|
|
783
|
+
case detail::value_t::number_float:
|
|
784
|
+
case detail::value_t::binary:
|
|
785
|
+
case detail::value_t::discarded:
|
|
786
|
+
default:
|
|
787
|
+
{
|
|
788
|
+
// add primitive value with its reference string
|
|
789
|
+
result[reference_string] = value;
|
|
790
|
+
break;
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
/*!
|
|
796
|
+
@param[in] value flattened JSON
|
|
797
|
+
|
|
798
|
+
@return unflattened JSON
|
|
799
|
+
|
|
800
|
+
@throw parse_error.109 if array index is not a number
|
|
801
|
+
@throw type_error.314 if value is not an object
|
|
802
|
+
@throw type_error.315 if object values are not primitive
|
|
803
|
+
@throw type_error.313 if value cannot be unflattened
|
|
804
|
+
*/
|
|
805
|
+
template<typename BasicJsonType>
|
|
806
|
+
static BasicJsonType
|
|
807
|
+
unflatten(const BasicJsonType& value)
|
|
808
|
+
{
|
|
809
|
+
if (JSON_HEDLEY_UNLIKELY(!value.is_object()))
|
|
810
|
+
{
|
|
811
|
+
JSON_THROW(detail::type_error::create(314, "only objects can be unflattened", &value));
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
BasicJsonType result;
|
|
815
|
+
|
|
816
|
+
// iterate the JSON object values
|
|
817
|
+
for (const auto& element : *value.m_data.m_value.object)
|
|
818
|
+
{
|
|
819
|
+
if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive()))
|
|
820
|
+
{
|
|
821
|
+
JSON_THROW(detail::type_error::create(315, "values in object must be primitive", &element.second));
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
// assign value to reference pointed to by JSON pointer; Note that if
|
|
825
|
+
// the JSON pointer is "" (i.e., points to the whole value), function
|
|
826
|
+
// get_and_create returns a reference to result itself. An assignment
|
|
827
|
+
// will then create a primitive value.
|
|
828
|
+
json_pointer(element.first).get_and_create(result) = element.second;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
return result;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
// can't use conversion operator because of ambiguity
|
|
835
|
+
json_pointer<string_t> convert() const&
|
|
836
|
+
{
|
|
837
|
+
json_pointer<string_t> result;
|
|
838
|
+
result.reference_tokens = reference_tokens;
|
|
839
|
+
return result;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
json_pointer<string_t> convert()&&
|
|
843
|
+
{
|
|
844
|
+
json_pointer<string_t> result;
|
|
845
|
+
result.reference_tokens = std::move(reference_tokens);
|
|
846
|
+
return result;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
public:
|
|
850
|
+
#if JSON_HAS_THREE_WAY_COMPARISON
|
|
851
|
+
/// @brief compares two JSON pointers for equality
|
|
852
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
|
853
|
+
template<typename RefStringTypeRhs>
|
|
854
|
+
bool operator==(const json_pointer<RefStringTypeRhs>& rhs) const noexcept
|
|
855
|
+
{
|
|
856
|
+
return reference_tokens == rhs.reference_tokens;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
/// @brief compares JSON pointer and string for equality
|
|
860
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
|
861
|
+
JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer))
|
|
862
|
+
bool operator==(const string_t& rhs) const
|
|
863
|
+
{
|
|
864
|
+
return *this == json_pointer(rhs);
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
/// @brief 3-way compares two JSON pointers
|
|
868
|
+
template<typename RefStringTypeRhs>
|
|
869
|
+
std::strong_ordering operator<=>(const json_pointer<RefStringTypeRhs>& rhs) const noexcept // *NOPAD*
|
|
870
|
+
{
|
|
871
|
+
return reference_tokens <=> rhs.reference_tokens; // *NOPAD*
|
|
872
|
+
}
|
|
873
|
+
#else
|
|
874
|
+
/// @brief compares two JSON pointers for equality
|
|
875
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
|
876
|
+
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
|
877
|
+
// NOLINTNEXTLINE(readability-redundant-declaration)
|
|
878
|
+
friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
|
879
|
+
const json_pointer<RefStringTypeRhs>& rhs) noexcept;
|
|
880
|
+
|
|
881
|
+
/// @brief compares JSON pointer and string for equality
|
|
882
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
|
883
|
+
template<typename RefStringTypeLhs, typename StringType>
|
|
884
|
+
// NOLINTNEXTLINE(readability-redundant-declaration)
|
|
885
|
+
friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
|
886
|
+
const StringType& rhs);
|
|
887
|
+
|
|
888
|
+
/// @brief compares string and JSON pointer for equality
|
|
889
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
|
890
|
+
template<typename RefStringTypeRhs, typename StringType>
|
|
891
|
+
// NOLINTNEXTLINE(readability-redundant-declaration)
|
|
892
|
+
friend bool operator==(const StringType& lhs,
|
|
893
|
+
const json_pointer<RefStringTypeRhs>& rhs);
|
|
894
|
+
|
|
895
|
+
/// @brief compares two JSON pointers for inequality
|
|
896
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
|
|
897
|
+
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
|
898
|
+
// NOLINTNEXTLINE(readability-redundant-declaration)
|
|
899
|
+
friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
|
|
900
|
+
const json_pointer<RefStringTypeRhs>& rhs) noexcept;
|
|
901
|
+
|
|
902
|
+
/// @brief compares JSON pointer and string for inequality
|
|
903
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
|
|
904
|
+
template<typename RefStringTypeLhs, typename StringType>
|
|
905
|
+
// NOLINTNEXTLINE(readability-redundant-declaration)
|
|
906
|
+
friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
|
|
907
|
+
const StringType& rhs);
|
|
908
|
+
|
|
909
|
+
/// @brief compares string and JSON pointer for inequality
|
|
910
|
+
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
|
|
911
|
+
template<typename RefStringTypeRhs, typename StringType>
|
|
912
|
+
// NOLINTNEXTLINE(readability-redundant-declaration)
|
|
913
|
+
friend bool operator!=(const StringType& lhs,
|
|
914
|
+
const json_pointer<RefStringTypeRhs>& rhs);
|
|
915
|
+
|
|
916
|
+
/// @brief compares two JSON pointer for less-than
|
|
917
|
+
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
|
918
|
+
// NOLINTNEXTLINE(readability-redundant-declaration)
|
|
919
|
+
friend bool operator<(const json_pointer<RefStringTypeLhs>& lhs,
|
|
920
|
+
const json_pointer<RefStringTypeRhs>& rhs) noexcept;
|
|
921
|
+
#endif
|
|
922
|
+
|
|
923
|
+
private:
|
|
924
|
+
/// the reference tokens
|
|
925
|
+
std::vector<string_t> reference_tokens;
|
|
926
|
+
};
|
|
927
|
+
|
|
928
|
+
#if !JSON_HAS_THREE_WAY_COMPARISON
|
|
929
|
+
// functions cannot be defined inside class due to ODR violations
|
|
930
|
+
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
|
931
|
+
inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
|
932
|
+
const json_pointer<RefStringTypeRhs>& rhs) noexcept
|
|
933
|
+
{
|
|
934
|
+
return lhs.reference_tokens == rhs.reference_tokens;
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
template<typename RefStringTypeLhs,
|
|
938
|
+
typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>
|
|
939
|
+
JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer))
|
|
940
|
+
inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
|
941
|
+
const StringType& rhs)
|
|
942
|
+
{
|
|
943
|
+
return lhs == json_pointer<RefStringTypeLhs>(rhs);
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
template<typename RefStringTypeRhs,
|
|
947
|
+
typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>
|
|
948
|
+
JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer))
|
|
949
|
+
inline bool operator==(const StringType& lhs,
|
|
950
|
+
const json_pointer<RefStringTypeRhs>& rhs)
|
|
951
|
+
{
|
|
952
|
+
return json_pointer<RefStringTypeRhs>(lhs) == rhs;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
|
956
|
+
inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
|
|
957
|
+
const json_pointer<RefStringTypeRhs>& rhs) noexcept
|
|
958
|
+
{
|
|
959
|
+
return !(lhs == rhs);
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
template<typename RefStringTypeLhs,
|
|
963
|
+
typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>
|
|
964
|
+
JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer))
|
|
965
|
+
inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
|
|
966
|
+
const StringType& rhs)
|
|
967
|
+
{
|
|
968
|
+
return !(lhs == rhs);
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
template<typename RefStringTypeRhs,
|
|
972
|
+
typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>
|
|
973
|
+
JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer))
|
|
974
|
+
inline bool operator!=(const StringType& lhs,
|
|
975
|
+
const json_pointer<RefStringTypeRhs>& rhs)
|
|
976
|
+
{
|
|
977
|
+
return !(lhs == rhs);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
|
981
|
+
inline bool operator<(const json_pointer<RefStringTypeLhs>& lhs,
|
|
982
|
+
const json_pointer<RefStringTypeRhs>& rhs) noexcept
|
|
983
|
+
{
|
|
984
|
+
return lhs.reference_tokens < rhs.reference_tokens;
|
|
985
|
+
}
|
|
986
|
+
#endif
|
|
987
|
+
|
|
988
|
+
NLOHMANN_JSON_NAMESPACE_END
|