mqt-core 3.3.2__cp314-cp314t-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.
Files changed (537) hide show
  1. mqt/core/__init__.py +89 -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/bin/mqt-core-algorithms.dll +0 -0
  9. mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
  10. mqt/core/bin/mqt-core-dd.dll +0 -0
  11. mqt/core/bin/mqt-core-ds.dll +0 -0
  12. mqt/core/bin/mqt-core-fomac.dll +0 -0
  13. mqt/core/bin/mqt-core-ir.dll +0 -0
  14. mqt/core/bin/mqt-core-na-fomac.dll +0 -0
  15. mqt/core/bin/mqt-core-na.dll +0 -0
  16. mqt/core/bin/mqt-core-qasm.dll +0 -0
  17. mqt/core/bin/mqt-core-qdmi-driver.dll +0 -0
  18. mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
  19. mqt/core/bin/mqt-core-zx.dll +0 -0
  20. mqt/core/dd.cp314t-win_amd64.pyd +0 -0
  21. mqt/core/dd.pyi +1016 -0
  22. mqt/core/dd_evaluation.py +368 -0
  23. mqt/core/fomac.cp314t-win_amd64.pyd +0 -0
  24. mqt/core/fomac.pyi +125 -0
  25. mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
  26. mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
  27. mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
  28. mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
  29. mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
  30. mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
  31. mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
  32. mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
  33. mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
  34. mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
  35. mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
  36. mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
  37. mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
  38. mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
  39. mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
  40. mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
  41. mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
  42. mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
  43. mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
  44. mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
  45. mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
  46. mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
  47. mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
  48. mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
  49. mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
  50. mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
  51. mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
  52. mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
  53. mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
  54. mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
  55. mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
  56. mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
  57. mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
  58. mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
  59. mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
  60. mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
  61. mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
  62. mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
  63. mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
  64. mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
  65. mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
  66. mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
  67. mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
  68. mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
  69. mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
  70. mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
  71. mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
  72. mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
  73. mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
  74. mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
  75. mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
  76. mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
  77. mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
  78. mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
  79. mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
  80. mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
  81. mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
  82. mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
  83. mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
  84. mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
  85. mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
  86. mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
  87. mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
  88. mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
  89. mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
  90. mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
  91. mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
  92. mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
  93. mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
  94. mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
  95. mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
  96. mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
  97. mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
  98. mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
  99. mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
  100. mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
  101. mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
  102. mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
  103. mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
  104. mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
  105. mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
  106. mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
  107. mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
  108. mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
  109. mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
  110. mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
  111. mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
  112. mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
  113. mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
  114. mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
  115. mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
  116. mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
  117. mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
  118. mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
  119. mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
  120. mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
  121. mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
  122. mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
  123. mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
  124. mqt/core/include/mqt-core/boost/config.hpp +67 -0
  125. mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
  126. mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
  127. mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
  128. mqt/core/include/mqt-core/boost/limits.hpp +146 -0
  129. mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
  130. mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
  131. mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
  132. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
  133. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
  134. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
  135. mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
  136. mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
  137. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
  138. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
  139. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
  140. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
  141. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
  142. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
  143. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
  144. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
  145. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
  146. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
  147. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
  148. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
  149. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
  150. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
  151. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
  152. mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
  153. mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
  154. mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
  155. mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
  156. mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
  157. mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
  158. mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
  159. mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
  160. mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
  161. mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
  162. mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
  163. mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
  164. mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
  165. mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
  166. mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
  167. mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
  168. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
  169. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
  170. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
  171. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
  172. mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
  173. mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
  174. mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
  175. mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
  176. mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
  177. mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
  178. mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
  179. mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
  180. mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
  181. mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
  182. mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
  183. mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
  184. mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
  185. mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
  186. mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
  187. mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
  188. mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
  189. mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
  190. mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
  191. mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
  192. mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
  193. mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
  194. mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
  195. mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
  196. mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
  197. mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
  198. mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
  199. mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
  200. mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
  201. mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
  202. mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
  203. mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
  204. mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
  205. mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
  206. mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
  207. mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
  208. mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
  209. mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
  210. mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
  211. mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
  212. mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
  213. mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
  214. mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
  215. mqt/core/include/mqt-core/boost/version.hpp +32 -0
  216. mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
  217. mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
  218. mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
  219. mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
  220. mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
  221. mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
  222. mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
  223. mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
  224. mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
  225. mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
  226. mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
  227. mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
  228. mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
  229. mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
  230. mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
  231. mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
  232. mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
  233. mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
  234. mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
  235. mqt/core/include/mqt-core/dd/Export.hpp +438 -0
  236. mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
  237. mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
  238. mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
  239. mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
  240. mqt/core/include/mqt-core/dd/Node.hpp +223 -0
  241. mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
  242. mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
  243. mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
  244. mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
  245. mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
  246. mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
  247. mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
  248. mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
  249. mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
  250. mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
  251. mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
  252. mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
  253. mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
  254. mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
  255. mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
  256. mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
  257. mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
  258. mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
  259. mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
  260. mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
  261. mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
  262. mqt/core/include/mqt-core/ir/Register.hpp +125 -0
  263. mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
  264. mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
  265. mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
  266. mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
  267. mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
  268. mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
  269. mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
  270. mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
  271. mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
  272. mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
  273. mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
  274. mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
  275. mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
  276. mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
  277. mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
  278. mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
  279. mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
  280. mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
  281. mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
  282. mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
  283. mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
  284. mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
  285. mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
  286. mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
  287. mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
  288. mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
  289. mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
  290. mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
  291. mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
  292. mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
  293. mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
  294. mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
  295. mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
  296. mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
  297. mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
  298. mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
  299. mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
  300. mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
  301. mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
  302. mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
  303. mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
  304. mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
  305. mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
  306. mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
  307. mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
  308. mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
  309. mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
  310. mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
  311. mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
  312. mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
  313. mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
  314. mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
  315. mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
  316. mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
  317. mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
  318. mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
  319. mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
  320. mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
  321. mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
  322. mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
  323. mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
  324. mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
  325. mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
  326. mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
  327. mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
  328. mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
  329. mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
  330. mqt/core/include/nlohmann/detail/hash.hpp +129 -0
  331. mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
  332. mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
  333. mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
  334. mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
  335. mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
  336. mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
  337. mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
  338. mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
  339. mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
  340. mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
  341. mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
  342. mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
  343. mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
  344. mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
  345. mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
  346. mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
  347. mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
  348. mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
  349. mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
  350. mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
  351. mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
  352. mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
  353. mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
  354. mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
  355. mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
  356. mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
  357. mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
  358. mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
  359. mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
  360. mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
  361. mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
  362. mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
  363. mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
  364. mqt/core/include/nlohmann/json.hpp +5306 -0
  365. mqt/core/include/nlohmann/json_fwd.hpp +75 -0
  366. mqt/core/include/nlohmann/ordered_map.hpp +359 -0
  367. mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
  368. mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
  369. mqt/core/include/qdmi/qdmi/client.h +990 -0
  370. mqt/core/include/qdmi/qdmi/constants.h +1139 -0
  371. mqt/core/include/qdmi/qdmi/device.h +602 -0
  372. mqt/core/include/qdmi/qdmi/types.h +78 -0
  373. mqt/core/include/spdlog/async.h +99 -0
  374. mqt/core/include/spdlog/async_logger-inl.h +84 -0
  375. mqt/core/include/spdlog/async_logger.h +74 -0
  376. mqt/core/include/spdlog/cfg/argv.h +40 -0
  377. mqt/core/include/spdlog/cfg/env.h +36 -0
  378. mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
  379. mqt/core/include/spdlog/cfg/helpers.h +29 -0
  380. mqt/core/include/spdlog/common-inl.h +68 -0
  381. mqt/core/include/spdlog/common.h +406 -0
  382. mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
  383. mqt/core/include/spdlog/details/backtracer.h +45 -0
  384. mqt/core/include/spdlog/details/circular_q.h +115 -0
  385. mqt/core/include/spdlog/details/console_globals.h +28 -0
  386. mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
  387. mqt/core/include/spdlog/details/file_helper.h +61 -0
  388. mqt/core/include/spdlog/details/fmt_helper.h +141 -0
  389. mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
  390. mqt/core/include/spdlog/details/log_msg.h +40 -0
  391. mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
  392. mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
  393. mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
  394. mqt/core/include/spdlog/details/null_mutex.h +35 -0
  395. mqt/core/include/spdlog/details/os-inl.h +606 -0
  396. mqt/core/include/spdlog/details/os.h +127 -0
  397. mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
  398. mqt/core/include/spdlog/details/periodic_worker.h +58 -0
  399. mqt/core/include/spdlog/details/registry-inl.h +270 -0
  400. mqt/core/include/spdlog/details/registry.h +131 -0
  401. mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
  402. mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
  403. mqt/core/include/spdlog/details/tcp_client.h +127 -0
  404. mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
  405. mqt/core/include/spdlog/details/thread_pool.h +117 -0
  406. mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
  407. mqt/core/include/spdlog/details/udp_client.h +81 -0
  408. mqt/core/include/spdlog/details/windows_include.h +11 -0
  409. mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
  410. mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
  411. mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
  412. mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
  413. mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
  414. mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
  415. mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
  416. mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
  417. mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
  418. mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
  419. mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
  420. mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
  421. mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
  422. mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
  423. mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
  424. mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
  425. mqt/core/include/spdlog/fmt/chrono.h +23 -0
  426. mqt/core/include/spdlog/fmt/compile.h +23 -0
  427. mqt/core/include/spdlog/fmt/fmt.h +30 -0
  428. mqt/core/include/spdlog/fmt/ostr.h +23 -0
  429. mqt/core/include/spdlog/fmt/ranges.h +23 -0
  430. mqt/core/include/spdlog/fmt/std.h +24 -0
  431. mqt/core/include/spdlog/fmt/xchar.h +23 -0
  432. mqt/core/include/spdlog/formatter.h +17 -0
  433. mqt/core/include/spdlog/fwd.h +18 -0
  434. mqt/core/include/spdlog/logger-inl.h +198 -0
  435. mqt/core/include/spdlog/logger.h +379 -0
  436. mqt/core/include/spdlog/mdc.h +52 -0
  437. mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
  438. mqt/core/include/spdlog/pattern_formatter.h +118 -0
  439. mqt/core/include/spdlog/sinks/android_sink.h +137 -0
  440. mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
  441. mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
  442. mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
  443. mqt/core/include/spdlog/sinks/base_sink.h +51 -0
  444. mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
  445. mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
  446. mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
  447. mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
  448. mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
  449. mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
  450. mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
  451. mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
  452. mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
  453. mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
  454. mqt/core/include/spdlog/sinks/null_sink.h +41 -0
  455. mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
  456. mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
  457. mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
  458. mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
  459. mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
  460. mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
  461. mqt/core/include/spdlog/sinks/sink.h +34 -0
  462. mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
  463. mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
  464. mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
  465. mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
  466. mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
  467. mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
  468. mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
  469. mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
  470. mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
  471. mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
  472. mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
  473. mqt/core/include/spdlog/spdlog-inl.h +96 -0
  474. mqt/core/include/spdlog/spdlog.h +357 -0
  475. mqt/core/include/spdlog/stopwatch.h +66 -0
  476. mqt/core/include/spdlog/tweakme.h +148 -0
  477. mqt/core/include/spdlog/version.h +11 -0
  478. mqt/core/ir/__init__.pyi +2078 -0
  479. mqt/core/ir/operations.pyi +1011 -0
  480. mqt/core/ir/registers.pyi +91 -0
  481. mqt/core/ir/symbolic.pyi +177 -0
  482. mqt/core/ir.cp314t-win_amd64.pyd +0 -0
  483. mqt/core/lib/mqt-core-algorithms.lib +0 -0
  484. mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
  485. mqt/core/lib/mqt-core-dd.lib +0 -0
  486. mqt/core/lib/mqt-core-ds.lib +0 -0
  487. mqt/core/lib/mqt-core-fomac.lib +0 -0
  488. mqt/core/lib/mqt-core-ir.lib +0 -0
  489. mqt/core/lib/mqt-core-na-fomac.lib +0 -0
  490. mqt/core/lib/mqt-core-na.lib +0 -0
  491. mqt/core/lib/mqt-core-qasm.lib +0 -0
  492. mqt/core/lib/mqt-core-qdmi-driver.lib +0 -0
  493. mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
  494. mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
  495. mqt/core/lib/mqt-core-zx.lib +0 -0
  496. mqt/core/lib/pkgconfig/spdlog.pc +13 -0
  497. mqt/core/lib/spdlog.lib +0 -0
  498. mqt/core/na/__init__.py +12 -0
  499. mqt/core/na/fomac.cp314t-win_amd64.pyd +0 -0
  500. mqt/core/na/fomac.pyi +117 -0
  501. mqt/core/nlohmann_json.natvis +278 -0
  502. mqt/core/plugins/__init__.py +9 -0
  503. mqt/core/plugins/qiskit/__init__.py +19 -0
  504. mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
  505. mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
  506. mqt/core/py.typed +2 -0
  507. mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
  508. mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
  509. mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
  510. mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
  511. mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
  512. mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
  513. mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
  514. mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
  515. mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
  516. mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +445 -0
  517. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
  518. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
  519. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +110 -0
  520. mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
  521. mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
  522. mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
  523. mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
  524. mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
  525. mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
  526. mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
  527. mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
  528. mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +121 -0
  529. mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
  530. mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
  531. mqt_core-3.3.2.dist-info/DELVEWHEEL +2 -0
  532. mqt_core-3.3.2.dist-info/METADATA +210 -0
  533. mqt_core-3.3.2.dist-info/RECORD +537 -0
  534. mqt_core-3.3.2.dist-info/WHEEL +5 -0
  535. mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
  536. mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
  537. mqt_core.libs/msvcp140.dll +0 -0
@@ -0,0 +1,986 @@
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 <cstddef>
12
+ #include <string> // string
13
+ #include <type_traits> // enable_if_t
14
+ #include <utility> // move
15
+ #include <vector> // vector
16
+
17
+ #include <nlohmann/detail/exceptions.hpp>
18
+ #include <nlohmann/detail/input/lexer.hpp>
19
+ #include <nlohmann/detail/macro_scope.hpp>
20
+ #include <nlohmann/detail/string_concat.hpp>
21
+ NLOHMANN_JSON_NAMESPACE_BEGIN
22
+
23
+ /*!
24
+ @brief SAX interface
25
+
26
+ This class describes the SAX interface used by @ref nlohmann::json::sax_parse.
27
+ Each function is called in different situations while the input is parsed. The
28
+ boolean return value informs the parser whether to continue processing the
29
+ input.
30
+ */
31
+ template<typename BasicJsonType>
32
+ struct json_sax
33
+ {
34
+ using number_integer_t = typename BasicJsonType::number_integer_t;
35
+ using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
36
+ using number_float_t = typename BasicJsonType::number_float_t;
37
+ using string_t = typename BasicJsonType::string_t;
38
+ using binary_t = typename BasicJsonType::binary_t;
39
+
40
+ /*!
41
+ @brief a null value was read
42
+ @return whether parsing should proceed
43
+ */
44
+ virtual bool null() = 0;
45
+
46
+ /*!
47
+ @brief a boolean value was read
48
+ @param[in] val boolean value
49
+ @return whether parsing should proceed
50
+ */
51
+ virtual bool boolean(bool val) = 0;
52
+
53
+ /*!
54
+ @brief an integer number was read
55
+ @param[in] val integer value
56
+ @return whether parsing should proceed
57
+ */
58
+ virtual bool number_integer(number_integer_t val) = 0;
59
+
60
+ /*!
61
+ @brief an unsigned integer number was read
62
+ @param[in] val unsigned integer value
63
+ @return whether parsing should proceed
64
+ */
65
+ virtual bool number_unsigned(number_unsigned_t val) = 0;
66
+
67
+ /*!
68
+ @brief a floating-point number was read
69
+ @param[in] val floating-point value
70
+ @param[in] s raw token value
71
+ @return whether parsing should proceed
72
+ */
73
+ virtual bool number_float(number_float_t val, const string_t& s) = 0;
74
+
75
+ /*!
76
+ @brief a string value was read
77
+ @param[in] val string value
78
+ @return whether parsing should proceed
79
+ @note It is safe to move the passed string value.
80
+ */
81
+ virtual bool string(string_t& val) = 0;
82
+
83
+ /*!
84
+ @brief a binary value was read
85
+ @param[in] val binary value
86
+ @return whether parsing should proceed
87
+ @note It is safe to move the passed binary value.
88
+ */
89
+ virtual bool binary(binary_t& val) = 0;
90
+
91
+ /*!
92
+ @brief the beginning of an object was read
93
+ @param[in] elements number of object elements or -1 if unknown
94
+ @return whether parsing should proceed
95
+ @note binary formats may report the number of elements
96
+ */
97
+ virtual bool start_object(std::size_t elements) = 0;
98
+
99
+ /*!
100
+ @brief an object key was read
101
+ @param[in] val object key
102
+ @return whether parsing should proceed
103
+ @note It is safe to move the passed string.
104
+ */
105
+ virtual bool key(string_t& val) = 0;
106
+
107
+ /*!
108
+ @brief the end of an object was read
109
+ @return whether parsing should proceed
110
+ */
111
+ virtual bool end_object() = 0;
112
+
113
+ /*!
114
+ @brief the beginning of an array was read
115
+ @param[in] elements number of array elements or -1 if unknown
116
+ @return whether parsing should proceed
117
+ @note binary formats may report the number of elements
118
+ */
119
+ virtual bool start_array(std::size_t elements) = 0;
120
+
121
+ /*!
122
+ @brief the end of an array was read
123
+ @return whether parsing should proceed
124
+ */
125
+ virtual bool end_array() = 0;
126
+
127
+ /*!
128
+ @brief a parse error occurred
129
+ @param[in] position the position in the input where the error occurs
130
+ @param[in] last_token the last read token
131
+ @param[in] ex an exception object describing the error
132
+ @return whether parsing should proceed (must return false)
133
+ */
134
+ virtual bool parse_error(std::size_t position,
135
+ const std::string& last_token,
136
+ const detail::exception& ex) = 0;
137
+
138
+ json_sax() = default;
139
+ json_sax(const json_sax&) = default;
140
+ json_sax(json_sax&&) noexcept = default;
141
+ json_sax& operator=(const json_sax&) = default;
142
+ json_sax& operator=(json_sax&&) noexcept = default;
143
+ virtual ~json_sax() = default;
144
+ };
145
+
146
+ namespace detail
147
+ {
148
+ constexpr std::size_t unknown_size()
149
+ {
150
+ return (std::numeric_limits<std::size_t>::max)();
151
+ }
152
+
153
+ /*!
154
+ @brief SAX implementation to create a JSON value from SAX events
155
+
156
+ This class implements the @ref json_sax interface and processes the SAX events
157
+ to create a JSON value which makes it basically a DOM parser. The structure or
158
+ hierarchy of the JSON value is managed by the stack `ref_stack` which contains
159
+ a pointer to the respective array or object for each recursion depth.
160
+
161
+ After successful parsing, the value that is passed by reference to the
162
+ constructor contains the parsed value.
163
+
164
+ @tparam BasicJsonType the JSON type
165
+ */
166
+ template<typename BasicJsonType, typename InputAdapterType>
167
+ class json_sax_dom_parser
168
+ {
169
+ public:
170
+ using number_integer_t = typename BasicJsonType::number_integer_t;
171
+ using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
172
+ using number_float_t = typename BasicJsonType::number_float_t;
173
+ using string_t = typename BasicJsonType::string_t;
174
+ using binary_t = typename BasicJsonType::binary_t;
175
+ using lexer_t = lexer<BasicJsonType, InputAdapterType>;
176
+
177
+ /*!
178
+ @param[in,out] r reference to a JSON value that is manipulated while
179
+ parsing
180
+ @param[in] allow_exceptions_ whether parse errors yield exceptions
181
+ */
182
+ explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true, lexer_t* lexer_ = nullptr)
183
+ : root(r), allow_exceptions(allow_exceptions_), m_lexer_ref(lexer_)
184
+ {}
185
+
186
+ // make class move-only
187
+ json_sax_dom_parser(const json_sax_dom_parser&) = delete;
188
+ json_sax_dom_parser(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
189
+ json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
190
+ json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
191
+ ~json_sax_dom_parser() = default;
192
+
193
+ bool null()
194
+ {
195
+ handle_value(nullptr);
196
+ return true;
197
+ }
198
+
199
+ bool boolean(bool val)
200
+ {
201
+ handle_value(val);
202
+ return true;
203
+ }
204
+
205
+ bool number_integer(number_integer_t val)
206
+ {
207
+ handle_value(val);
208
+ return true;
209
+ }
210
+
211
+ bool number_unsigned(number_unsigned_t val)
212
+ {
213
+ handle_value(val);
214
+ return true;
215
+ }
216
+
217
+ bool number_float(number_float_t val, const string_t& /*unused*/)
218
+ {
219
+ handle_value(val);
220
+ return true;
221
+ }
222
+
223
+ bool string(string_t& val)
224
+ {
225
+ handle_value(val);
226
+ return true;
227
+ }
228
+
229
+ bool binary(binary_t& val)
230
+ {
231
+ handle_value(std::move(val));
232
+ return true;
233
+ }
234
+
235
+ bool start_object(std::size_t len)
236
+ {
237
+ ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
238
+
239
+ #if JSON_DIAGNOSTIC_POSITIONS
240
+ // Manually set the start position of the object here.
241
+ // Ensure this is after the call to handle_value to ensure correct start position.
242
+ if (m_lexer_ref)
243
+ {
244
+ // Lexer has read the first character of the object, so
245
+ // subtract 1 from the position to get the correct start position.
246
+ ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
247
+ }
248
+ #endif
249
+
250
+ if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))
251
+ {
252
+ JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back()));
253
+ }
254
+
255
+ return true;
256
+ }
257
+
258
+ bool key(string_t& val)
259
+ {
260
+ JSON_ASSERT(!ref_stack.empty());
261
+ JSON_ASSERT(ref_stack.back()->is_object());
262
+
263
+ // add null at given key and store the reference for later
264
+ object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val));
265
+ return true;
266
+ }
267
+
268
+ bool end_object()
269
+ {
270
+ JSON_ASSERT(!ref_stack.empty());
271
+ JSON_ASSERT(ref_stack.back()->is_object());
272
+
273
+ #if JSON_DIAGNOSTIC_POSITIONS
274
+ if (m_lexer_ref)
275
+ {
276
+ // Lexer's position is past the closing brace, so set that as the end position.
277
+ ref_stack.back()->end_position = m_lexer_ref->get_position();
278
+ }
279
+ #endif
280
+
281
+ ref_stack.back()->set_parents();
282
+ ref_stack.pop_back();
283
+ return true;
284
+ }
285
+
286
+ bool start_array(std::size_t len)
287
+ {
288
+ ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
289
+
290
+ #if JSON_DIAGNOSTIC_POSITIONS
291
+ // Manually set the start position of the array here.
292
+ // Ensure this is after the call to handle_value to ensure correct start position.
293
+ if (m_lexer_ref)
294
+ {
295
+ ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
296
+ }
297
+ #endif
298
+
299
+ if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))
300
+ {
301
+ JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back()));
302
+ }
303
+
304
+ return true;
305
+ }
306
+
307
+ bool end_array()
308
+ {
309
+ JSON_ASSERT(!ref_stack.empty());
310
+ JSON_ASSERT(ref_stack.back()->is_array());
311
+
312
+ #if JSON_DIAGNOSTIC_POSITIONS
313
+ if (m_lexer_ref)
314
+ {
315
+ // Lexer's position is past the closing bracket, so set that as the end position.
316
+ ref_stack.back()->end_position = m_lexer_ref->get_position();
317
+ }
318
+ #endif
319
+
320
+ ref_stack.back()->set_parents();
321
+ ref_stack.pop_back();
322
+ return true;
323
+ }
324
+
325
+ template<class Exception>
326
+ bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,
327
+ const Exception& ex)
328
+ {
329
+ errored = true;
330
+ static_cast<void>(ex);
331
+ if (allow_exceptions)
332
+ {
333
+ JSON_THROW(ex);
334
+ }
335
+ return false;
336
+ }
337
+
338
+ constexpr bool is_errored() const
339
+ {
340
+ return errored;
341
+ }
342
+
343
+ private:
344
+
345
+ #if JSON_DIAGNOSTIC_POSITIONS
346
+ void handle_diagnostic_positions_for_json_value(BasicJsonType& v)
347
+ {
348
+ if (m_lexer_ref)
349
+ {
350
+ // Lexer has read past the current field value, so set the end position to the current position.
351
+ // The start position will be set below based on the length of the string representation
352
+ // of the value.
353
+ v.end_position = m_lexer_ref->get_position();
354
+
355
+ switch (v.type())
356
+ {
357
+ case value_t::boolean:
358
+ {
359
+ // 4 and 5 are the string length of "true" and "false"
360
+ v.start_position = v.end_position - (v.m_data.m_value.boolean ? 4 : 5);
361
+ break;
362
+ }
363
+
364
+ case value_t::null:
365
+ {
366
+ // 4 is the string length of "null"
367
+ v.start_position = v.end_position - 4;
368
+ break;
369
+ }
370
+
371
+ case value_t::string:
372
+ {
373
+ // include the length of the quotes, which is 2
374
+ v.start_position = v.end_position - v.m_data.m_value.string->size() - 2;
375
+ break;
376
+ }
377
+
378
+ // As we handle the start and end positions for values created during parsing,
379
+ // we do not expect the following value type to be called. Regardless, set the positions
380
+ // in case this is created manually or through a different constructor. Exclude from lcov
381
+ // since the exact condition of this switch is esoteric.
382
+ // LCOV_EXCL_START
383
+ case value_t::discarded:
384
+ {
385
+ v.end_position = std::string::npos;
386
+ v.start_position = v.end_position;
387
+ break;
388
+ }
389
+ // LCOV_EXCL_STOP
390
+ case value_t::binary:
391
+ case value_t::number_integer:
392
+ case value_t::number_unsigned:
393
+ case value_t::number_float:
394
+ {
395
+ v.start_position = v.end_position - m_lexer_ref->get_string().size();
396
+ break;
397
+ }
398
+ case value_t::object:
399
+ case value_t::array:
400
+ {
401
+ // object and array are handled in start_object() and start_array() handlers
402
+ // skip setting the values here.
403
+ break;
404
+ }
405
+ default: // LCOV_EXCL_LINE
406
+ // Handle all possible types discretely, default handler should never be reached.
407
+ JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert,-warnings-as-errors) LCOV_EXCL_LINE
408
+ }
409
+ }
410
+ }
411
+ #endif
412
+
413
+ /*!
414
+ @invariant If the ref stack is empty, then the passed value will be the new
415
+ root.
416
+ @invariant If the ref stack contains a value, then it is an array or an
417
+ object to which we can add elements
418
+ */
419
+ template<typename Value>
420
+ JSON_HEDLEY_RETURNS_NON_NULL
421
+ BasicJsonType* handle_value(Value&& v)
422
+ {
423
+ if (ref_stack.empty())
424
+ {
425
+ root = BasicJsonType(std::forward<Value>(v));
426
+
427
+ #if JSON_DIAGNOSTIC_POSITIONS
428
+ handle_diagnostic_positions_for_json_value(root);
429
+ #endif
430
+
431
+ return &root;
432
+ }
433
+
434
+ JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
435
+
436
+ if (ref_stack.back()->is_array())
437
+ {
438
+ ref_stack.back()->m_data.m_value.array->emplace_back(std::forward<Value>(v));
439
+
440
+ #if JSON_DIAGNOSTIC_POSITIONS
441
+ handle_diagnostic_positions_for_json_value(ref_stack.back()->m_data.m_value.array->back());
442
+ #endif
443
+
444
+ return &(ref_stack.back()->m_data.m_value.array->back());
445
+ }
446
+
447
+ JSON_ASSERT(ref_stack.back()->is_object());
448
+ JSON_ASSERT(object_element);
449
+ *object_element = BasicJsonType(std::forward<Value>(v));
450
+
451
+ #if JSON_DIAGNOSTIC_POSITIONS
452
+ handle_diagnostic_positions_for_json_value(*object_element);
453
+ #endif
454
+
455
+ return object_element;
456
+ }
457
+
458
+ /// the parsed JSON value
459
+ BasicJsonType& root;
460
+ /// stack to model hierarchy of values
461
+ std::vector<BasicJsonType*> ref_stack {};
462
+ /// helper to hold the reference for the next object element
463
+ BasicJsonType* object_element = nullptr;
464
+ /// whether a syntax error occurred
465
+ bool errored = false;
466
+ /// whether to throw exceptions in case of errors
467
+ const bool allow_exceptions = true;
468
+ /// the lexer reference to obtain the current position
469
+ lexer_t* m_lexer_ref = nullptr;
470
+ };
471
+
472
+ template<typename BasicJsonType, typename InputAdapterType>
473
+ class json_sax_dom_callback_parser
474
+ {
475
+ public:
476
+ using number_integer_t = typename BasicJsonType::number_integer_t;
477
+ using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
478
+ using number_float_t = typename BasicJsonType::number_float_t;
479
+ using string_t = typename BasicJsonType::string_t;
480
+ using binary_t = typename BasicJsonType::binary_t;
481
+ using parser_callback_t = typename BasicJsonType::parser_callback_t;
482
+ using parse_event_t = typename BasicJsonType::parse_event_t;
483
+ using lexer_t = lexer<BasicJsonType, InputAdapterType>;
484
+
485
+ json_sax_dom_callback_parser(BasicJsonType& r,
486
+ parser_callback_t cb,
487
+ const bool allow_exceptions_ = true,
488
+ lexer_t* lexer_ = nullptr)
489
+ : root(r), callback(std::move(cb)), allow_exceptions(allow_exceptions_), m_lexer_ref(lexer_)
490
+ {
491
+ keep_stack.push_back(true);
492
+ }
493
+
494
+ // make class move-only
495
+ json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete;
496
+ json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
497
+ json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete;
498
+ json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
499
+ ~json_sax_dom_callback_parser() = default;
500
+
501
+ bool null()
502
+ {
503
+ handle_value(nullptr);
504
+ return true;
505
+ }
506
+
507
+ bool boolean(bool val)
508
+ {
509
+ handle_value(val);
510
+ return true;
511
+ }
512
+
513
+ bool number_integer(number_integer_t val)
514
+ {
515
+ handle_value(val);
516
+ return true;
517
+ }
518
+
519
+ bool number_unsigned(number_unsigned_t val)
520
+ {
521
+ handle_value(val);
522
+ return true;
523
+ }
524
+
525
+ bool number_float(number_float_t val, const string_t& /*unused*/)
526
+ {
527
+ handle_value(val);
528
+ return true;
529
+ }
530
+
531
+ bool string(string_t& val)
532
+ {
533
+ handle_value(val);
534
+ return true;
535
+ }
536
+
537
+ bool binary(binary_t& val)
538
+ {
539
+ handle_value(std::move(val));
540
+ return true;
541
+ }
542
+
543
+ bool start_object(std::size_t len)
544
+ {
545
+ // check callback for object start
546
+ const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::object_start, discarded);
547
+ keep_stack.push_back(keep);
548
+
549
+ auto val = handle_value(BasicJsonType::value_t::object, true);
550
+ ref_stack.push_back(val.second);
551
+
552
+ if (ref_stack.back())
553
+ {
554
+
555
+ #if JSON_DIAGNOSTIC_POSITIONS
556
+ // Manually set the start position of the object here.
557
+ // Ensure this is after the call to handle_value to ensure correct start position.
558
+ if (m_lexer_ref)
559
+ {
560
+ // Lexer has read the first character of the object, so
561
+ // subtract 1 from the position to get the correct start position.
562
+ ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
563
+ }
564
+ #endif
565
+
566
+ // check object limit
567
+ if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))
568
+ {
569
+ JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back()));
570
+ }
571
+ }
572
+ return true;
573
+ }
574
+
575
+ bool key(string_t& val)
576
+ {
577
+ BasicJsonType k = BasicJsonType(val);
578
+
579
+ // check callback for key
580
+ const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::key, k);
581
+ key_keep_stack.push_back(keep);
582
+
583
+ // add discarded value at given key and store the reference for later
584
+ if (keep && ref_stack.back())
585
+ {
586
+ object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val) = discarded);
587
+ }
588
+
589
+ return true;
590
+ }
591
+
592
+ bool end_object()
593
+ {
594
+ if (ref_stack.back())
595
+ {
596
+ if (!callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()))
597
+ {
598
+ // discard object
599
+ *ref_stack.back() = discarded;
600
+
601
+ #if JSON_DIAGNOSTIC_POSITIONS
602
+ // Set start/end positions for discarded object.
603
+ handle_diagnostic_positions_for_json_value(*ref_stack.back());
604
+ #endif
605
+ }
606
+ else
607
+ {
608
+
609
+ #if JSON_DIAGNOSTIC_POSITIONS
610
+ if (m_lexer_ref)
611
+ {
612
+ // Lexer's position is past the closing brace, so set that as the end position.
613
+ ref_stack.back()->end_position = m_lexer_ref->get_position();
614
+ }
615
+ #endif
616
+
617
+ ref_stack.back()->set_parents();
618
+ }
619
+ }
620
+
621
+ JSON_ASSERT(!ref_stack.empty());
622
+ JSON_ASSERT(!keep_stack.empty());
623
+ ref_stack.pop_back();
624
+ keep_stack.pop_back();
625
+
626
+ if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())
627
+ {
628
+ // remove discarded value
629
+ for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)
630
+ {
631
+ if (it->is_discarded())
632
+ {
633
+ ref_stack.back()->erase(it);
634
+ break;
635
+ }
636
+ }
637
+ }
638
+
639
+ return true;
640
+ }
641
+
642
+ bool start_array(std::size_t len)
643
+ {
644
+ const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::array_start, discarded);
645
+ keep_stack.push_back(keep);
646
+
647
+ auto val = handle_value(BasicJsonType::value_t::array, true);
648
+ ref_stack.push_back(val.second);
649
+
650
+ if (ref_stack.back())
651
+ {
652
+
653
+ #if JSON_DIAGNOSTIC_POSITIONS
654
+ // Manually set the start position of the array here.
655
+ // Ensure this is after the call to handle_value to ensure correct start position.
656
+ if (m_lexer_ref)
657
+ {
658
+ // Lexer has read the first character of the array, so
659
+ // subtract 1 from the position to get the correct start position.
660
+ ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
661
+ }
662
+ #endif
663
+
664
+ // check array limit
665
+ if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))
666
+ {
667
+ JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back()));
668
+ }
669
+ }
670
+
671
+ return true;
672
+ }
673
+
674
+ bool end_array()
675
+ {
676
+ bool keep = true;
677
+
678
+ if (ref_stack.back())
679
+ {
680
+ keep = callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back());
681
+ if (keep)
682
+ {
683
+
684
+ #if JSON_DIAGNOSTIC_POSITIONS
685
+ if (m_lexer_ref)
686
+ {
687
+ // Lexer's position is past the closing bracket, so set that as the end position.
688
+ ref_stack.back()->end_position = m_lexer_ref->get_position();
689
+ }
690
+ #endif
691
+
692
+ ref_stack.back()->set_parents();
693
+ }
694
+ else
695
+ {
696
+ // discard array
697
+ *ref_stack.back() = discarded;
698
+
699
+ #if JSON_DIAGNOSTIC_POSITIONS
700
+ // Set start/end positions for discarded array.
701
+ handle_diagnostic_positions_for_json_value(*ref_stack.back());
702
+ #endif
703
+ }
704
+ }
705
+
706
+ JSON_ASSERT(!ref_stack.empty());
707
+ JSON_ASSERT(!keep_stack.empty());
708
+ ref_stack.pop_back();
709
+ keep_stack.pop_back();
710
+
711
+ // remove discarded value
712
+ if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())
713
+ {
714
+ ref_stack.back()->m_data.m_value.array->pop_back();
715
+ }
716
+
717
+ return true;
718
+ }
719
+
720
+ template<class Exception>
721
+ bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,
722
+ const Exception& ex)
723
+ {
724
+ errored = true;
725
+ static_cast<void>(ex);
726
+ if (allow_exceptions)
727
+ {
728
+ JSON_THROW(ex);
729
+ }
730
+ return false;
731
+ }
732
+
733
+ constexpr bool is_errored() const
734
+ {
735
+ return errored;
736
+ }
737
+
738
+ private:
739
+
740
+ #if JSON_DIAGNOSTIC_POSITIONS
741
+ void handle_diagnostic_positions_for_json_value(BasicJsonType& v)
742
+ {
743
+ if (m_lexer_ref)
744
+ {
745
+ // Lexer has read past the current field value, so set the end position to the current position.
746
+ // The start position will be set below based on the length of the string representation
747
+ // of the value.
748
+ v.end_position = m_lexer_ref->get_position();
749
+
750
+ switch (v.type())
751
+ {
752
+ case value_t::boolean:
753
+ {
754
+ // 4 and 5 are the string length of "true" and "false"
755
+ v.start_position = v.end_position - (v.m_data.m_value.boolean ? 4 : 5);
756
+ break;
757
+ }
758
+
759
+ case value_t::null:
760
+ {
761
+ // 4 is the string length of "null"
762
+ v.start_position = v.end_position - 4;
763
+ break;
764
+ }
765
+
766
+ case value_t::string:
767
+ {
768
+ // include the length of the quotes, which is 2
769
+ v.start_position = v.end_position - v.m_data.m_value.string->size() - 2;
770
+ break;
771
+ }
772
+
773
+ case value_t::discarded:
774
+ {
775
+ v.end_position = std::string::npos;
776
+ v.start_position = v.end_position;
777
+ break;
778
+ }
779
+
780
+ case value_t::binary:
781
+ case value_t::number_integer:
782
+ case value_t::number_unsigned:
783
+ case value_t::number_float:
784
+ {
785
+ v.start_position = v.end_position - m_lexer_ref->get_string().size();
786
+ break;
787
+ }
788
+
789
+ case value_t::object:
790
+ case value_t::array:
791
+ {
792
+ // object and array are handled in start_object() and start_array() handlers
793
+ // skip setting the values here.
794
+ break;
795
+ }
796
+ default: // LCOV_EXCL_LINE
797
+ // Handle all possible types discretely, default handler should never be reached.
798
+ JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert,-warnings-as-errors) LCOV_EXCL_LINE
799
+ }
800
+ }
801
+ }
802
+ #endif
803
+
804
+ /*!
805
+ @param[in] v value to add to the JSON value we build during parsing
806
+ @param[in] skip_callback whether we should skip calling the callback
807
+ function; this is required after start_array() and
808
+ start_object() SAX events, because otherwise we would call the
809
+ callback function with an empty array or object, respectively.
810
+
811
+ @invariant If the ref stack is empty, then the passed value will be the new
812
+ root.
813
+ @invariant If the ref stack contains a value, then it is an array or an
814
+ object to which we can add elements
815
+
816
+ @return pair of boolean (whether value should be kept) and pointer (to the
817
+ passed value in the ref_stack hierarchy; nullptr if not kept)
818
+ */
819
+ template<typename Value>
820
+ std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool skip_callback = false)
821
+ {
822
+ JSON_ASSERT(!keep_stack.empty());
823
+
824
+ // do not handle this value if we know it would be added to a discarded
825
+ // container
826
+ if (!keep_stack.back())
827
+ {
828
+ return {false, nullptr};
829
+ }
830
+
831
+ // create value
832
+ auto value = BasicJsonType(std::forward<Value>(v));
833
+
834
+ #if JSON_DIAGNOSTIC_POSITIONS
835
+ handle_diagnostic_positions_for_json_value(value);
836
+ #endif
837
+
838
+ // check callback
839
+ const bool keep = skip_callback || callback(static_cast<int>(ref_stack.size()), parse_event_t::value, value);
840
+
841
+ // do not handle this value if we just learnt it shall be discarded
842
+ if (!keep)
843
+ {
844
+ return {false, nullptr};
845
+ }
846
+
847
+ if (ref_stack.empty())
848
+ {
849
+ root = std::move(value);
850
+ return {true, & root};
851
+ }
852
+
853
+ // skip this value if we already decided to skip the parent
854
+ // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360)
855
+ if (!ref_stack.back())
856
+ {
857
+ return {false, nullptr};
858
+ }
859
+
860
+ // we now only expect arrays and objects
861
+ JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
862
+
863
+ // array
864
+ if (ref_stack.back()->is_array())
865
+ {
866
+ ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value));
867
+ return {true, & (ref_stack.back()->m_data.m_value.array->back())};
868
+ }
869
+
870
+ // object
871
+ JSON_ASSERT(ref_stack.back()->is_object());
872
+ // check if we should store an element for the current key
873
+ JSON_ASSERT(!key_keep_stack.empty());
874
+ const bool store_element = key_keep_stack.back();
875
+ key_keep_stack.pop_back();
876
+
877
+ if (!store_element)
878
+ {
879
+ return {false, nullptr};
880
+ }
881
+
882
+ JSON_ASSERT(object_element);
883
+ *object_element = std::move(value);
884
+ return {true, object_element};
885
+ }
886
+
887
+ /// the parsed JSON value
888
+ BasicJsonType& root;
889
+ /// stack to model hierarchy of values
890
+ std::vector<BasicJsonType*> ref_stack {};
891
+ /// stack to manage which values to keep
892
+ std::vector<bool> keep_stack {}; // NOLINT(readability-redundant-member-init)
893
+ /// stack to manage which object keys to keep
894
+ std::vector<bool> key_keep_stack {}; // NOLINT(readability-redundant-member-init)
895
+ /// helper to hold the reference for the next object element
896
+ BasicJsonType* object_element = nullptr;
897
+ /// whether a syntax error occurred
898
+ bool errored = false;
899
+ /// callback function
900
+ const parser_callback_t callback = nullptr;
901
+ /// whether to throw exceptions in case of errors
902
+ const bool allow_exceptions = true;
903
+ /// a discarded value for the callback
904
+ BasicJsonType discarded = BasicJsonType::value_t::discarded;
905
+ /// the lexer reference to obtain the current position
906
+ lexer_t* m_lexer_ref = nullptr;
907
+ };
908
+
909
+ template<typename BasicJsonType>
910
+ class json_sax_acceptor
911
+ {
912
+ public:
913
+ using number_integer_t = typename BasicJsonType::number_integer_t;
914
+ using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
915
+ using number_float_t = typename BasicJsonType::number_float_t;
916
+ using string_t = typename BasicJsonType::string_t;
917
+ using binary_t = typename BasicJsonType::binary_t;
918
+
919
+ bool null()
920
+ {
921
+ return true;
922
+ }
923
+
924
+ bool boolean(bool /*unused*/)
925
+ {
926
+ return true;
927
+ }
928
+
929
+ bool number_integer(number_integer_t /*unused*/)
930
+ {
931
+ return true;
932
+ }
933
+
934
+ bool number_unsigned(number_unsigned_t /*unused*/)
935
+ {
936
+ return true;
937
+ }
938
+
939
+ bool number_float(number_float_t /*unused*/, const string_t& /*unused*/)
940
+ {
941
+ return true;
942
+ }
943
+
944
+ bool string(string_t& /*unused*/)
945
+ {
946
+ return true;
947
+ }
948
+
949
+ bool binary(binary_t& /*unused*/)
950
+ {
951
+ return true;
952
+ }
953
+
954
+ bool start_object(std::size_t /*unused*/ = detail::unknown_size())
955
+ {
956
+ return true;
957
+ }
958
+
959
+ bool key(string_t& /*unused*/)
960
+ {
961
+ return true;
962
+ }
963
+
964
+ bool end_object()
965
+ {
966
+ return true;
967
+ }
968
+
969
+ bool start_array(std::size_t /*unused*/ = detail::unknown_size())
970
+ {
971
+ return true;
972
+ }
973
+
974
+ bool end_array()
975
+ {
976
+ return true;
977
+ }
978
+
979
+ bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/)
980
+ {
981
+ return false;
982
+ }
983
+ };
984
+
985
+ } // namespace detail
986
+ NLOHMANN_JSON_NAMESPACE_END