mqt-core 3.3.2__cp314-cp314t-macosx_11_0_x86_64.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.
Files changed (546) hide show
  1. mqt/core/__init__.py +77 -0
  2. mqt/core/__main__.py +55 -0
  3. mqt/core/_commands.py +52 -0
  4. mqt/core/_compat/__init__.py +11 -0
  5. mqt/core/_compat/typing.py +29 -0
  6. mqt/core/_version.py +34 -0
  7. mqt/core/_version.pyi +12 -0
  8. mqt/core/dd.cpython-314t-darwin.so +0 -0
  9. mqt/core/dd.pyi +1016 -0
  10. mqt/core/dd_evaluation.py +368 -0
  11. mqt/core/fomac.cpython-314t-darwin.so +0 -0
  12. mqt/core/fomac.pyi +125 -0
  13. mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
  14. mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
  15. mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
  16. mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
  17. mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
  18. mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
  19. mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
  20. mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
  21. mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
  22. mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
  23. mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
  24. mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
  25. mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
  26. mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
  27. mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
  28. mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
  29. mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
  30. mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
  31. mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
  32. mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
  33. mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
  34. mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
  35. mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
  36. mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
  37. mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
  38. mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
  39. mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
  40. mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
  41. mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
  42. mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
  43. mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
  44. mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
  45. mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
  46. mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
  47. mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
  48. mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
  49. mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
  50. mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
  51. mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
  52. mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
  53. mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
  54. mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
  55. mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
  56. mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
  57. mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
  58. mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
  59. mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
  60. mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
  61. mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
  62. mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
  63. mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
  64. mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
  65. mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
  66. mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
  67. mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
  68. mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
  69. mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
  70. mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
  71. mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
  72. mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
  73. mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
  74. mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
  75. mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
  76. mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
  77. mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
  78. mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
  79. mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
  80. mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
  81. mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
  82. mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
  83. mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
  84. mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
  85. mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
  86. mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
  87. mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
  88. mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
  89. mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
  90. mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
  91. mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
  92. mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
  93. mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
  94. mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
  95. mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
  96. mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
  97. mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
  98. mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
  99. mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
  100. mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
  101. mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
  102. mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
  103. mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
  104. mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
  105. mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
  106. mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
  107. mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
  108. mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
  109. mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
  110. mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
  111. mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
  112. mqt/core/include/mqt-core/boost/config.hpp +67 -0
  113. mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
  114. mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
  115. mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
  116. mqt/core/include/mqt-core/boost/limits.hpp +146 -0
  117. mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
  118. mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
  119. mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
  120. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
  121. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
  122. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
  123. mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
  124. mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
  125. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
  126. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
  127. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
  128. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
  129. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
  130. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
  131. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
  132. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
  133. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
  134. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
  135. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
  136. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
  137. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
  138. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
  139. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
  140. mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
  141. mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
  142. mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
  143. mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
  144. mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
  145. mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
  146. mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
  147. mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
  148. mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
  149. mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
  150. mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
  151. mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
  152. mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
  153. mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
  154. mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
  155. mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
  156. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
  157. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
  158. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
  159. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
  160. mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
  161. mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
  162. mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
  163. mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
  164. mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
  165. mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
  166. mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
  167. mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
  168. mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
  169. mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
  170. mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
  171. mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
  172. mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
  173. mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
  174. mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
  175. mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
  176. mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
  177. mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
  178. mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
  179. mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
  180. mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
  181. mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
  182. mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
  183. mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
  184. mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
  185. mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
  186. mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
  187. mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
  188. mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
  189. mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
  190. mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
  191. mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
  192. mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
  193. mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
  194. mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
  195. mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
  196. mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
  197. mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
  198. mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
  199. mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
  200. mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
  201. mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
  202. mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
  203. mqt/core/include/mqt-core/boost/version.hpp +32 -0
  204. mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
  205. mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
  206. mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
  207. mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
  208. mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
  209. mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
  210. mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
  211. mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
  212. mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
  213. mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
  214. mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
  215. mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
  216. mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
  217. mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
  218. mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
  219. mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
  220. mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
  221. mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
  222. mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
  223. mqt/core/include/mqt-core/dd/Export.hpp +438 -0
  224. mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
  225. mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
  226. mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
  227. mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
  228. mqt/core/include/mqt-core/dd/Node.hpp +223 -0
  229. mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
  230. mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
  231. mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
  232. mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
  233. mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
  234. mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
  235. mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
  236. mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
  237. mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
  238. mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
  239. mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
  240. mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
  241. mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
  242. mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
  243. mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
  244. mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
  245. mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
  246. mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
  247. mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
  248. mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
  249. mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
  250. mqt/core/include/mqt-core/ir/Register.hpp +125 -0
  251. mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
  252. mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
  253. mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
  254. mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
  255. mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
  256. mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
  257. mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
  258. mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
  259. mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
  260. mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
  261. mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
  262. mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
  263. mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
  264. mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
  265. mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
  266. mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
  267. mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
  268. mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
  269. mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
  270. mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
  271. mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
  272. mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
  273. mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
  274. mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
  275. mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
  276. mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
  277. mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
  278. mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
  279. mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
  280. mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
  281. mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
  282. mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
  283. mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
  284. mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
  285. mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
  286. mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
  287. mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
  288. mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
  289. mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
  290. mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
  291. mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
  292. mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
  293. mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
  294. mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
  295. mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
  296. mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
  297. mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
  298. mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
  299. mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
  300. mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
  301. mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
  302. mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
  303. mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
  304. mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
  305. mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
  306. mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
  307. mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
  308. mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
  309. mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
  310. mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
  311. mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
  312. mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
  313. mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
  314. mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
  315. mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
  316. mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
  317. mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
  318. mqt/core/include/nlohmann/detail/hash.hpp +129 -0
  319. mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
  320. mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
  321. mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
  322. mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
  323. mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
  324. mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
  325. mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
  326. mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
  327. mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
  328. mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
  329. mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
  330. mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
  331. mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
  332. mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
  333. mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
  334. mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
  335. mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
  336. mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
  337. mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
  338. mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
  339. mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
  340. mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
  341. mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
  342. mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
  343. mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
  344. mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
  345. mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
  346. mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
  347. mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
  348. mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
  349. mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
  350. mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
  351. mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
  352. mqt/core/include/nlohmann/json.hpp +5306 -0
  353. mqt/core/include/nlohmann/json_fwd.hpp +75 -0
  354. mqt/core/include/nlohmann/ordered_map.hpp +359 -0
  355. mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
  356. mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
  357. mqt/core/include/qdmi/qdmi/client.h +990 -0
  358. mqt/core/include/qdmi/qdmi/constants.h +1139 -0
  359. mqt/core/include/qdmi/qdmi/device.h +602 -0
  360. mqt/core/include/qdmi/qdmi/types.h +78 -0
  361. mqt/core/include/spdlog/async.h +99 -0
  362. mqt/core/include/spdlog/async_logger-inl.h +84 -0
  363. mqt/core/include/spdlog/async_logger.h +74 -0
  364. mqt/core/include/spdlog/cfg/argv.h +40 -0
  365. mqt/core/include/spdlog/cfg/env.h +36 -0
  366. mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
  367. mqt/core/include/spdlog/cfg/helpers.h +29 -0
  368. mqt/core/include/spdlog/common-inl.h +68 -0
  369. mqt/core/include/spdlog/common.h +406 -0
  370. mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
  371. mqt/core/include/spdlog/details/backtracer.h +45 -0
  372. mqt/core/include/spdlog/details/circular_q.h +115 -0
  373. mqt/core/include/spdlog/details/console_globals.h +28 -0
  374. mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
  375. mqt/core/include/spdlog/details/file_helper.h +61 -0
  376. mqt/core/include/spdlog/details/fmt_helper.h +141 -0
  377. mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
  378. mqt/core/include/spdlog/details/log_msg.h +40 -0
  379. mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
  380. mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
  381. mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
  382. mqt/core/include/spdlog/details/null_mutex.h +35 -0
  383. mqt/core/include/spdlog/details/os-inl.h +606 -0
  384. mqt/core/include/spdlog/details/os.h +127 -0
  385. mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
  386. mqt/core/include/spdlog/details/periodic_worker.h +58 -0
  387. mqt/core/include/spdlog/details/registry-inl.h +270 -0
  388. mqt/core/include/spdlog/details/registry.h +131 -0
  389. mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
  390. mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
  391. mqt/core/include/spdlog/details/tcp_client.h +127 -0
  392. mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
  393. mqt/core/include/spdlog/details/thread_pool.h +117 -0
  394. mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
  395. mqt/core/include/spdlog/details/udp_client.h +81 -0
  396. mqt/core/include/spdlog/details/windows_include.h +11 -0
  397. mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
  398. mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
  399. mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
  400. mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
  401. mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
  402. mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
  403. mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
  404. mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
  405. mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
  406. mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
  407. mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
  408. mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
  409. mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
  410. mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
  411. mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
  412. mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
  413. mqt/core/include/spdlog/fmt/chrono.h +23 -0
  414. mqt/core/include/spdlog/fmt/compile.h +23 -0
  415. mqt/core/include/spdlog/fmt/fmt.h +30 -0
  416. mqt/core/include/spdlog/fmt/ostr.h +23 -0
  417. mqt/core/include/spdlog/fmt/ranges.h +23 -0
  418. mqt/core/include/spdlog/fmt/std.h +24 -0
  419. mqt/core/include/spdlog/fmt/xchar.h +23 -0
  420. mqt/core/include/spdlog/formatter.h +17 -0
  421. mqt/core/include/spdlog/fwd.h +18 -0
  422. mqt/core/include/spdlog/logger-inl.h +198 -0
  423. mqt/core/include/spdlog/logger.h +379 -0
  424. mqt/core/include/spdlog/mdc.h +52 -0
  425. mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
  426. mqt/core/include/spdlog/pattern_formatter.h +118 -0
  427. mqt/core/include/spdlog/sinks/android_sink.h +137 -0
  428. mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
  429. mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
  430. mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
  431. mqt/core/include/spdlog/sinks/base_sink.h +51 -0
  432. mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
  433. mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
  434. mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
  435. mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
  436. mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
  437. mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
  438. mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
  439. mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
  440. mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
  441. mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
  442. mqt/core/include/spdlog/sinks/null_sink.h +41 -0
  443. mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
  444. mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
  445. mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
  446. mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
  447. mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
  448. mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
  449. mqt/core/include/spdlog/sinks/sink.h +34 -0
  450. mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
  451. mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
  452. mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
  453. mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
  454. mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
  455. mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
  456. mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
  457. mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
  458. mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
  459. mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
  460. mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
  461. mqt/core/include/spdlog/spdlog-inl.h +96 -0
  462. mqt/core/include/spdlog/spdlog.h +357 -0
  463. mqt/core/include/spdlog/stopwatch.h +66 -0
  464. mqt/core/include/spdlog/tweakme.h +148 -0
  465. mqt/core/include/spdlog/version.h +11 -0
  466. mqt/core/ir/__init__.pyi +2078 -0
  467. mqt/core/ir/operations.pyi +1011 -0
  468. mqt/core/ir/registers.pyi +91 -0
  469. mqt/core/ir/symbolic.pyi +177 -0
  470. mqt/core/ir.cpython-314t-darwin.so +0 -0
  471. mqt/core/lib/libmqt-core-algorithms.3.3.2.dylib +0 -0
  472. mqt/core/lib/libmqt-core-algorithms.3.3.dylib +0 -0
  473. mqt/core/lib/libmqt-core-algorithms.dylib +0 -0
  474. mqt/core/lib/libmqt-core-circuit-optimizer.3.3.2.dylib +0 -0
  475. mqt/core/lib/libmqt-core-circuit-optimizer.3.3.dylib +0 -0
  476. mqt/core/lib/libmqt-core-circuit-optimizer.dylib +0 -0
  477. mqt/core/lib/libmqt-core-dd.3.3.2.dylib +0 -0
  478. mqt/core/lib/libmqt-core-dd.3.3.dylib +0 -0
  479. mqt/core/lib/libmqt-core-dd.dylib +0 -0
  480. mqt/core/lib/libmqt-core-ds.3.3.2.dylib +0 -0
  481. mqt/core/lib/libmqt-core-ds.3.3.dylib +0 -0
  482. mqt/core/lib/libmqt-core-ds.dylib +0 -0
  483. mqt/core/lib/libmqt-core-fomac.3.3.2.dylib +0 -0
  484. mqt/core/lib/libmqt-core-fomac.3.3.dylib +0 -0
  485. mqt/core/lib/libmqt-core-fomac.dylib +0 -0
  486. mqt/core/lib/libmqt-core-ir.3.3.2.dylib +0 -0
  487. mqt/core/lib/libmqt-core-ir.3.3.dylib +0 -0
  488. mqt/core/lib/libmqt-core-ir.dylib +0 -0
  489. mqt/core/lib/libmqt-core-na-fomac.3.3.2.dylib +0 -0
  490. mqt/core/lib/libmqt-core-na-fomac.3.3.dylib +0 -0
  491. mqt/core/lib/libmqt-core-na-fomac.dylib +0 -0
  492. mqt/core/lib/libmqt-core-na.3.3.2.dylib +0 -0
  493. mqt/core/lib/libmqt-core-na.3.3.dylib +0 -0
  494. mqt/core/lib/libmqt-core-na.dylib +0 -0
  495. mqt/core/lib/libmqt-core-qasm.3.3.2.dylib +0 -0
  496. mqt/core/lib/libmqt-core-qasm.3.3.dylib +0 -0
  497. mqt/core/lib/libmqt-core-qasm.dylib +0 -0
  498. mqt/core/lib/libmqt-core-qdmi-driver.3.3.2.dylib +0 -0
  499. mqt/core/lib/libmqt-core-qdmi-driver.3.3.dylib +0 -0
  500. mqt/core/lib/libmqt-core-qdmi-driver.dylib +0 -0
  501. mqt/core/lib/libmqt-core-qdmi-na-device-gen.a +0 -0
  502. mqt/core/lib/libmqt-core-qdmi-na-device.3.3.2.dylib +0 -0
  503. mqt/core/lib/libmqt-core-qdmi-na-device.3.3.dylib +0 -0
  504. mqt/core/lib/libmqt-core-qdmi-na-device.dylib +0 -0
  505. mqt/core/lib/libmqt-core-zx.3.3.2.dylib +0 -0
  506. mqt/core/lib/libmqt-core-zx.3.3.dylib +0 -0
  507. mqt/core/lib/libmqt-core-zx.dylib +0 -0
  508. mqt/core/lib/libspdlog.a +0 -0
  509. mqt/core/lib/pkgconfig/spdlog.pc +13 -0
  510. mqt/core/na/__init__.py +12 -0
  511. mqt/core/na/fomac.cpython-314t-darwin.so +0 -0
  512. mqt/core/na/fomac.pyi +117 -0
  513. mqt/core/plugins/__init__.py +9 -0
  514. mqt/core/plugins/qiskit/__init__.py +19 -0
  515. mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
  516. mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
  517. mqt/core/py.typed +2 -0
  518. mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
  519. mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
  520. mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
  521. mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
  522. mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
  523. mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
  524. mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
  525. mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
  526. mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
  527. mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +446 -0
  528. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
  529. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
  530. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +109 -0
  531. mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
  532. mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
  533. mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
  534. mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
  535. mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
  536. mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
  537. mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
  538. mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
  539. mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +118 -0
  540. mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
  541. mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
  542. mqt_core-3.3.2.dist-info/METADATA +210 -0
  543. mqt_core-3.3.2.dist-info/RECORD +546 -0
  544. mqt_core-3.3.2.dist-info/WHEEL +6 -0
  545. mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
  546. mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -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