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.
- mqt/core/__init__.py +89 -0
- mqt/core/__main__.py +55 -0
- mqt/core/_commands.py +52 -0
- mqt/core/_compat/__init__.py +11 -0
- mqt/core/_compat/typing.py +29 -0
- mqt/core/_version.py +34 -0
- mqt/core/_version.pyi +12 -0
- mqt/core/bin/mqt-core-algorithms.dll +0 -0
- mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
- mqt/core/bin/mqt-core-dd.dll +0 -0
- mqt/core/bin/mqt-core-ds.dll +0 -0
- mqt/core/bin/mqt-core-fomac.dll +0 -0
- mqt/core/bin/mqt-core-ir.dll +0 -0
- mqt/core/bin/mqt-core-na-fomac.dll +0 -0
- mqt/core/bin/mqt-core-na.dll +0 -0
- mqt/core/bin/mqt-core-qasm.dll +0 -0
- mqt/core/bin/mqt-core-qdmi-driver.dll +0 -0
- mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
- mqt/core/bin/mqt-core-zx.dll +0 -0
- mqt/core/dd.cp313t-win_amd64.pyd +0 -0
- mqt/core/dd.pyi +1016 -0
- mqt/core/dd_evaluation.py +368 -0
- mqt/core/fomac.cp313t-win_amd64.pyd +0 -0
- mqt/core/fomac.pyi +125 -0
- mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
- mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
- mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
- mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
- mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
- mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
- mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
- mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
- mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
- mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
- mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
- mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
- mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
- mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
- mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
- mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
- mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
- mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
- mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
- mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
- mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
- mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
- mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
- mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
- mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
- mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
- mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
- mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
- mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
- mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
- mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
- mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
- mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
- mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
- mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
- mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
- mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
- mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
- mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
- mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
- mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
- mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
- mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
- mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
- mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
- mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
- mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
- mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
- mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
- mqt/core/include/mqt-core/boost/config.hpp +67 -0
- mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
- mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
- mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
- mqt/core/include/mqt-core/boost/limits.hpp +146 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
- mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
- mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
- mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
- mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
- mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
- mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
- mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
- mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
- mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
- mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
- mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
- mqt/core/include/mqt-core/boost/version.hpp +32 -0
- mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
- mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
- mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
- mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
- mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
- mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
- mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
- mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
- mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
- mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
- mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
- mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
- mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
- mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
- mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
- mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
- mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
- mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
- mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
- mqt/core/include/mqt-core/dd/Export.hpp +438 -0
- mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
- mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
- mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
- mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
- mqt/core/include/mqt-core/dd/Node.hpp +223 -0
- mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
- mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
- mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
- mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
- mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
- mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
- mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
- mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
- mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
- mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
- mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
- mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
- mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
- mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
- mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
- mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
- mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
- mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
- mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
- mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
- mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
- mqt/core/include/mqt-core/ir/Register.hpp +125 -0
- mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
- mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
- mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
- mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
- mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
- mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
- mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
- mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
- mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
- mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
- mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
- mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
- mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
- mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
- mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
- mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
- mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
- mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
- mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
- mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
- mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
- mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
- mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
- mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
- mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
- mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
- mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
- mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
- mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
- mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
- mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
- mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
- mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
- mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
- mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
- mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
- mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
- mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
- mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
- mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
- mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
- mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
- mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
- mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
- mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
- mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
- mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
- mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
- mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
- mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
- mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
- mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
- mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
- mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
- mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
- mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
- mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
- mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
- mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
- mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
- mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
- mqt/core/include/nlohmann/detail/hash.hpp +129 -0
- mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
- mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
- mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
- mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
- mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
- mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
- mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
- mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
- mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
- mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
- mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
- mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
- mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
- mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
- mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
- mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
- mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
- mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
- mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
- mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
- mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
- mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
- mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
- mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
- mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
- mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
- mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
- mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
- mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
- mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
- mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
- mqt/core/include/nlohmann/json.hpp +5306 -0
- mqt/core/include/nlohmann/json_fwd.hpp +75 -0
- mqt/core/include/nlohmann/ordered_map.hpp +359 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
- mqt/core/include/qdmi/qdmi/client.h +990 -0
- mqt/core/include/qdmi/qdmi/constants.h +1139 -0
- mqt/core/include/qdmi/qdmi/device.h +602 -0
- mqt/core/include/qdmi/qdmi/types.h +78 -0
- mqt/core/include/spdlog/async.h +99 -0
- mqt/core/include/spdlog/async_logger-inl.h +84 -0
- mqt/core/include/spdlog/async_logger.h +74 -0
- mqt/core/include/spdlog/cfg/argv.h +40 -0
- mqt/core/include/spdlog/cfg/env.h +36 -0
- mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
- mqt/core/include/spdlog/cfg/helpers.h +29 -0
- mqt/core/include/spdlog/common-inl.h +68 -0
- mqt/core/include/spdlog/common.h +406 -0
- mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
- mqt/core/include/spdlog/details/backtracer.h +45 -0
- mqt/core/include/spdlog/details/circular_q.h +115 -0
- mqt/core/include/spdlog/details/console_globals.h +28 -0
- mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
- mqt/core/include/spdlog/details/file_helper.h +61 -0
- mqt/core/include/spdlog/details/fmt_helper.h +141 -0
- mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
- mqt/core/include/spdlog/details/log_msg.h +40 -0
- mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
- mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
- mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
- mqt/core/include/spdlog/details/null_mutex.h +35 -0
- mqt/core/include/spdlog/details/os-inl.h +606 -0
- mqt/core/include/spdlog/details/os.h +127 -0
- mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
- mqt/core/include/spdlog/details/periodic_worker.h +58 -0
- mqt/core/include/spdlog/details/registry-inl.h +270 -0
- mqt/core/include/spdlog/details/registry.h +131 -0
- mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
- mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
- mqt/core/include/spdlog/details/tcp_client.h +127 -0
- mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
- mqt/core/include/spdlog/details/thread_pool.h +117 -0
- mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
- mqt/core/include/spdlog/details/udp_client.h +81 -0
- mqt/core/include/spdlog/details/windows_include.h +11 -0
- mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
- mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
- mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
- mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
- mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
- mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
- mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
- mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
- mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
- mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
- mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
- mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
- mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
- mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
- mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
- mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
- mqt/core/include/spdlog/fmt/chrono.h +23 -0
- mqt/core/include/spdlog/fmt/compile.h +23 -0
- mqt/core/include/spdlog/fmt/fmt.h +30 -0
- mqt/core/include/spdlog/fmt/ostr.h +23 -0
- mqt/core/include/spdlog/fmt/ranges.h +23 -0
- mqt/core/include/spdlog/fmt/std.h +24 -0
- mqt/core/include/spdlog/fmt/xchar.h +23 -0
- mqt/core/include/spdlog/formatter.h +17 -0
- mqt/core/include/spdlog/fwd.h +18 -0
- mqt/core/include/spdlog/logger-inl.h +198 -0
- mqt/core/include/spdlog/logger.h +379 -0
- mqt/core/include/spdlog/mdc.h +52 -0
- mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
- mqt/core/include/spdlog/pattern_formatter.h +118 -0
- mqt/core/include/spdlog/sinks/android_sink.h +137 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
- mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
- mqt/core/include/spdlog/sinks/base_sink.h +51 -0
- mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
- mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
- mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
- mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
- mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
- mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
- mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
- mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
- mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
- mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
- mqt/core/include/spdlog/sinks/null_sink.h +41 -0
- mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
- mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
- mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
- mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
- mqt/core/include/spdlog/sinks/sink.h +34 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
- mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
- mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
- mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
- mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
- mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
- mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
- mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
- mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
- mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
- mqt/core/include/spdlog/spdlog-inl.h +96 -0
- mqt/core/include/spdlog/spdlog.h +357 -0
- mqt/core/include/spdlog/stopwatch.h +66 -0
- mqt/core/include/spdlog/tweakme.h +148 -0
- mqt/core/include/spdlog/version.h +11 -0
- mqt/core/ir/__init__.pyi +2078 -0
- mqt/core/ir/operations.pyi +1011 -0
- mqt/core/ir/registers.pyi +91 -0
- mqt/core/ir/symbolic.pyi +177 -0
- mqt/core/ir.cp313t-win_amd64.pyd +0 -0
- mqt/core/lib/mqt-core-algorithms.lib +0 -0
- mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
- mqt/core/lib/mqt-core-dd.lib +0 -0
- mqt/core/lib/mqt-core-ds.lib +0 -0
- mqt/core/lib/mqt-core-fomac.lib +0 -0
- mqt/core/lib/mqt-core-ir.lib +0 -0
- mqt/core/lib/mqt-core-na-fomac.lib +0 -0
- mqt/core/lib/mqt-core-na.lib +0 -0
- mqt/core/lib/mqt-core-qasm.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-driver.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
- mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
- mqt/core/lib/mqt-core-zx.lib +0 -0
- mqt/core/lib/pkgconfig/spdlog.pc +13 -0
- mqt/core/lib/spdlog.lib +0 -0
- mqt/core/na/__init__.py +12 -0
- mqt/core/na/fomac.cp313t-win_amd64.pyd +0 -0
- mqt/core/na/fomac.pyi +117 -0
- mqt/core/nlohmann_json.natvis +278 -0
- mqt/core/plugins/__init__.py +9 -0
- mqt/core/plugins/qiskit/__init__.py +19 -0
- mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
- mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
- mqt/core/py.typed +2 -0
- mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
- mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
- mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
- mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
- mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
- mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +445 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +110 -0
- mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
- mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
- mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
- mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
- mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
- mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
- mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +121 -0
- mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
- mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
- mqt_core-3.3.2.dist-info/DELVEWHEEL +2 -0
- mqt_core-3.3.2.dist-info/METADATA +210 -0
- mqt_core-3.3.2.dist-info/RECORD +537 -0
- mqt_core-3.3.2.dist-info/WHEEL +5 -0
- mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
- mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
- mqt_core.libs/msvcp140.dll +0 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
// Copyright(c) 2015-present, Gabi Melman, mguludag and spdlog contributors.
|
|
2
|
+
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
|
3
|
+
|
|
4
|
+
#pragma once
|
|
5
|
+
|
|
6
|
+
//
|
|
7
|
+
// Custom sink for QPlainTextEdit or QTextEdit and its children (QTextBrowser...
|
|
8
|
+
// etc) Building and using requires Qt library.
|
|
9
|
+
//
|
|
10
|
+
// Warning: the qt_sink won't be notified if the target widget is destroyed.
|
|
11
|
+
// If the widget's lifetime can be shorter than the logger's one, you should provide some permanent
|
|
12
|
+
// QObject, and then use a standard signal/slot.
|
|
13
|
+
//
|
|
14
|
+
|
|
15
|
+
#include "spdlog/common.h"
|
|
16
|
+
#include "spdlog/details/log_msg.h"
|
|
17
|
+
#include "spdlog/details/synchronous_factory.h"
|
|
18
|
+
#include "spdlog/sinks/base_sink.h"
|
|
19
|
+
#include <array>
|
|
20
|
+
|
|
21
|
+
#include <QPlainTextEdit>
|
|
22
|
+
#include <QTextEdit>
|
|
23
|
+
|
|
24
|
+
//
|
|
25
|
+
// qt_sink class
|
|
26
|
+
//
|
|
27
|
+
namespace spdlog {
|
|
28
|
+
namespace sinks {
|
|
29
|
+
template <typename Mutex>
|
|
30
|
+
class qt_sink : public base_sink<Mutex> {
|
|
31
|
+
public:
|
|
32
|
+
qt_sink(QObject *qt_object, std::string meta_method)
|
|
33
|
+
: qt_object_(qt_object),
|
|
34
|
+
meta_method_(std::move(meta_method)) {
|
|
35
|
+
if (!qt_object_) {
|
|
36
|
+
throw_spdlog_ex("qt_sink: qt_object is null");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
~qt_sink() { flush_(); }
|
|
41
|
+
|
|
42
|
+
protected:
|
|
43
|
+
void sink_it_(const details::log_msg &msg) override {
|
|
44
|
+
memory_buf_t formatted;
|
|
45
|
+
base_sink<Mutex>::formatter_->format(msg, formatted);
|
|
46
|
+
const string_view_t str = string_view_t(formatted.data(), formatted.size());
|
|
47
|
+
QMetaObject::invokeMethod(
|
|
48
|
+
qt_object_, meta_method_.c_str(), Qt::AutoConnection,
|
|
49
|
+
Q_ARG(QString, QString::fromUtf8(str.data(), static_cast<int>(str.size())).trimmed()));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
void flush_() override {}
|
|
53
|
+
|
|
54
|
+
private:
|
|
55
|
+
QObject *qt_object_ = nullptr;
|
|
56
|
+
std::string meta_method_;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Qt color sink to QTextEdit.
|
|
60
|
+
// Color location is determined by the sink log pattern like in the rest of spdlog sinks.
|
|
61
|
+
// Colors can be modified if needed using sink->set_color(level, qtTextCharFormat).
|
|
62
|
+
// max_lines is the maximum number of lines that the sink will hold before removing the oldest
|
|
63
|
+
// lines. By default, only ascii (latin1) is supported by this sink. Set is_utf8 to true if utf8
|
|
64
|
+
// support is needed.
|
|
65
|
+
template <typename Mutex>
|
|
66
|
+
class qt_color_sink : public base_sink<Mutex> {
|
|
67
|
+
public:
|
|
68
|
+
qt_color_sink(QTextEdit *qt_text_edit,
|
|
69
|
+
int max_lines,
|
|
70
|
+
bool dark_colors = false,
|
|
71
|
+
bool is_utf8 = false)
|
|
72
|
+
: qt_text_edit_(qt_text_edit),
|
|
73
|
+
max_lines_(max_lines),
|
|
74
|
+
is_utf8_(is_utf8) {
|
|
75
|
+
if (!qt_text_edit_) {
|
|
76
|
+
throw_spdlog_ex("qt_color_text_sink: text_edit is null");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
default_color_ = qt_text_edit_->currentCharFormat();
|
|
80
|
+
// set colors
|
|
81
|
+
QTextCharFormat format;
|
|
82
|
+
// trace
|
|
83
|
+
format.setForeground(dark_colors ? Qt::darkGray : Qt::gray);
|
|
84
|
+
colors_.at(level::trace) = format;
|
|
85
|
+
// debug
|
|
86
|
+
format.setForeground(dark_colors ? Qt::darkCyan : Qt::cyan);
|
|
87
|
+
colors_.at(level::debug) = format;
|
|
88
|
+
// info
|
|
89
|
+
format.setForeground(dark_colors ? Qt::darkGreen : Qt::green);
|
|
90
|
+
colors_.at(level::info) = format;
|
|
91
|
+
// warn
|
|
92
|
+
format.setForeground(dark_colors ? Qt::darkYellow : Qt::yellow);
|
|
93
|
+
colors_.at(level::warn) = format;
|
|
94
|
+
// err
|
|
95
|
+
format.setForeground(Qt::red);
|
|
96
|
+
colors_.at(level::err) = format;
|
|
97
|
+
// critical
|
|
98
|
+
format.setForeground(Qt::white);
|
|
99
|
+
format.setBackground(Qt::red);
|
|
100
|
+
colors_.at(level::critical) = format;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
~qt_color_sink() { flush_(); }
|
|
104
|
+
|
|
105
|
+
void set_default_color(QTextCharFormat format) {
|
|
106
|
+
// std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
107
|
+
default_color_ = format;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
void set_level_color(level::level_enum color_level, QTextCharFormat format) {
|
|
111
|
+
// std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
112
|
+
colors_.at(static_cast<size_t>(color_level)) = format;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
QTextCharFormat &get_level_color(level::level_enum color_level) {
|
|
116
|
+
std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
117
|
+
return colors_.at(static_cast<size_t>(color_level));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
QTextCharFormat &get_default_color() {
|
|
121
|
+
std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
122
|
+
return default_color_;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
protected:
|
|
126
|
+
struct invoke_params {
|
|
127
|
+
invoke_params(int max_lines,
|
|
128
|
+
QTextEdit *q_text_edit,
|
|
129
|
+
QString payload,
|
|
130
|
+
QTextCharFormat default_color,
|
|
131
|
+
QTextCharFormat level_color,
|
|
132
|
+
int color_range_start,
|
|
133
|
+
int color_range_end)
|
|
134
|
+
: max_lines(max_lines),
|
|
135
|
+
q_text_edit(q_text_edit),
|
|
136
|
+
payload(std::move(payload)),
|
|
137
|
+
default_color(default_color),
|
|
138
|
+
level_color(level_color),
|
|
139
|
+
color_range_start(color_range_start),
|
|
140
|
+
color_range_end(color_range_end) {}
|
|
141
|
+
int max_lines;
|
|
142
|
+
QTextEdit *q_text_edit;
|
|
143
|
+
QString payload;
|
|
144
|
+
QTextCharFormat default_color;
|
|
145
|
+
QTextCharFormat level_color;
|
|
146
|
+
int color_range_start;
|
|
147
|
+
int color_range_end;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
void sink_it_(const details::log_msg &msg) override {
|
|
151
|
+
memory_buf_t formatted;
|
|
152
|
+
base_sink<Mutex>::formatter_->format(msg, formatted);
|
|
153
|
+
|
|
154
|
+
const string_view_t str = string_view_t(formatted.data(), formatted.size());
|
|
155
|
+
// apply the color to the color range in the formatted message.
|
|
156
|
+
QString payload;
|
|
157
|
+
int color_range_start = static_cast<int>(msg.color_range_start);
|
|
158
|
+
int color_range_end = static_cast<int>(msg.color_range_end);
|
|
159
|
+
if (is_utf8_) {
|
|
160
|
+
payload = QString::fromUtf8(str.data(), static_cast<int>(str.size()));
|
|
161
|
+
// convert color ranges from byte index to character index.
|
|
162
|
+
if (msg.color_range_start < msg.color_range_end) {
|
|
163
|
+
color_range_start = QString::fromUtf8(str.data(), msg.color_range_start).size();
|
|
164
|
+
color_range_end = QString::fromUtf8(str.data(), msg.color_range_end).size();
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
payload = QString::fromLatin1(str.data(), static_cast<int>(str.size()));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
invoke_params params{max_lines_, // max lines
|
|
171
|
+
qt_text_edit_, // text edit to append to
|
|
172
|
+
std::move(payload), // text to append
|
|
173
|
+
default_color_, // default color
|
|
174
|
+
colors_.at(msg.level), // color to apply
|
|
175
|
+
color_range_start, // color range start
|
|
176
|
+
color_range_end}; // color range end
|
|
177
|
+
|
|
178
|
+
QMetaObject::invokeMethod(
|
|
179
|
+
qt_text_edit_, [params]() { invoke_method_(params); }, Qt::AutoConnection);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
void flush_() override {}
|
|
183
|
+
|
|
184
|
+
// Add colored text to the text edit widget. This method is invoked in the GUI thread.
|
|
185
|
+
// It is a static method to ensure that it is handled correctly even if the sink is destroyed
|
|
186
|
+
// prematurely before it is invoked.
|
|
187
|
+
|
|
188
|
+
static void invoke_method_(invoke_params params) {
|
|
189
|
+
auto *document = params.q_text_edit->document();
|
|
190
|
+
QTextCursor cursor(document);
|
|
191
|
+
|
|
192
|
+
// remove first blocks if number of blocks exceeds max_lines
|
|
193
|
+
while (document->blockCount() > params.max_lines) {
|
|
194
|
+
cursor.select(QTextCursor::BlockUnderCursor);
|
|
195
|
+
cursor.removeSelectedText();
|
|
196
|
+
cursor.deleteChar(); // delete the newline after the block
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
cursor.movePosition(QTextCursor::End);
|
|
200
|
+
cursor.setCharFormat(params.default_color);
|
|
201
|
+
|
|
202
|
+
// if color range not specified or not not valid, just append the text with default color
|
|
203
|
+
if (params.color_range_end <= params.color_range_start) {
|
|
204
|
+
cursor.insertText(params.payload);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// insert the text before the color range
|
|
209
|
+
cursor.insertText(params.payload.left(params.color_range_start));
|
|
210
|
+
|
|
211
|
+
// insert the colorized text
|
|
212
|
+
cursor.setCharFormat(params.level_color);
|
|
213
|
+
cursor.insertText(params.payload.mid(params.color_range_start,
|
|
214
|
+
params.color_range_end - params.color_range_start));
|
|
215
|
+
|
|
216
|
+
// insert the text after the color range with default format
|
|
217
|
+
cursor.setCharFormat(params.default_color);
|
|
218
|
+
cursor.insertText(params.payload.mid(params.color_range_end));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
QTextEdit *qt_text_edit_;
|
|
222
|
+
int max_lines_;
|
|
223
|
+
bool is_utf8_;
|
|
224
|
+
QTextCharFormat default_color_;
|
|
225
|
+
std::array<QTextCharFormat, level::n_levels> colors_;
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
#include "spdlog/details/null_mutex.h"
|
|
229
|
+
#include <mutex>
|
|
230
|
+
|
|
231
|
+
using qt_sink_mt = qt_sink<std::mutex>;
|
|
232
|
+
using qt_sink_st = qt_sink<details::null_mutex>;
|
|
233
|
+
using qt_color_sink_mt = qt_color_sink<std::mutex>;
|
|
234
|
+
using qt_color_sink_st = qt_color_sink<details::null_mutex>;
|
|
235
|
+
} // namespace sinks
|
|
236
|
+
|
|
237
|
+
//
|
|
238
|
+
// Factory functions
|
|
239
|
+
//
|
|
240
|
+
|
|
241
|
+
// log to QTextEdit
|
|
242
|
+
template <typename Factory = spdlog::synchronous_factory>
|
|
243
|
+
inline std::shared_ptr<logger> qt_logger_mt(const std::string &logger_name,
|
|
244
|
+
QTextEdit *qt_object,
|
|
245
|
+
const std::string &meta_method = "append") {
|
|
246
|
+
return Factory::template create<sinks::qt_sink_mt>(logger_name, qt_object, meta_method);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
template <typename Factory = spdlog::synchronous_factory>
|
|
250
|
+
inline std::shared_ptr<logger> qt_logger_st(const std::string &logger_name,
|
|
251
|
+
QTextEdit *qt_object,
|
|
252
|
+
const std::string &meta_method = "append") {
|
|
253
|
+
return Factory::template create<sinks::qt_sink_st>(logger_name, qt_object, meta_method);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// log to QPlainTextEdit
|
|
257
|
+
template <typename Factory = spdlog::synchronous_factory>
|
|
258
|
+
inline std::shared_ptr<logger> qt_logger_mt(const std::string &logger_name,
|
|
259
|
+
QPlainTextEdit *qt_object,
|
|
260
|
+
const std::string &meta_method = "appendPlainText") {
|
|
261
|
+
return Factory::template create<sinks::qt_sink_mt>(logger_name, qt_object, meta_method);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
template <typename Factory = spdlog::synchronous_factory>
|
|
265
|
+
inline std::shared_ptr<logger> qt_logger_st(const std::string &logger_name,
|
|
266
|
+
QPlainTextEdit *qt_object,
|
|
267
|
+
const std::string &meta_method = "appendPlainText") {
|
|
268
|
+
return Factory::template create<sinks::qt_sink_st>(logger_name, qt_object, meta_method);
|
|
269
|
+
}
|
|
270
|
+
// log to QObject
|
|
271
|
+
template <typename Factory = spdlog::synchronous_factory>
|
|
272
|
+
inline std::shared_ptr<logger> qt_logger_mt(const std::string &logger_name,
|
|
273
|
+
QObject *qt_object,
|
|
274
|
+
const std::string &meta_method) {
|
|
275
|
+
return Factory::template create<sinks::qt_sink_mt>(logger_name, qt_object, meta_method);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
template <typename Factory = spdlog::synchronous_factory>
|
|
279
|
+
inline std::shared_ptr<logger> qt_logger_st(const std::string &logger_name,
|
|
280
|
+
QObject *qt_object,
|
|
281
|
+
const std::string &meta_method) {
|
|
282
|
+
return Factory::template create<sinks::qt_sink_st>(logger_name, qt_object, meta_method);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// log to QTextEdit with colorized output
|
|
286
|
+
template <typename Factory = spdlog::synchronous_factory>
|
|
287
|
+
inline std::shared_ptr<logger> qt_color_logger_mt(const std::string &logger_name,
|
|
288
|
+
QTextEdit *qt_text_edit,
|
|
289
|
+
int max_lines,
|
|
290
|
+
bool is_utf8 = false) {
|
|
291
|
+
return Factory::template create<sinks::qt_color_sink_mt>(logger_name, qt_text_edit, max_lines,
|
|
292
|
+
false, is_utf8);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
template <typename Factory = spdlog::synchronous_factory>
|
|
296
|
+
inline std::shared_ptr<logger> qt_color_logger_st(const std::string &logger_name,
|
|
297
|
+
QTextEdit *qt_text_edit,
|
|
298
|
+
int max_lines,
|
|
299
|
+
bool is_utf8 = false) {
|
|
300
|
+
return Factory::template create<sinks::qt_color_sink_st>(logger_name, qt_text_edit, max_lines,
|
|
301
|
+
false, is_utf8);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
} // namespace spdlog
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
|
2
|
+
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
|
3
|
+
|
|
4
|
+
#pragma once
|
|
5
|
+
|
|
6
|
+
#include "spdlog/details/circular_q.h"
|
|
7
|
+
#include "spdlog/details/log_msg_buffer.h"
|
|
8
|
+
#include "spdlog/details/null_mutex.h"
|
|
9
|
+
#include "spdlog/sinks/base_sink.h"
|
|
10
|
+
|
|
11
|
+
#include <mutex>
|
|
12
|
+
#include <string>
|
|
13
|
+
#include <vector>
|
|
14
|
+
|
|
15
|
+
namespace spdlog {
|
|
16
|
+
namespace sinks {
|
|
17
|
+
/*
|
|
18
|
+
* Ring buffer sink
|
|
19
|
+
*/
|
|
20
|
+
template <typename Mutex>
|
|
21
|
+
class ringbuffer_sink final : public base_sink<Mutex> {
|
|
22
|
+
public:
|
|
23
|
+
explicit ringbuffer_sink(size_t n_items)
|
|
24
|
+
: q_{n_items} {}
|
|
25
|
+
|
|
26
|
+
std::vector<details::log_msg_buffer> last_raw(size_t lim = 0) {
|
|
27
|
+
std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
28
|
+
auto items_available = q_.size();
|
|
29
|
+
auto n_items = lim > 0 ? (std::min)(lim, items_available) : items_available;
|
|
30
|
+
std::vector<details::log_msg_buffer> ret;
|
|
31
|
+
ret.reserve(n_items);
|
|
32
|
+
for (size_t i = (items_available - n_items); i < items_available; i++) {
|
|
33
|
+
ret.push_back(q_.at(i));
|
|
34
|
+
}
|
|
35
|
+
return ret;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
std::vector<std::string> last_formatted(size_t lim = 0) {
|
|
39
|
+
std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
40
|
+
auto items_available = q_.size();
|
|
41
|
+
auto n_items = lim > 0 ? (std::min)(lim, items_available) : items_available;
|
|
42
|
+
std::vector<std::string> ret;
|
|
43
|
+
ret.reserve(n_items);
|
|
44
|
+
for (size_t i = (items_available - n_items); i < items_available; i++) {
|
|
45
|
+
memory_buf_t formatted;
|
|
46
|
+
base_sink<Mutex>::formatter_->format(q_.at(i), formatted);
|
|
47
|
+
ret.push_back(SPDLOG_BUF_TO_STRING(formatted));
|
|
48
|
+
}
|
|
49
|
+
return ret;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
protected:
|
|
53
|
+
void sink_it_(const details::log_msg &msg) override {
|
|
54
|
+
q_.push_back(details::log_msg_buffer{msg});
|
|
55
|
+
}
|
|
56
|
+
void flush_() override {}
|
|
57
|
+
|
|
58
|
+
private:
|
|
59
|
+
details::circular_q<details::log_msg_buffer> q_;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
using ringbuffer_sink_mt = ringbuffer_sink<std::mutex>;
|
|
63
|
+
using ringbuffer_sink_st = ringbuffer_sink<details::null_mutex>;
|
|
64
|
+
|
|
65
|
+
} // namespace sinks
|
|
66
|
+
|
|
67
|
+
} // namespace spdlog
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
|
2
|
+
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
|
3
|
+
|
|
4
|
+
#pragma once
|
|
5
|
+
|
|
6
|
+
#ifndef SPDLOG_HEADER_ONLY
|
|
7
|
+
#include <spdlog/sinks/rotating_file_sink.h>
|
|
8
|
+
#endif
|
|
9
|
+
|
|
10
|
+
#include <spdlog/common.h>
|
|
11
|
+
|
|
12
|
+
#include <spdlog/details/file_helper.h>
|
|
13
|
+
#include <spdlog/details/null_mutex.h>
|
|
14
|
+
#include <spdlog/fmt/fmt.h>
|
|
15
|
+
|
|
16
|
+
#include <cerrno>
|
|
17
|
+
#include <ctime>
|
|
18
|
+
#include <mutex>
|
|
19
|
+
#include <string>
|
|
20
|
+
#include <tuple>
|
|
21
|
+
|
|
22
|
+
namespace spdlog {
|
|
23
|
+
namespace sinks {
|
|
24
|
+
|
|
25
|
+
template <typename Mutex>
|
|
26
|
+
SPDLOG_INLINE rotating_file_sink<Mutex>::rotating_file_sink(
|
|
27
|
+
filename_t base_filename,
|
|
28
|
+
std::size_t max_size,
|
|
29
|
+
std::size_t max_files,
|
|
30
|
+
bool rotate_on_open,
|
|
31
|
+
const file_event_handlers &event_handlers)
|
|
32
|
+
: base_filename_(std::move(base_filename)),
|
|
33
|
+
max_size_(max_size),
|
|
34
|
+
max_files_(max_files),
|
|
35
|
+
file_helper_{event_handlers} {
|
|
36
|
+
if (max_size == 0) {
|
|
37
|
+
throw_spdlog_ex("rotating sink constructor: max_size arg cannot be zero");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (max_files > MaxFiles) {
|
|
41
|
+
throw_spdlog_ex("rotating sink constructor: max_files arg cannot exceed MaxFiles");
|
|
42
|
+
}
|
|
43
|
+
file_helper_.open(calc_filename(base_filename_, 0));
|
|
44
|
+
current_size_ = file_helper_.size(); // expensive. called only once
|
|
45
|
+
if (rotate_on_open && current_size_ > 0) {
|
|
46
|
+
rotate_();
|
|
47
|
+
current_size_ = 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// calc filename according to index and file extension if exists.
|
|
52
|
+
// e.g. calc_filename("logs/mylog.txt, 3) => "logs/mylog.3.txt".
|
|
53
|
+
template <typename Mutex>
|
|
54
|
+
SPDLOG_INLINE filename_t rotating_file_sink<Mutex>::calc_filename(const filename_t &filename,
|
|
55
|
+
std::size_t index) {
|
|
56
|
+
if (index == 0U) {
|
|
57
|
+
return filename;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
filename_t basename;
|
|
61
|
+
filename_t ext;
|
|
62
|
+
std::tie(basename, ext) = details::file_helper::split_by_extension(filename);
|
|
63
|
+
return fmt_lib::format(SPDLOG_FMT_STRING(SPDLOG_FILENAME_T("{}.{}{}")), basename, index, ext);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
template <typename Mutex>
|
|
67
|
+
SPDLOG_INLINE filename_t rotating_file_sink<Mutex>::filename() {
|
|
68
|
+
std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
69
|
+
return file_helper_.filename();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
template <typename Mutex>
|
|
73
|
+
SPDLOG_INLINE void rotating_file_sink<Mutex>::rotate_now() {
|
|
74
|
+
std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
75
|
+
rotate_();
|
|
76
|
+
}
|
|
77
|
+
template <typename Mutex>
|
|
78
|
+
SPDLOG_INLINE void rotating_file_sink<Mutex>::set_max_size(std::size_t max_size) {
|
|
79
|
+
std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
80
|
+
if (max_size == 0) {
|
|
81
|
+
throw_spdlog_ex("rotating sink set_max_size: max_size arg cannot be zero");
|
|
82
|
+
}
|
|
83
|
+
max_size_ = max_size;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
template <typename Mutex>
|
|
87
|
+
SPDLOG_INLINE std::size_t rotating_file_sink<Mutex>::get_max_size() {
|
|
88
|
+
std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
89
|
+
return max_size_;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
template <typename Mutex>
|
|
93
|
+
SPDLOG_INLINE void rotating_file_sink<Mutex>::set_max_files(std::size_t max_files) {
|
|
94
|
+
std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
95
|
+
if (max_files > MaxFiles) {
|
|
96
|
+
throw_spdlog_ex("rotating sink set_max_files: max_files arg cannot exceed 200000");
|
|
97
|
+
}
|
|
98
|
+
max_files_ = max_files;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
template <typename Mutex>
|
|
102
|
+
std::size_t rotating_file_sink<Mutex>::get_max_files() {
|
|
103
|
+
std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_);
|
|
104
|
+
return max_files_;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
template <typename Mutex>
|
|
108
|
+
SPDLOG_INLINE void rotating_file_sink<Mutex>::sink_it_(const details::log_msg &msg) {
|
|
109
|
+
memory_buf_t formatted;
|
|
110
|
+
base_sink<Mutex>::formatter_->format(msg, formatted);
|
|
111
|
+
auto new_size = current_size_ + formatted.size();
|
|
112
|
+
|
|
113
|
+
// rotate if the new estimated file size exceeds max size.
|
|
114
|
+
// rotate only if the real size > 0 to better deal with full disk (see issue #2261).
|
|
115
|
+
// we only check the real size when new_size > max_size_ because it is relatively expensive.
|
|
116
|
+
if (new_size > max_size_) {
|
|
117
|
+
file_helper_.flush();
|
|
118
|
+
if (file_helper_.size() > 0) {
|
|
119
|
+
rotate_();
|
|
120
|
+
new_size = formatted.size();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
file_helper_.write(formatted);
|
|
124
|
+
current_size_ = new_size;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
template <typename Mutex>
|
|
128
|
+
SPDLOG_INLINE void rotating_file_sink<Mutex>::flush_() {
|
|
129
|
+
file_helper_.flush();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Rotate files:
|
|
133
|
+
// log.txt -> log.1.txt
|
|
134
|
+
// log.1.txt -> log.2.txt
|
|
135
|
+
// log.2.txt -> log.3.txt
|
|
136
|
+
// log.3.txt -> delete
|
|
137
|
+
template <typename Mutex>
|
|
138
|
+
SPDLOG_INLINE void rotating_file_sink<Mutex>::rotate_() {
|
|
139
|
+
using details::os::filename_to_str;
|
|
140
|
+
using details::os::path_exists;
|
|
141
|
+
|
|
142
|
+
file_helper_.close();
|
|
143
|
+
for (auto i = max_files_; i > 0; --i) {
|
|
144
|
+
filename_t src = calc_filename(base_filename_, i - 1);
|
|
145
|
+
if (!path_exists(src)) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
filename_t target = calc_filename(base_filename_, i);
|
|
149
|
+
|
|
150
|
+
if (!rename_file_(src, target)) {
|
|
151
|
+
// if failed try again after a small delay.
|
|
152
|
+
// this is a workaround to a windows issue, where very high rotation
|
|
153
|
+
// rates can cause the rename to fail with permission denied (because of antivirus?).
|
|
154
|
+
details::os::sleep_for_millis(100);
|
|
155
|
+
if (!rename_file_(src, target)) {
|
|
156
|
+
file_helper_.reopen(
|
|
157
|
+
true); // truncate the log file anyway to prevent it to grow beyond its limit!
|
|
158
|
+
current_size_ = 0;
|
|
159
|
+
throw_spdlog_ex("rotating_file_sink: failed renaming " + filename_to_str(src) +
|
|
160
|
+
" to " + filename_to_str(target),
|
|
161
|
+
errno);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
file_helper_.reopen(true);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// delete the target if exists, and rename the src file to target
|
|
169
|
+
// return true on success, false otherwise.
|
|
170
|
+
template <typename Mutex>
|
|
171
|
+
SPDLOG_INLINE bool rotating_file_sink<Mutex>::rename_file_(const filename_t &src_filename,
|
|
172
|
+
const filename_t &target_filename) {
|
|
173
|
+
// try to delete the target file in case it already exists.
|
|
174
|
+
(void)details::os::remove(target_filename);
|
|
175
|
+
return details::os::rename(src_filename, target_filename) == 0;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
} // namespace sinks
|
|
179
|
+
} // namespace spdlog
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
|
2
|
+
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
|
3
|
+
|
|
4
|
+
#pragma once
|
|
5
|
+
|
|
6
|
+
#include <spdlog/details/file_helper.h>
|
|
7
|
+
#include <spdlog/details/null_mutex.h>
|
|
8
|
+
#include <spdlog/details/synchronous_factory.h>
|
|
9
|
+
#include <spdlog/sinks/base_sink.h>
|
|
10
|
+
|
|
11
|
+
#include <mutex>
|
|
12
|
+
#include <string>
|
|
13
|
+
|
|
14
|
+
namespace spdlog {
|
|
15
|
+
namespace sinks {
|
|
16
|
+
|
|
17
|
+
//
|
|
18
|
+
// Rotating file sink based on size
|
|
19
|
+
//
|
|
20
|
+
template <typename Mutex>
|
|
21
|
+
class rotating_file_sink final : public base_sink<Mutex> {
|
|
22
|
+
public:
|
|
23
|
+
static constexpr size_t MaxFiles = 200000;
|
|
24
|
+
rotating_file_sink(filename_t base_filename,
|
|
25
|
+
std::size_t max_size,
|
|
26
|
+
std::size_t max_files,
|
|
27
|
+
bool rotate_on_open = false,
|
|
28
|
+
const file_event_handlers &event_handlers = {});
|
|
29
|
+
static filename_t calc_filename(const filename_t &filename, std::size_t index);
|
|
30
|
+
filename_t filename();
|
|
31
|
+
void rotate_now();
|
|
32
|
+
void set_max_size(std::size_t max_size);
|
|
33
|
+
std::size_t get_max_size();
|
|
34
|
+
void set_max_files(std::size_t max_files);
|
|
35
|
+
std::size_t get_max_files();
|
|
36
|
+
|
|
37
|
+
protected:
|
|
38
|
+
void sink_it_(const details::log_msg &msg) override;
|
|
39
|
+
void flush_() override;
|
|
40
|
+
|
|
41
|
+
private:
|
|
42
|
+
// Rotate files:
|
|
43
|
+
// log.txt -> log.1.txt
|
|
44
|
+
// log.1.txt -> log.2.txt
|
|
45
|
+
// log.2.txt -> log.3.txt
|
|
46
|
+
// log.3.txt -> delete
|
|
47
|
+
void rotate_();
|
|
48
|
+
|
|
49
|
+
// delete the target if exists, and rename the src file to target
|
|
50
|
+
// return true on success, false otherwise.
|
|
51
|
+
bool rename_file_(const filename_t &src_filename, const filename_t &target_filename);
|
|
52
|
+
|
|
53
|
+
filename_t base_filename_;
|
|
54
|
+
std::size_t max_size_;
|
|
55
|
+
std::size_t max_files_;
|
|
56
|
+
std::size_t current_size_;
|
|
57
|
+
details::file_helper file_helper_;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
using rotating_file_sink_mt = rotating_file_sink<std::mutex>;
|
|
61
|
+
using rotating_file_sink_st = rotating_file_sink<details::null_mutex>;
|
|
62
|
+
|
|
63
|
+
} // namespace sinks
|
|
64
|
+
|
|
65
|
+
//
|
|
66
|
+
// factory functions
|
|
67
|
+
//
|
|
68
|
+
template <typename Factory = spdlog::synchronous_factory>
|
|
69
|
+
std::shared_ptr<logger> rotating_logger_mt(const std::string &logger_name,
|
|
70
|
+
const filename_t &filename,
|
|
71
|
+
size_t max_file_size,
|
|
72
|
+
size_t max_files,
|
|
73
|
+
bool rotate_on_open = false,
|
|
74
|
+
const file_event_handlers &event_handlers = {}) {
|
|
75
|
+
return Factory::template create<sinks::rotating_file_sink_mt>(
|
|
76
|
+
logger_name, filename, max_file_size, max_files, rotate_on_open, event_handlers);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
template <typename Factory = spdlog::synchronous_factory>
|
|
80
|
+
std::shared_ptr<logger> rotating_logger_st(const std::string &logger_name,
|
|
81
|
+
const filename_t &filename,
|
|
82
|
+
size_t max_file_size,
|
|
83
|
+
size_t max_files,
|
|
84
|
+
bool rotate_on_open = false,
|
|
85
|
+
const file_event_handlers &event_handlers = {}) {
|
|
86
|
+
return Factory::template create<sinks::rotating_file_sink_st>(
|
|
87
|
+
logger_name, filename, max_file_size, max_files, rotate_on_open, event_handlers);
|
|
88
|
+
}
|
|
89
|
+
} // namespace spdlog
|
|
90
|
+
|
|
91
|
+
#ifdef SPDLOG_HEADER_ONLY
|
|
92
|
+
#include "rotating_file_sink-inl.h"
|
|
93
|
+
#endif
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
|
2
|
+
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
|
3
|
+
|
|
4
|
+
#pragma once
|
|
5
|
+
|
|
6
|
+
#ifndef SPDLOG_HEADER_ONLY
|
|
7
|
+
#include <spdlog/sinks/sink.h>
|
|
8
|
+
#endif
|
|
9
|
+
|
|
10
|
+
#include <spdlog/common.h>
|
|
11
|
+
|
|
12
|
+
SPDLOG_INLINE bool spdlog::sinks::sink::should_log(spdlog::level::level_enum msg_level) const {
|
|
13
|
+
return msg_level >= level_.load(std::memory_order_relaxed);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
SPDLOG_INLINE void spdlog::sinks::sink::set_level(level::level_enum log_level) {
|
|
17
|
+
level_.store(log_level, std::memory_order_relaxed);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
SPDLOG_INLINE spdlog::level::level_enum spdlog::sinks::sink::level() const {
|
|
21
|
+
return static_cast<spdlog::level::level_enum>(level_.load(std::memory_order_relaxed));
|
|
22
|
+
}
|