mqt-core 3.3.2__cp313-cp313t-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.cp313t-win_amd64.pyd +0 -0
  21. mqt/core/dd.pyi +1016 -0
  22. mqt/core/dd_evaluation.py +368 -0
  23. mqt/core/fomac.cp313t-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.cp313t-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.cp313t-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,795 @@
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 <limits> // numeric_limits
12
+ #include <string> // char_traits
13
+ #include <tuple> // tuple
14
+ #include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type
15
+ #include <utility> // declval
16
+
17
+ #include <nlohmann/detail/iterators/iterator_traits.hpp>
18
+ #include <nlohmann/detail/macro_scope.hpp>
19
+ #include <nlohmann/detail/meta/call_std/begin.hpp>
20
+ #include <nlohmann/detail/meta/call_std/end.hpp>
21
+ #include <nlohmann/detail/meta/cpp_future.hpp>
22
+ #include <nlohmann/detail/meta/detected.hpp>
23
+ #include <nlohmann/json_fwd.hpp>
24
+
25
+ NLOHMANN_JSON_NAMESPACE_BEGIN
26
+ /*!
27
+ @brief detail namespace with internal helper functions
28
+
29
+ This namespace collects functions that should not be exposed,
30
+ implementations of some @ref basic_json methods, and meta-programming helpers.
31
+
32
+ @since version 2.1.0
33
+ */
34
+ namespace detail
35
+ {
36
+
37
+ /////////////
38
+ // helpers //
39
+ /////////////
40
+
41
+ // Note to maintainers:
42
+ //
43
+ // Every trait in this file expects a non CV-qualified type.
44
+ // The only exceptions are in the 'aliases for detected' section
45
+ // (i.e. those of the form: decltype(T::member_function(std::declval<T>())))
46
+ //
47
+ // In this case, T has to be properly CV-qualified to constraint the function arguments
48
+ // (e.g. to_json(BasicJsonType&, const T&))
49
+
50
+ template<typename> struct is_basic_json : std::false_type {};
51
+
52
+ NLOHMANN_BASIC_JSON_TPL_DECLARATION
53
+ struct is_basic_json<NLOHMANN_BASIC_JSON_TPL> : std::true_type {};
54
+
55
+ // used by exceptions create() member functions
56
+ // true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t
57
+ // false_type otherwise
58
+ template<typename BasicJsonContext>
59
+ struct is_basic_json_context :
60
+ std::integral_constant < bool,
61
+ is_basic_json<typename std::remove_cv<typename std::remove_pointer<BasicJsonContext>::type>::type>::value
62
+ || std::is_same<BasicJsonContext, std::nullptr_t>::value >
63
+ {};
64
+
65
+ //////////////////////
66
+ // json_ref helpers //
67
+ //////////////////////
68
+
69
+ template<typename>
70
+ class json_ref;
71
+
72
+ template<typename>
73
+ struct is_json_ref : std::false_type {};
74
+
75
+ template<typename T>
76
+ struct is_json_ref<json_ref<T>> : std::true_type {};
77
+
78
+ //////////////////////////
79
+ // aliases for detected //
80
+ //////////////////////////
81
+
82
+ template<typename T>
83
+ using mapped_type_t = typename T::mapped_type;
84
+
85
+ template<typename T>
86
+ using key_type_t = typename T::key_type;
87
+
88
+ template<typename T>
89
+ using value_type_t = typename T::value_type;
90
+
91
+ template<typename T>
92
+ using difference_type_t = typename T::difference_type;
93
+
94
+ template<typename T>
95
+ using pointer_t = typename T::pointer;
96
+
97
+ template<typename T>
98
+ using reference_t = typename T::reference;
99
+
100
+ template<typename T>
101
+ using iterator_category_t = typename T::iterator_category;
102
+
103
+ template<typename T, typename... Args>
104
+ using to_json_function = decltype(T::to_json(std::declval<Args>()...));
105
+
106
+ template<typename T, typename... Args>
107
+ using from_json_function = decltype(T::from_json(std::declval<Args>()...));
108
+
109
+ template<typename T, typename U>
110
+ using get_template_function = decltype(std::declval<T>().template get<U>());
111
+
112
+ // trait checking if JSONSerializer<T>::from_json(json const&, udt&) exists
113
+ template<typename BasicJsonType, typename T, typename = void>
114
+ struct has_from_json : std::false_type {};
115
+
116
+ // trait checking if j.get<T> is valid
117
+ // use this trait instead of std::is_constructible or std::is_convertible,
118
+ // both rely on, or make use of implicit conversions, and thus fail when T
119
+ // has several constructors/operator= (see https://github.com/nlohmann/json/issues/958)
120
+ template <typename BasicJsonType, typename T>
121
+ struct is_getable
122
+ {
123
+ static constexpr bool value = is_detected<get_template_function, const BasicJsonType&, T>::value;
124
+ };
125
+
126
+ template<typename BasicJsonType, typename T>
127
+ struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>
128
+ {
129
+ using serializer = typename BasicJsonType::template json_serializer<T, void>;
130
+
131
+ static constexpr bool value =
132
+ is_detected_exact<void, from_json_function, serializer,
133
+ const BasicJsonType&, T&>::value;
134
+ };
135
+
136
+ // This trait checks if JSONSerializer<T>::from_json(json const&) exists
137
+ // this overload is used for non-default-constructible user-defined-types
138
+ template<typename BasicJsonType, typename T, typename = void>
139
+ struct has_non_default_from_json : std::false_type {};
140
+
141
+ template<typename BasicJsonType, typename T>
142
+ struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>
143
+ {
144
+ using serializer = typename BasicJsonType::template json_serializer<T, void>;
145
+
146
+ static constexpr bool value =
147
+ is_detected_exact<T, from_json_function, serializer,
148
+ const BasicJsonType&>::value;
149
+ };
150
+
151
+ // This trait checks if BasicJsonType::json_serializer<T>::to_json exists
152
+ // Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion.
153
+ template<typename BasicJsonType, typename T, typename = void>
154
+ struct has_to_json : std::false_type {};
155
+
156
+ template<typename BasicJsonType, typename T>
157
+ struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>
158
+ {
159
+ using serializer = typename BasicJsonType::template json_serializer<T, void>;
160
+
161
+ static constexpr bool value =
162
+ is_detected_exact<void, to_json_function, serializer, BasicJsonType&,
163
+ T>::value;
164
+ };
165
+
166
+ template<typename T>
167
+ using detect_key_compare = typename T::key_compare;
168
+
169
+ template<typename T>
170
+ struct has_key_compare : std::integral_constant<bool, is_detected<detect_key_compare, T>::value> {};
171
+
172
+ // obtains the actual object key comparator
173
+ template<typename BasicJsonType>
174
+ struct actual_object_comparator
175
+ {
176
+ using object_t = typename BasicJsonType::object_t;
177
+ using object_comparator_t = typename BasicJsonType::default_object_comparator_t;
178
+ using type = typename std::conditional < has_key_compare<object_t>::value,
179
+ typename object_t::key_compare, object_comparator_t>::type;
180
+ };
181
+
182
+ template<typename BasicJsonType>
183
+ using actual_object_comparator_t = typename actual_object_comparator<BasicJsonType>::type;
184
+
185
+ /////////////////
186
+ // char_traits //
187
+ /////////////////
188
+
189
+ // Primary template of char_traits calls std char_traits
190
+ template<typename T>
191
+ struct char_traits : std::char_traits<T>
192
+ {};
193
+
194
+ // Explicitly define char traits for unsigned char since it is not standard
195
+ template<>
196
+ struct char_traits<unsigned char> : std::char_traits<char>
197
+ {
198
+ using char_type = unsigned char;
199
+ using int_type = uint64_t;
200
+
201
+ // Redefine to_int_type function
202
+ static int_type to_int_type(char_type c) noexcept
203
+ {
204
+ return static_cast<int_type>(c);
205
+ }
206
+
207
+ static char_type to_char_type(int_type i) noexcept
208
+ {
209
+ return static_cast<char_type>(i);
210
+ }
211
+
212
+ static constexpr int_type eof() noexcept
213
+ {
214
+ return static_cast<int_type>(std::char_traits<char>::eof());
215
+ }
216
+ };
217
+
218
+ // Explicitly define char traits for signed char since it is not standard
219
+ template<>
220
+ struct char_traits<signed char> : std::char_traits<char>
221
+ {
222
+ using char_type = signed char;
223
+ using int_type = uint64_t;
224
+
225
+ // Redefine to_int_type function
226
+ static int_type to_int_type(char_type c) noexcept
227
+ {
228
+ return static_cast<int_type>(c);
229
+ }
230
+
231
+ static char_type to_char_type(int_type i) noexcept
232
+ {
233
+ return static_cast<char_type>(i);
234
+ }
235
+
236
+ static constexpr int_type eof() noexcept
237
+ {
238
+ return static_cast<int_type>(std::char_traits<char>::eof());
239
+ }
240
+ };
241
+
242
+ ///////////////////
243
+ // is_ functions //
244
+ ///////////////////
245
+
246
+ // https://en.cppreference.com/w/cpp/types/conjunction
247
+ template<class...> struct conjunction : std::true_type { };
248
+ template<class B> struct conjunction<B> : B { };
249
+ template<class B, class... Bn>
250
+ struct conjunction<B, Bn...>
251
+ : std::conditional<static_cast<bool>(B::value), conjunction<Bn...>, B>::type {};
252
+
253
+ // https://en.cppreference.com/w/cpp/types/negation
254
+ template<class B> struct negation : std::integral_constant < bool, !B::value > { };
255
+
256
+ // Reimplementation of is_constructible and is_default_constructible, due to them being broken for
257
+ // std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367).
258
+ // This causes compile errors in e.g. clang 3.5 or gcc 4.9.
259
+ template <typename T>
260
+ struct is_default_constructible : std::is_default_constructible<T> {};
261
+
262
+ template <typename T1, typename T2>
263
+ struct is_default_constructible<std::pair<T1, T2>>
264
+ : conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};
265
+
266
+ template <typename T1, typename T2>
267
+ struct is_default_constructible<const std::pair<T1, T2>>
268
+ : conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};
269
+
270
+ template <typename... Ts>
271
+ struct is_default_constructible<std::tuple<Ts...>>
272
+ : conjunction<is_default_constructible<Ts>...> {};
273
+
274
+ template <typename... Ts>
275
+ struct is_default_constructible<const std::tuple<Ts...>>
276
+ : conjunction<is_default_constructible<Ts>...> {};
277
+
278
+ template <typename T, typename... Args>
279
+ struct is_constructible : std::is_constructible<T, Args...> {};
280
+
281
+ template <typename T1, typename T2>
282
+ struct is_constructible<std::pair<T1, T2>> : is_default_constructible<std::pair<T1, T2>> {};
283
+
284
+ template <typename T1, typename T2>
285
+ struct is_constructible<const std::pair<T1, T2>> : is_default_constructible<const std::pair<T1, T2>> {};
286
+
287
+ template <typename... Ts>
288
+ struct is_constructible<std::tuple<Ts...>> : is_default_constructible<std::tuple<Ts...>> {};
289
+
290
+ template <typename... Ts>
291
+ struct is_constructible<const std::tuple<Ts...>> : is_default_constructible<const std::tuple<Ts...>> {};
292
+
293
+ template<typename T, typename = void>
294
+ struct is_iterator_traits : std::false_type {};
295
+
296
+ template<typename T>
297
+ struct is_iterator_traits<iterator_traits<T>>
298
+ {
299
+ private:
300
+ using traits = iterator_traits<T>;
301
+
302
+ public:
303
+ static constexpr auto value =
304
+ is_detected<value_type_t, traits>::value &&
305
+ is_detected<difference_type_t, traits>::value &&
306
+ is_detected<pointer_t, traits>::value &&
307
+ is_detected<iterator_category_t, traits>::value &&
308
+ is_detected<reference_t, traits>::value;
309
+ };
310
+
311
+ template<typename T>
312
+ struct is_range
313
+ {
314
+ private:
315
+ using t_ref = typename std::add_lvalue_reference<T>::type;
316
+
317
+ using iterator = detected_t<result_of_begin, t_ref>;
318
+ using sentinel = detected_t<result_of_end, t_ref>;
319
+
320
+ // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator
321
+ // and https://en.cppreference.com/w/cpp/iterator/sentinel_for
322
+ // but reimplementing these would be too much work, as a lot of other concepts are used underneath
323
+ static constexpr auto is_iterator_begin =
324
+ is_iterator_traits<iterator_traits<iterator>>::value;
325
+
326
+ public:
327
+ static constexpr bool value = !std::is_same<iterator, nonesuch>::value && !std::is_same<sentinel, nonesuch>::value && is_iterator_begin;
328
+ };
329
+
330
+ template<typename R>
331
+ using iterator_t = enable_if_t<is_range<R>::value, result_of_begin<decltype(std::declval<R&>())>>;
332
+
333
+ template<typename T>
334
+ using range_value_t = value_type_t<iterator_traits<iterator_t<T>>>;
335
+
336
+ // The following implementation of is_complete_type is taken from
337
+ // https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/
338
+ // and is written by Xiang Fan who agreed to using it in this library.
339
+
340
+ template<typename T, typename = void>
341
+ struct is_complete_type : std::false_type {};
342
+
343
+ template<typename T>
344
+ struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_type {};
345
+
346
+ template<typename BasicJsonType, typename CompatibleObjectType,
347
+ typename = void>
348
+ struct is_compatible_object_type_impl : std::false_type {};
349
+
350
+ template<typename BasicJsonType, typename CompatibleObjectType>
351
+ struct is_compatible_object_type_impl <
352
+ BasicJsonType, CompatibleObjectType,
353
+ enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&&
354
+ is_detected<key_type_t, CompatibleObjectType>::value >>
355
+ {
356
+ using object_t = typename BasicJsonType::object_t;
357
+
358
+ // macOS's is_constructible does not play well with nonesuch...
359
+ static constexpr bool value =
360
+ is_constructible<typename object_t::key_type,
361
+ typename CompatibleObjectType::key_type>::value &&
362
+ is_constructible<typename object_t::mapped_type,
363
+ typename CompatibleObjectType::mapped_type>::value;
364
+ };
365
+
366
+ template<typename BasicJsonType, typename CompatibleObjectType>
367
+ struct is_compatible_object_type
368
+ : is_compatible_object_type_impl<BasicJsonType, CompatibleObjectType> {};
369
+
370
+ template<typename BasicJsonType, typename ConstructibleObjectType,
371
+ typename = void>
372
+ struct is_constructible_object_type_impl : std::false_type {};
373
+
374
+ template<typename BasicJsonType, typename ConstructibleObjectType>
375
+ struct is_constructible_object_type_impl <
376
+ BasicJsonType, ConstructibleObjectType,
377
+ enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&&
378
+ is_detected<key_type_t, ConstructibleObjectType>::value >>
379
+ {
380
+ using object_t = typename BasicJsonType::object_t;
381
+
382
+ static constexpr bool value =
383
+ (is_default_constructible<ConstructibleObjectType>::value &&
384
+ (std::is_move_assignable<ConstructibleObjectType>::value ||
385
+ std::is_copy_assignable<ConstructibleObjectType>::value) &&
386
+ (is_constructible<typename ConstructibleObjectType::key_type,
387
+ typename object_t::key_type>::value &&
388
+ std::is_same <
389
+ typename object_t::mapped_type,
390
+ typename ConstructibleObjectType::mapped_type >::value)) ||
391
+ (has_from_json<BasicJsonType,
392
+ typename ConstructibleObjectType::mapped_type>::value ||
393
+ has_non_default_from_json <
394
+ BasicJsonType,
395
+ typename ConstructibleObjectType::mapped_type >::value);
396
+ };
397
+
398
+ template<typename BasicJsonType, typename ConstructibleObjectType>
399
+ struct is_constructible_object_type
400
+ : is_constructible_object_type_impl<BasicJsonType,
401
+ ConstructibleObjectType> {};
402
+
403
+ template<typename BasicJsonType, typename CompatibleStringType>
404
+ struct is_compatible_string_type
405
+ {
406
+ static constexpr auto value =
407
+ is_constructible<typename BasicJsonType::string_t, CompatibleStringType>::value;
408
+ };
409
+
410
+ template<typename BasicJsonType, typename ConstructibleStringType>
411
+ struct is_constructible_string_type
412
+ {
413
+ // launder type through decltype() to fix compilation failure on ICPC
414
+ #ifdef __INTEL_COMPILER
415
+ using laundered_type = decltype(std::declval<ConstructibleStringType>());
416
+ #else
417
+ using laundered_type = ConstructibleStringType;
418
+ #endif
419
+
420
+ static constexpr auto value =
421
+ conjunction <
422
+ is_constructible<laundered_type, typename BasicJsonType::string_t>,
423
+ is_detected_exact<typename BasicJsonType::string_t::value_type,
424
+ value_type_t, laundered_type >>::value;
425
+ };
426
+
427
+ template<typename BasicJsonType, typename CompatibleArrayType, typename = void>
428
+ struct is_compatible_array_type_impl : std::false_type {};
429
+
430
+ template<typename BasicJsonType, typename CompatibleArrayType>
431
+ struct is_compatible_array_type_impl <
432
+ BasicJsonType, CompatibleArrayType,
433
+ enable_if_t <
434
+ is_detected<iterator_t, CompatibleArrayType>::value&&
435
+ is_iterator_traits<iterator_traits<detected_t<iterator_t, CompatibleArrayType>>>::value&&
436
+ // special case for types like std::filesystem::path whose iterator's value_type are themselves
437
+ // c.f. https://github.com/nlohmann/json/pull/3073
438
+ !std::is_same<CompatibleArrayType, detected_t<range_value_t, CompatibleArrayType>>::value >>
439
+ {
440
+ static constexpr bool value =
441
+ is_constructible<BasicJsonType,
442
+ range_value_t<CompatibleArrayType>>::value;
443
+ };
444
+
445
+ template<typename BasicJsonType, typename CompatibleArrayType>
446
+ struct is_compatible_array_type
447
+ : is_compatible_array_type_impl<BasicJsonType, CompatibleArrayType> {};
448
+
449
+ template<typename BasicJsonType, typename ConstructibleArrayType, typename = void>
450
+ struct is_constructible_array_type_impl : std::false_type {};
451
+
452
+ template<typename BasicJsonType, typename ConstructibleArrayType>
453
+ struct is_constructible_array_type_impl <
454
+ BasicJsonType, ConstructibleArrayType,
455
+ enable_if_t<std::is_same<ConstructibleArrayType,
456
+ typename BasicJsonType::value_type>::value >>
457
+ : std::true_type {};
458
+
459
+ template<typename BasicJsonType, typename ConstructibleArrayType>
460
+ struct is_constructible_array_type_impl <
461
+ BasicJsonType, ConstructibleArrayType,
462
+ enable_if_t < !std::is_same<ConstructibleArrayType,
463
+ typename BasicJsonType::value_type>::value&&
464
+ !is_compatible_string_type<BasicJsonType, ConstructibleArrayType>::value&&
465
+ is_default_constructible<ConstructibleArrayType>::value&&
466
+ (std::is_move_assignable<ConstructibleArrayType>::value ||
467
+ std::is_copy_assignable<ConstructibleArrayType>::value)&&
468
+ is_detected<iterator_t, ConstructibleArrayType>::value&&
469
+ is_iterator_traits<iterator_traits<detected_t<iterator_t, ConstructibleArrayType>>>::value&&
470
+ is_detected<range_value_t, ConstructibleArrayType>::value&&
471
+ // special case for types like std::filesystem::path whose iterator's value_type are themselves
472
+ // c.f. https://github.com/nlohmann/json/pull/3073
473
+ !std::is_same<ConstructibleArrayType, detected_t<range_value_t, ConstructibleArrayType>>::value&&
474
+ is_complete_type <
475
+ detected_t<range_value_t, ConstructibleArrayType >>::value >>
476
+ {
477
+ using value_type = range_value_t<ConstructibleArrayType>;
478
+
479
+ static constexpr bool value =
480
+ std::is_same<value_type,
481
+ typename BasicJsonType::array_t::value_type>::value ||
482
+ has_from_json<BasicJsonType,
483
+ value_type>::value ||
484
+ has_non_default_from_json <
485
+ BasicJsonType,
486
+ value_type >::value;
487
+ };
488
+
489
+ template<typename BasicJsonType, typename ConstructibleArrayType>
490
+ struct is_constructible_array_type
491
+ : is_constructible_array_type_impl<BasicJsonType, ConstructibleArrayType> {};
492
+
493
+ template<typename RealIntegerType, typename CompatibleNumberIntegerType,
494
+ typename = void>
495
+ struct is_compatible_integer_type_impl : std::false_type {};
496
+
497
+ template<typename RealIntegerType, typename CompatibleNumberIntegerType>
498
+ struct is_compatible_integer_type_impl <
499
+ RealIntegerType, CompatibleNumberIntegerType,
500
+ enable_if_t < std::is_integral<RealIntegerType>::value&&
501
+ std::is_integral<CompatibleNumberIntegerType>::value&&
502
+ !std::is_same<bool, CompatibleNumberIntegerType>::value >>
503
+ {
504
+ // is there an assert somewhere on overflows?
505
+ using RealLimits = std::numeric_limits<RealIntegerType>;
506
+ using CompatibleLimits = std::numeric_limits<CompatibleNumberIntegerType>;
507
+
508
+ static constexpr auto value =
509
+ is_constructible<RealIntegerType,
510
+ CompatibleNumberIntegerType>::value &&
511
+ CompatibleLimits::is_integer &&
512
+ RealLimits::is_signed == CompatibleLimits::is_signed;
513
+ };
514
+
515
+ template<typename RealIntegerType, typename CompatibleNumberIntegerType>
516
+ struct is_compatible_integer_type
517
+ : is_compatible_integer_type_impl<RealIntegerType,
518
+ CompatibleNumberIntegerType> {};
519
+
520
+ template<typename BasicJsonType, typename CompatibleType, typename = void>
521
+ struct is_compatible_type_impl: std::false_type {};
522
+
523
+ template<typename BasicJsonType, typename CompatibleType>
524
+ struct is_compatible_type_impl <
525
+ BasicJsonType, CompatibleType,
526
+ enable_if_t<is_complete_type<CompatibleType>::value >>
527
+ {
528
+ static constexpr bool value =
529
+ has_to_json<BasicJsonType, CompatibleType>::value;
530
+ };
531
+
532
+ template<typename BasicJsonType, typename CompatibleType>
533
+ struct is_compatible_type
534
+ : is_compatible_type_impl<BasicJsonType, CompatibleType> {};
535
+
536
+ template<typename T1, typename T2>
537
+ struct is_constructible_tuple : std::false_type {};
538
+
539
+ template<typename T1, typename... Args>
540
+ struct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<is_constructible<T1, Args>...> {};
541
+
542
+ template<typename BasicJsonType, typename T>
543
+ struct is_json_iterator_of : std::false_type {};
544
+
545
+ template<typename BasicJsonType>
546
+ struct is_json_iterator_of<BasicJsonType, typename BasicJsonType::iterator> : std::true_type {};
547
+
548
+ template<typename BasicJsonType>
549
+ struct is_json_iterator_of<BasicJsonType, typename BasicJsonType::const_iterator> : std::true_type
550
+ {};
551
+
552
+ // checks if a given type T is a template specialization of Primary
553
+ template<template <typename...> class Primary, typename T>
554
+ struct is_specialization_of : std::false_type {};
555
+
556
+ template<template <typename...> class Primary, typename... Args>
557
+ struct is_specialization_of<Primary, Primary<Args...>> : std::true_type {};
558
+
559
+ template<typename T>
560
+ using is_json_pointer = is_specialization_of<::nlohmann::json_pointer, uncvref_t<T>>;
561
+
562
+ // checks if A and B are comparable using Compare functor
563
+ template<typename Compare, typename A, typename B, typename = void>
564
+ struct is_comparable : std::false_type {};
565
+
566
+ template<typename Compare, typename A, typename B>
567
+ struct is_comparable<Compare, A, B, void_t<
568
+ decltype(std::declval<Compare>()(std::declval<A>(), std::declval<B>())),
569
+ decltype(std::declval<Compare>()(std::declval<B>(), std::declval<A>()))
570
+ >> : std::true_type {};
571
+
572
+ template<typename T>
573
+ using detect_is_transparent = typename T::is_transparent;
574
+
575
+ // type trait to check if KeyType can be used as object key (without a BasicJsonType)
576
+ // see is_usable_as_basic_json_key_type below
577
+ template<typename Comparator, typename ObjectKeyType, typename KeyTypeCVRef, bool RequireTransparentComparator = true,
578
+ bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>>
579
+ using is_usable_as_key_type = typename std::conditional <
580
+ is_comparable<Comparator, ObjectKeyType, KeyTypeCVRef>::value
581
+ && !(ExcludeObjectKeyType && std::is_same<KeyType,
582
+ ObjectKeyType>::value)
583
+ && (!RequireTransparentComparator
584
+ || is_detected <detect_is_transparent, Comparator>::value)
585
+ && !is_json_pointer<KeyType>::value,
586
+ std::true_type,
587
+ std::false_type >::type;
588
+
589
+ // type trait to check if KeyType can be used as object key
590
+ // true if:
591
+ // - KeyType is comparable with BasicJsonType::object_t::key_type
592
+ // - if ExcludeObjectKeyType is true, KeyType is not BasicJsonType::object_t::key_type
593
+ // - the comparator is transparent or RequireTransparentComparator is false
594
+ // - KeyType is not a JSON iterator or json_pointer
595
+ template<typename BasicJsonType, typename KeyTypeCVRef, bool RequireTransparentComparator = true,
596
+ bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>>
597
+ using is_usable_as_basic_json_key_type = typename std::conditional <
598
+ is_usable_as_key_type<typename BasicJsonType::object_comparator_t,
599
+ typename BasicJsonType::object_t::key_type, KeyTypeCVRef,
600
+ RequireTransparentComparator, ExcludeObjectKeyType>::value
601
+ && !is_json_iterator_of<BasicJsonType, KeyType>::value,
602
+ std::true_type,
603
+ std::false_type >::type;
604
+
605
+ template<typename ObjectType, typename KeyType>
606
+ using detect_erase_with_key_type = decltype(std::declval<ObjectType&>().erase(std::declval<KeyType>()));
607
+
608
+ // type trait to check if object_t has an erase() member functions accepting KeyType
609
+ template<typename BasicJsonType, typename KeyType>
610
+ using has_erase_with_key_type = typename std::conditional <
611
+ is_detected <
612
+ detect_erase_with_key_type,
613
+ typename BasicJsonType::object_t, KeyType >::value,
614
+ std::true_type,
615
+ std::false_type >::type;
616
+
617
+ // a naive helper to check if a type is an ordered_map (exploits the fact that
618
+ // ordered_map inherits capacity() from std::vector)
619
+ template <typename T>
620
+ struct is_ordered_map
621
+ {
622
+ using one = char;
623
+
624
+ struct two
625
+ {
626
+ char x[2]; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
627
+ };
628
+
629
+ template <typename C> static one test( decltype(&C::capacity) ) ;
630
+ template <typename C> static two test(...);
631
+
632
+ enum { value = sizeof(test<T>(nullptr)) == sizeof(char) }; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
633
+ };
634
+
635
+ // to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324)
636
+ template < typename T, typename U, enable_if_t < !std::is_same<T, U>::value, int > = 0 >
637
+ T conditional_static_cast(U value)
638
+ {
639
+ return static_cast<T>(value);
640
+ }
641
+
642
+ template<typename T, typename U, enable_if_t<std::is_same<T, U>::value, int> = 0>
643
+ T conditional_static_cast(U value)
644
+ {
645
+ return value;
646
+ }
647
+
648
+ template<typename... Types>
649
+ using all_integral = conjunction<std::is_integral<Types>...>;
650
+
651
+ template<typename... Types>
652
+ using all_signed = conjunction<std::is_signed<Types>...>;
653
+
654
+ template<typename... Types>
655
+ using all_unsigned = conjunction<std::is_unsigned<Types>...>;
656
+
657
+ // there's a disjunction trait in another PR; replace when merged
658
+ template<typename... Types>
659
+ using same_sign = std::integral_constant < bool,
660
+ all_signed<Types...>::value || all_unsigned<Types...>::value >;
661
+
662
+ template<typename OfType, typename T>
663
+ using never_out_of_range = std::integral_constant < bool,
664
+ (std::is_signed<OfType>::value && (sizeof(T) < sizeof(OfType)))
665
+ || (same_sign<OfType, T>::value && sizeof(OfType) == sizeof(T)) >;
666
+
667
+ template<typename OfType, typename T,
668
+ bool OfTypeSigned = std::is_signed<OfType>::value,
669
+ bool TSigned = std::is_signed<T>::value>
670
+ struct value_in_range_of_impl2;
671
+
672
+ template<typename OfType, typename T>
673
+ struct value_in_range_of_impl2<OfType, T, false, false>
674
+ {
675
+ static constexpr bool test(T val)
676
+ {
677
+ using CommonType = typename std::common_type<OfType, T>::type;
678
+ return static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());
679
+ }
680
+ };
681
+
682
+ template<typename OfType, typename T>
683
+ struct value_in_range_of_impl2<OfType, T, true, false>
684
+ {
685
+ static constexpr bool test(T val)
686
+ {
687
+ using CommonType = typename std::common_type<OfType, T>::type;
688
+ return static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());
689
+ }
690
+ };
691
+
692
+ template<typename OfType, typename T>
693
+ struct value_in_range_of_impl2<OfType, T, false, true>
694
+ {
695
+ static constexpr bool test(T val)
696
+ {
697
+ using CommonType = typename std::common_type<OfType, T>::type;
698
+ return val >= 0 && static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());
699
+ }
700
+ };
701
+
702
+ template<typename OfType, typename T>
703
+ struct value_in_range_of_impl2<OfType, T, true, true>
704
+ {
705
+ static constexpr bool test(T val)
706
+ {
707
+ using CommonType = typename std::common_type<OfType, T>::type;
708
+ return static_cast<CommonType>(val) >= static_cast<CommonType>((std::numeric_limits<OfType>::min)())
709
+ && static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());
710
+ }
711
+ };
712
+
713
+ template<typename OfType, typename T,
714
+ bool NeverOutOfRange = never_out_of_range<OfType, T>::value,
715
+ typename = detail::enable_if_t<all_integral<OfType, T>::value>>
716
+ struct value_in_range_of_impl1;
717
+
718
+ template<typename OfType, typename T>
719
+ struct value_in_range_of_impl1<OfType, T, false>
720
+ {
721
+ static constexpr bool test(T val)
722
+ {
723
+ return value_in_range_of_impl2<OfType, T>::test(val);
724
+ }
725
+ };
726
+
727
+ template<typename OfType, typename T>
728
+ struct value_in_range_of_impl1<OfType, T, true>
729
+ {
730
+ static constexpr bool test(T /*val*/)
731
+ {
732
+ return true;
733
+ }
734
+ };
735
+
736
+ template<typename OfType, typename T>
737
+ constexpr bool value_in_range_of(T val)
738
+ {
739
+ return value_in_range_of_impl1<OfType, T>::test(val);
740
+ }
741
+
742
+ template<bool Value>
743
+ using bool_constant = std::integral_constant<bool, Value>;
744
+
745
+ ///////////////////////////////////////////////////////////////////////////////
746
+ // is_c_string
747
+ ///////////////////////////////////////////////////////////////////////////////
748
+
749
+ namespace impl
750
+ {
751
+
752
+ template<typename T>
753
+ constexpr bool is_c_string()
754
+ {
755
+ using TUnExt = typename std::remove_extent<T>::type;
756
+ using TUnCVExt = typename std::remove_cv<TUnExt>::type;
757
+ using TUnPtr = typename std::remove_pointer<T>::type;
758
+ using TUnCVPtr = typename std::remove_cv<TUnPtr>::type;
759
+ return
760
+ (std::is_array<T>::value && std::is_same<TUnCVExt, char>::value)
761
+ || (std::is_pointer<T>::value && std::is_same<TUnCVPtr, char>::value);
762
+ }
763
+
764
+ } // namespace impl
765
+
766
+ // checks whether T is a [cv] char */[cv] char[] C string
767
+ template<typename T>
768
+ struct is_c_string : bool_constant<impl::is_c_string<T>()> {};
769
+
770
+ template<typename T>
771
+ using is_c_string_uncvref = is_c_string<uncvref_t<T>>;
772
+
773
+ ///////////////////////////////////////////////////////////////////////////////
774
+ // is_transparent
775
+ ///////////////////////////////////////////////////////////////////////////////
776
+
777
+ namespace impl
778
+ {
779
+
780
+ template<typename T>
781
+ constexpr bool is_transparent()
782
+ {
783
+ return is_detected<detect_is_transparent, T>::value;
784
+ }
785
+
786
+ } // namespace impl
787
+
788
+ // checks whether T has a member named is_transparent
789
+ template<typename T>
790
+ struct is_transparent : bool_constant<impl::is_transparent<T>()> {};
791
+
792
+ ///////////////////////////////////////////////////////////////////////////////
793
+
794
+ } // namespace detail
795
+ NLOHMANN_JSON_NAMESPACE_END