mqt-core 3.3.2__cp314-cp314t-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,760 @@
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 <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next
12
+ #include <type_traits> // conditional, is_const, remove_const
13
+
14
+ #include <nlohmann/detail/exceptions.hpp>
15
+ #include <nlohmann/detail/iterators/internal_iterator.hpp>
16
+ #include <nlohmann/detail/iterators/primitive_iterator.hpp>
17
+ #include <nlohmann/detail/macro_scope.hpp>
18
+ #include <nlohmann/detail/meta/cpp_future.hpp>
19
+ #include <nlohmann/detail/meta/type_traits.hpp>
20
+ #include <nlohmann/detail/value_t.hpp>
21
+
22
+ NLOHMANN_JSON_NAMESPACE_BEGIN
23
+ namespace detail
24
+ {
25
+
26
+ // forward declare, to be able to friend it later on
27
+ template<typename IteratorType> class iteration_proxy;
28
+ template<typename IteratorType> class iteration_proxy_value;
29
+
30
+ /*!
31
+ @brief a template for a bidirectional iterator for the @ref basic_json class
32
+ This class implements a both iterators (iterator and const_iterator) for the
33
+ @ref basic_json class.
34
+ @note An iterator is called *initialized* when a pointer to a JSON value has
35
+ been set (e.g., by a constructor or a copy assignment). If the iterator is
36
+ default-constructed, it is *uninitialized* and most methods are undefined.
37
+ **The library uses assertions to detect calls on uninitialized iterators.**
38
+ @requirement The class satisfies the following concept requirements:
39
+ -
40
+ [BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):
41
+ The iterator that can be moved can be moved in both directions (i.e.
42
+ incremented and decremented).
43
+ @since version 1.0.0, simplified in version 2.0.9, change to bidirectional
44
+ iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593)
45
+ */
46
+ template<typename BasicJsonType>
47
+ class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions)
48
+ {
49
+ /// the iterator with BasicJsonType of different const-ness
50
+ using other_iter_impl = iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>;
51
+ /// allow basic_json to access private members
52
+ friend other_iter_impl;
53
+ friend BasicJsonType;
54
+ friend iteration_proxy<iter_impl>;
55
+ friend iteration_proxy_value<iter_impl>;
56
+
57
+ using object_t = typename BasicJsonType::object_t;
58
+ using array_t = typename BasicJsonType::array_t;
59
+ // make sure BasicJsonType is basic_json or const basic_json
60
+ static_assert(is_basic_json<typename std::remove_const<BasicJsonType>::type>::value,
61
+ "iter_impl only accepts (const) basic_json");
62
+ // superficial check for the LegacyBidirectionalIterator named requirement
63
+ static_assert(std::is_base_of<std::bidirectional_iterator_tag, std::bidirectional_iterator_tag>::value
64
+ && std::is_base_of<std::bidirectional_iterator_tag, typename std::iterator_traits<typename array_t::iterator>::iterator_category>::value,
65
+ "basic_json iterator assumes array and object type iterators satisfy the LegacyBidirectionalIterator named requirement.");
66
+
67
+ public:
68
+ /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17.
69
+ /// The C++ Standard has never required user-defined iterators to derive from std::iterator.
70
+ /// A user-defined iterator should provide publicly accessible typedefs named
71
+ /// iterator_category, value_type, difference_type, pointer, and reference.
72
+ /// Note that value_type is required to be non-const, even for constant iterators.
73
+ using iterator_category = std::bidirectional_iterator_tag;
74
+
75
+ /// the type of the values when the iterator is dereferenced
76
+ using value_type = typename BasicJsonType::value_type;
77
+ /// a type to represent differences between iterators
78
+ using difference_type = typename BasicJsonType::difference_type;
79
+ /// defines a pointer to the type iterated over (value_type)
80
+ using pointer = typename std::conditional<std::is_const<BasicJsonType>::value,
81
+ typename BasicJsonType::const_pointer,
82
+ typename BasicJsonType::pointer>::type;
83
+ /// defines a reference to the type iterated over (value_type)
84
+ using reference =
85
+ typename std::conditional<std::is_const<BasicJsonType>::value,
86
+ typename BasicJsonType::const_reference,
87
+ typename BasicJsonType::reference>::type;
88
+
89
+ iter_impl() = default;
90
+ ~iter_impl() = default;
91
+ iter_impl(iter_impl&&) noexcept = default;
92
+ iter_impl& operator=(iter_impl&&) noexcept = default;
93
+
94
+ /*!
95
+ @brief constructor for a given JSON instance
96
+ @param[in] object pointer to a JSON object for this iterator
97
+ @pre object != nullptr
98
+ @post The iterator is initialized; i.e. `m_object != nullptr`.
99
+ */
100
+ explicit iter_impl(pointer object) noexcept : m_object(object)
101
+ {
102
+ JSON_ASSERT(m_object != nullptr);
103
+
104
+ switch (m_object->m_data.m_type)
105
+ {
106
+ case value_t::object:
107
+ {
108
+ m_it.object_iterator = typename object_t::iterator();
109
+ break;
110
+ }
111
+
112
+ case value_t::array:
113
+ {
114
+ m_it.array_iterator = typename array_t::iterator();
115
+ break;
116
+ }
117
+
118
+ case value_t::null:
119
+ case value_t::string:
120
+ case value_t::boolean:
121
+ case value_t::number_integer:
122
+ case value_t::number_unsigned:
123
+ case value_t::number_float:
124
+ case value_t::binary:
125
+ case value_t::discarded:
126
+ default:
127
+ {
128
+ m_it.primitive_iterator = primitive_iterator_t();
129
+ break;
130
+ }
131
+ }
132
+ }
133
+
134
+ /*!
135
+ @note The conventional copy constructor and copy assignment are implicitly
136
+ defined. Combined with the following converting constructor and
137
+ assignment, they support: (1) copy from iterator to iterator, (2)
138
+ copy from const iterator to const iterator, and (3) conversion from
139
+ iterator to const iterator. However conversion from const iterator
140
+ to iterator is not defined.
141
+ */
142
+
143
+ /*!
144
+ @brief const copy constructor
145
+ @param[in] other const iterator to copy from
146
+ @note This copy constructor had to be defined explicitly to circumvent a bug
147
+ occurring on msvc v19.0 compiler (VS 2015) debug build. For more
148
+ information refer to: https://github.com/nlohmann/json/issues/1608
149
+ */
150
+ iter_impl(const iter_impl<const BasicJsonType>& other) noexcept
151
+ : m_object(other.m_object), m_it(other.m_it)
152
+ {}
153
+
154
+ /*!
155
+ @brief converting assignment
156
+ @param[in] other const iterator to copy from
157
+ @return const/non-const iterator
158
+ @note It is not checked whether @a other is initialized.
159
+ */
160
+ iter_impl& operator=(const iter_impl<const BasicJsonType>& other) noexcept
161
+ {
162
+ if (&other != this)
163
+ {
164
+ m_object = other.m_object;
165
+ m_it = other.m_it;
166
+ }
167
+ return *this;
168
+ }
169
+
170
+ /*!
171
+ @brief converting constructor
172
+ @param[in] other non-const iterator to copy from
173
+ @note It is not checked whether @a other is initialized.
174
+ */
175
+ iter_impl(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept
176
+ : m_object(other.m_object), m_it(other.m_it)
177
+ {}
178
+
179
+ /*!
180
+ @brief converting assignment
181
+ @param[in] other non-const iterator to copy from
182
+ @return const/non-const iterator
183
+ @note It is not checked whether @a other is initialized.
184
+ */
185
+ iter_impl& operator=(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept // NOLINT(cert-oop54-cpp)
186
+ {
187
+ m_object = other.m_object;
188
+ m_it = other.m_it;
189
+ return *this;
190
+ }
191
+
192
+ JSON_PRIVATE_UNLESS_TESTED:
193
+ /*!
194
+ @brief set the iterator to the first value
195
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
196
+ */
197
+ void set_begin() noexcept
198
+ {
199
+ JSON_ASSERT(m_object != nullptr);
200
+
201
+ switch (m_object->m_data.m_type)
202
+ {
203
+ case value_t::object:
204
+ {
205
+ m_it.object_iterator = m_object->m_data.m_value.object->begin();
206
+ break;
207
+ }
208
+
209
+ case value_t::array:
210
+ {
211
+ m_it.array_iterator = m_object->m_data.m_value.array->begin();
212
+ break;
213
+ }
214
+
215
+ case value_t::null:
216
+ {
217
+ // set to end so begin()==end() is true: null is empty
218
+ m_it.primitive_iterator.set_end();
219
+ break;
220
+ }
221
+
222
+ case value_t::string:
223
+ case value_t::boolean:
224
+ case value_t::number_integer:
225
+ case value_t::number_unsigned:
226
+ case value_t::number_float:
227
+ case value_t::binary:
228
+ case value_t::discarded:
229
+ default:
230
+ {
231
+ m_it.primitive_iterator.set_begin();
232
+ break;
233
+ }
234
+ }
235
+ }
236
+
237
+ /*!
238
+ @brief set the iterator past the last value
239
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
240
+ */
241
+ void set_end() noexcept
242
+ {
243
+ JSON_ASSERT(m_object != nullptr);
244
+
245
+ switch (m_object->m_data.m_type)
246
+ {
247
+ case value_t::object:
248
+ {
249
+ m_it.object_iterator = m_object->m_data.m_value.object->end();
250
+ break;
251
+ }
252
+
253
+ case value_t::array:
254
+ {
255
+ m_it.array_iterator = m_object->m_data.m_value.array->end();
256
+ break;
257
+ }
258
+
259
+ case value_t::null:
260
+ case value_t::string:
261
+ case value_t::boolean:
262
+ case value_t::number_integer:
263
+ case value_t::number_unsigned:
264
+ case value_t::number_float:
265
+ case value_t::binary:
266
+ case value_t::discarded:
267
+ default:
268
+ {
269
+ m_it.primitive_iterator.set_end();
270
+ break;
271
+ }
272
+ }
273
+ }
274
+
275
+ public:
276
+ /*!
277
+ @brief return a reference to the value pointed to by the iterator
278
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
279
+ */
280
+ reference operator*() const
281
+ {
282
+ JSON_ASSERT(m_object != nullptr);
283
+
284
+ switch (m_object->m_data.m_type)
285
+ {
286
+ case value_t::object:
287
+ {
288
+ JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end());
289
+ return m_it.object_iterator->second;
290
+ }
291
+
292
+ case value_t::array:
293
+ {
294
+ JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end());
295
+ return *m_it.array_iterator;
296
+ }
297
+
298
+ case value_t::null:
299
+ JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
300
+
301
+ case value_t::string:
302
+ case value_t::boolean:
303
+ case value_t::number_integer:
304
+ case value_t::number_unsigned:
305
+ case value_t::number_float:
306
+ case value_t::binary:
307
+ case value_t::discarded:
308
+ default:
309
+ {
310
+ if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))
311
+ {
312
+ return *m_object;
313
+ }
314
+
315
+ JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
316
+ }
317
+ }
318
+ }
319
+
320
+ /*!
321
+ @brief dereference the iterator
322
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
323
+ */
324
+ pointer operator->() const
325
+ {
326
+ JSON_ASSERT(m_object != nullptr);
327
+
328
+ switch (m_object->m_data.m_type)
329
+ {
330
+ case value_t::object:
331
+ {
332
+ JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end());
333
+ return &(m_it.object_iterator->second);
334
+ }
335
+
336
+ case value_t::array:
337
+ {
338
+ JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end());
339
+ return &*m_it.array_iterator;
340
+ }
341
+
342
+ case value_t::null:
343
+ case value_t::string:
344
+ case value_t::boolean:
345
+ case value_t::number_integer:
346
+ case value_t::number_unsigned:
347
+ case value_t::number_float:
348
+ case value_t::binary:
349
+ case value_t::discarded:
350
+ default:
351
+ {
352
+ if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))
353
+ {
354
+ return m_object;
355
+ }
356
+
357
+ JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
358
+ }
359
+ }
360
+ }
361
+
362
+ /*!
363
+ @brief post-increment (it++)
364
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
365
+ */
366
+ iter_impl operator++(int)& // NOLINT(cert-dcl21-cpp)
367
+ {
368
+ auto result = *this;
369
+ ++(*this);
370
+ return result;
371
+ }
372
+
373
+ /*!
374
+ @brief pre-increment (++it)
375
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
376
+ */
377
+ iter_impl& operator++()
378
+ {
379
+ JSON_ASSERT(m_object != nullptr);
380
+
381
+ switch (m_object->m_data.m_type)
382
+ {
383
+ case value_t::object:
384
+ {
385
+ std::advance(m_it.object_iterator, 1);
386
+ break;
387
+ }
388
+
389
+ case value_t::array:
390
+ {
391
+ std::advance(m_it.array_iterator, 1);
392
+ break;
393
+ }
394
+
395
+ case value_t::null:
396
+ case value_t::string:
397
+ case value_t::boolean:
398
+ case value_t::number_integer:
399
+ case value_t::number_unsigned:
400
+ case value_t::number_float:
401
+ case value_t::binary:
402
+ case value_t::discarded:
403
+ default:
404
+ {
405
+ ++m_it.primitive_iterator;
406
+ break;
407
+ }
408
+ }
409
+
410
+ return *this;
411
+ }
412
+
413
+ /*!
414
+ @brief post-decrement (it--)
415
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
416
+ */
417
+ iter_impl operator--(int)& // NOLINT(cert-dcl21-cpp)
418
+ {
419
+ auto result = *this;
420
+ --(*this);
421
+ return result;
422
+ }
423
+
424
+ /*!
425
+ @brief pre-decrement (--it)
426
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
427
+ */
428
+ iter_impl& operator--()
429
+ {
430
+ JSON_ASSERT(m_object != nullptr);
431
+
432
+ switch (m_object->m_data.m_type)
433
+ {
434
+ case value_t::object:
435
+ {
436
+ std::advance(m_it.object_iterator, -1);
437
+ break;
438
+ }
439
+
440
+ case value_t::array:
441
+ {
442
+ std::advance(m_it.array_iterator, -1);
443
+ break;
444
+ }
445
+
446
+ case value_t::null:
447
+ case value_t::string:
448
+ case value_t::boolean:
449
+ case value_t::number_integer:
450
+ case value_t::number_unsigned:
451
+ case value_t::number_float:
452
+ case value_t::binary:
453
+ case value_t::discarded:
454
+ default:
455
+ {
456
+ --m_it.primitive_iterator;
457
+ break;
458
+ }
459
+ }
460
+
461
+ return *this;
462
+ }
463
+
464
+ /*!
465
+ @brief comparison: equal
466
+ @pre (1) Both iterators are initialized to point to the same object, or (2) both iterators are value-initialized.
467
+ */
468
+ template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >
469
+ bool operator==(const IterImpl& other) const
470
+ {
471
+ // if objects are not the same, the comparison is undefined
472
+ if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
473
+ {
474
+ JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", m_object));
475
+ }
476
+
477
+ // value-initialized forward iterators can be compared, and must compare equal to other value-initialized iterators of the same type #4493
478
+ if (m_object == nullptr)
479
+ {
480
+ return true;
481
+ }
482
+
483
+ switch (m_object->m_data.m_type)
484
+ {
485
+ case value_t::object:
486
+ return (m_it.object_iterator == other.m_it.object_iterator);
487
+
488
+ case value_t::array:
489
+ return (m_it.array_iterator == other.m_it.array_iterator);
490
+
491
+ case value_t::null:
492
+ case value_t::string:
493
+ case value_t::boolean:
494
+ case value_t::number_integer:
495
+ case value_t::number_unsigned:
496
+ case value_t::number_float:
497
+ case value_t::binary:
498
+ case value_t::discarded:
499
+ default:
500
+ return (m_it.primitive_iterator == other.m_it.primitive_iterator);
501
+ }
502
+ }
503
+
504
+ /*!
505
+ @brief comparison: not equal
506
+ @pre (1) Both iterators are initialized to point to the same object, or (2) both iterators are value-initialized.
507
+ */
508
+ template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >
509
+ bool operator!=(const IterImpl& other) const
510
+ {
511
+ return !operator==(other);
512
+ }
513
+
514
+ /*!
515
+ @brief comparison: smaller
516
+ @pre (1) Both iterators are initialized to point to the same object, or (2) both iterators are value-initialized.
517
+ */
518
+ bool operator<(const iter_impl& other) const
519
+ {
520
+ // if objects are not the same, the comparison is undefined
521
+ if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
522
+ {
523
+ JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", m_object));
524
+ }
525
+
526
+ // value-initialized forward iterators can be compared, and must compare equal to other value-initialized iterators of the same type #4493
527
+ if (m_object == nullptr)
528
+ {
529
+ // the iterators are both value-initialized and are to be considered equal, but this function checks for smaller, so we return false
530
+ return false;
531
+ }
532
+
533
+ switch (m_object->m_data.m_type)
534
+ {
535
+ case value_t::object:
536
+ JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators", m_object));
537
+
538
+ case value_t::array:
539
+ return (m_it.array_iterator < other.m_it.array_iterator);
540
+
541
+ case value_t::null:
542
+ case value_t::string:
543
+ case value_t::boolean:
544
+ case value_t::number_integer:
545
+ case value_t::number_unsigned:
546
+ case value_t::number_float:
547
+ case value_t::binary:
548
+ case value_t::discarded:
549
+ default:
550
+ return (m_it.primitive_iterator < other.m_it.primitive_iterator);
551
+ }
552
+ }
553
+
554
+ /*!
555
+ @brief comparison: less than or equal
556
+ @pre (1) Both iterators are initialized to point to the same object, or (2) both iterators are value-initialized.
557
+ */
558
+ bool operator<=(const iter_impl& other) const
559
+ {
560
+ return !other.operator < (*this);
561
+ }
562
+
563
+ /*!
564
+ @brief comparison: greater than
565
+ @pre (1) Both iterators are initialized to point to the same object, or (2) both iterators are value-initialized.
566
+ */
567
+ bool operator>(const iter_impl& other) const
568
+ {
569
+ return !operator<=(other);
570
+ }
571
+
572
+ /*!
573
+ @brief comparison: greater than or equal
574
+ @pre (1) The iterator is initialized; i.e. `m_object != nullptr`, or (2) both iterators are value-initialized.
575
+ */
576
+ bool operator>=(const iter_impl& other) const
577
+ {
578
+ return !operator<(other);
579
+ }
580
+
581
+ /*!
582
+ @brief add to iterator
583
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
584
+ */
585
+ iter_impl& operator+=(difference_type i)
586
+ {
587
+ JSON_ASSERT(m_object != nullptr);
588
+
589
+ switch (m_object->m_data.m_type)
590
+ {
591
+ case value_t::object:
592
+ JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object));
593
+
594
+ case value_t::array:
595
+ {
596
+ std::advance(m_it.array_iterator, i);
597
+ break;
598
+ }
599
+
600
+ case value_t::null:
601
+ case value_t::string:
602
+ case value_t::boolean:
603
+ case value_t::number_integer:
604
+ case value_t::number_unsigned:
605
+ case value_t::number_float:
606
+ case value_t::binary:
607
+ case value_t::discarded:
608
+ default:
609
+ {
610
+ m_it.primitive_iterator += i;
611
+ break;
612
+ }
613
+ }
614
+
615
+ return *this;
616
+ }
617
+
618
+ /*!
619
+ @brief subtract from iterator
620
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
621
+ */
622
+ iter_impl& operator-=(difference_type i)
623
+ {
624
+ return operator+=(-i);
625
+ }
626
+
627
+ /*!
628
+ @brief add to iterator
629
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
630
+ */
631
+ iter_impl operator+(difference_type i) const
632
+ {
633
+ auto result = *this;
634
+ result += i;
635
+ return result;
636
+ }
637
+
638
+ /*!
639
+ @brief addition of distance and iterator
640
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
641
+ */
642
+ friend iter_impl operator+(difference_type i, const iter_impl& it)
643
+ {
644
+ auto result = it;
645
+ result += i;
646
+ return result;
647
+ }
648
+
649
+ /*!
650
+ @brief subtract from iterator
651
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
652
+ */
653
+ iter_impl operator-(difference_type i) const
654
+ {
655
+ auto result = *this;
656
+ result -= i;
657
+ return result;
658
+ }
659
+
660
+ /*!
661
+ @brief return difference
662
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
663
+ */
664
+ difference_type operator-(const iter_impl& other) const
665
+ {
666
+ JSON_ASSERT(m_object != nullptr);
667
+
668
+ switch (m_object->m_data.m_type)
669
+ {
670
+ case value_t::object:
671
+ JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object));
672
+
673
+ case value_t::array:
674
+ return m_it.array_iterator - other.m_it.array_iterator;
675
+
676
+ case value_t::null:
677
+ case value_t::string:
678
+ case value_t::boolean:
679
+ case value_t::number_integer:
680
+ case value_t::number_unsigned:
681
+ case value_t::number_float:
682
+ case value_t::binary:
683
+ case value_t::discarded:
684
+ default:
685
+ return m_it.primitive_iterator - other.m_it.primitive_iterator;
686
+ }
687
+ }
688
+
689
+ /*!
690
+ @brief access to successor
691
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
692
+ */
693
+ reference operator[](difference_type n) const
694
+ {
695
+ JSON_ASSERT(m_object != nullptr);
696
+
697
+ switch (m_object->m_data.m_type)
698
+ {
699
+ case value_t::object:
700
+ JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators", m_object));
701
+
702
+ case value_t::array:
703
+ return *std::next(m_it.array_iterator, n);
704
+
705
+ case value_t::null:
706
+ JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
707
+
708
+ case value_t::string:
709
+ case value_t::boolean:
710
+ case value_t::number_integer:
711
+ case value_t::number_unsigned:
712
+ case value_t::number_float:
713
+ case value_t::binary:
714
+ case value_t::discarded:
715
+ default:
716
+ {
717
+ if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n))
718
+ {
719
+ return *m_object;
720
+ }
721
+
722
+ JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
723
+ }
724
+ }
725
+ }
726
+
727
+ /*!
728
+ @brief return the key of an object iterator
729
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
730
+ */
731
+ const typename object_t::key_type& key() const
732
+ {
733
+ JSON_ASSERT(m_object != nullptr);
734
+
735
+ if (JSON_HEDLEY_LIKELY(m_object->is_object()))
736
+ {
737
+ return m_it.object_iterator->first;
738
+ }
739
+
740
+ JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators", m_object));
741
+ }
742
+
743
+ /*!
744
+ @brief return the value of an iterator
745
+ @pre The iterator is initialized; i.e. `m_object != nullptr`.
746
+ */
747
+ reference value() const
748
+ {
749
+ return operator*();
750
+ }
751
+
752
+ JSON_PRIVATE_UNLESS_TESTED:
753
+ /// associated JSON instance
754
+ pointer m_object = nullptr;
755
+ /// the actual iterator of the associated instance
756
+ internal_iterator<typename std::remove_const<BasicJsonType>::type> m_it {};
757
+ };
758
+
759
+ } // namespace detail
760
+ NLOHMANN_JSON_NAMESPACE_END