mqt-core 3.2.1__cp311-cp311-win_arm64.whl → 3.3.0__cp311-cp311-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mqt-core might be problematic. Click here for more details.

Files changed (242) hide show
  1. mqt/core/__init__.py +3 -3
  2. mqt/core/_commands.py +2 -2
  3. mqt/core/_version.py +16 -3
  4. mqt/core/bin/mqt-core-algorithms.dll +0 -0
  5. mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
  6. mqt/core/bin/mqt-core-dd.dll +0 -0
  7. mqt/core/bin/mqt-core-ds.dll +0 -0
  8. mqt/core/bin/mqt-core-fomac.dll +0 -0
  9. mqt/core/bin/mqt-core-ir.dll +0 -0
  10. mqt/core/bin/mqt-core-na-fomac.dll +0 -0
  11. mqt/core/bin/mqt-core-na.dll +0 -0
  12. mqt/core/bin/mqt-core-qasm.dll +0 -0
  13. mqt/core/bin/mqt-core-qdmi-driver.dll +0 -0
  14. mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
  15. mqt/core/bin/mqt-core-zx.dll +0 -0
  16. mqt/core/dd.cp311-win_arm64.pyd +0 -0
  17. mqt/core/dd.pyi +5 -7
  18. mqt/core/fomac.cp311-win_arm64.pyd +0 -0
  19. mqt/core/fomac.pyi +125 -0
  20. mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +13 -0
  21. mqt/core/include/mqt-core/dd/CachedEdge.hpp +7 -0
  22. mqt/core/include/mqt-core/dd/Operations.hpp +12 -14
  23. mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
  24. mqt/core/include/mqt-core/ir/QuantumComputation.hpp +29 -28
  25. mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +2 -0
  26. mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
  27. mqt/core/include/mqt-core/ir/operations/OpType.hpp +3 -0
  28. mqt/core/include/mqt-core/ir/operations/OpType.inc +2 -2
  29. mqt/core/include/mqt-core/ir/operations/Operation.hpp +3 -1
  30. mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +2 -0
  31. mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
  32. mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
  33. mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
  34. mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
  35. mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
  36. mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
  37. mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
  38. mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
  39. mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
  40. mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
  41. mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
  42. mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
  43. mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
  44. mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
  45. mqt/core/include/nlohmann/detail/hash.hpp +129 -0
  46. mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
  47. mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
  48. mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
  49. mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
  50. mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
  51. mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
  52. mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
  53. mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
  54. mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
  55. mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
  56. mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
  57. mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
  58. mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
  59. mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
  60. mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
  61. mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
  62. mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
  63. mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
  64. mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
  65. mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
  66. mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
  67. mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
  68. mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
  69. mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
  70. mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
  71. mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
  72. mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
  73. mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
  74. mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
  75. mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
  76. mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
  77. mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
  78. mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
  79. mqt/core/include/nlohmann/json.hpp +5306 -0
  80. mqt/core/include/nlohmann/json_fwd.hpp +75 -0
  81. mqt/core/include/nlohmann/ordered_map.hpp +359 -0
  82. mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
  83. mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
  84. mqt/core/include/qdmi/qdmi/client.h +990 -0
  85. mqt/core/include/qdmi/qdmi/constants.h +1139 -0
  86. mqt/core/include/qdmi/qdmi/device.h +602 -0
  87. mqt/core/include/qdmi/qdmi/types.h +78 -0
  88. mqt/core/include/spdlog/async.h +99 -0
  89. mqt/core/include/spdlog/async_logger-inl.h +84 -0
  90. mqt/core/include/spdlog/async_logger.h +74 -0
  91. mqt/core/include/spdlog/cfg/argv.h +40 -0
  92. mqt/core/include/spdlog/cfg/env.h +36 -0
  93. mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
  94. mqt/core/include/spdlog/cfg/helpers.h +29 -0
  95. mqt/core/include/spdlog/common-inl.h +68 -0
  96. mqt/core/include/spdlog/common.h +406 -0
  97. mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
  98. mqt/core/include/spdlog/details/backtracer.h +45 -0
  99. mqt/core/include/spdlog/details/circular_q.h +115 -0
  100. mqt/core/include/spdlog/details/console_globals.h +28 -0
  101. mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
  102. mqt/core/include/spdlog/details/file_helper.h +61 -0
  103. mqt/core/include/spdlog/details/fmt_helper.h +141 -0
  104. mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
  105. mqt/core/include/spdlog/details/log_msg.h +40 -0
  106. mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
  107. mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
  108. mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
  109. mqt/core/include/spdlog/details/null_mutex.h +35 -0
  110. mqt/core/include/spdlog/details/os-inl.h +606 -0
  111. mqt/core/include/spdlog/details/os.h +127 -0
  112. mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
  113. mqt/core/include/spdlog/details/periodic_worker.h +58 -0
  114. mqt/core/include/spdlog/details/registry-inl.h +270 -0
  115. mqt/core/include/spdlog/details/registry.h +131 -0
  116. mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
  117. mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
  118. mqt/core/include/spdlog/details/tcp_client.h +127 -0
  119. mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
  120. mqt/core/include/spdlog/details/thread_pool.h +117 -0
  121. mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
  122. mqt/core/include/spdlog/details/udp_client.h +81 -0
  123. mqt/core/include/spdlog/details/windows_include.h +11 -0
  124. mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
  125. mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
  126. mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
  127. mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
  128. mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
  129. mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
  130. mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
  131. mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
  132. mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
  133. mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
  134. mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
  135. mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
  136. mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
  137. mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
  138. mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
  139. mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
  140. mqt/core/include/spdlog/fmt/chrono.h +23 -0
  141. mqt/core/include/spdlog/fmt/compile.h +23 -0
  142. mqt/core/include/spdlog/fmt/fmt.h +30 -0
  143. mqt/core/include/spdlog/fmt/ostr.h +23 -0
  144. mqt/core/include/spdlog/fmt/ranges.h +23 -0
  145. mqt/core/include/spdlog/fmt/std.h +24 -0
  146. mqt/core/include/spdlog/fmt/xchar.h +23 -0
  147. mqt/core/include/spdlog/formatter.h +17 -0
  148. mqt/core/include/spdlog/fwd.h +18 -0
  149. mqt/core/include/spdlog/logger-inl.h +198 -0
  150. mqt/core/include/spdlog/logger.h +379 -0
  151. mqt/core/include/spdlog/mdc.h +52 -0
  152. mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
  153. mqt/core/include/spdlog/pattern_formatter.h +118 -0
  154. mqt/core/include/spdlog/sinks/android_sink.h +137 -0
  155. mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
  156. mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
  157. mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
  158. mqt/core/include/spdlog/sinks/base_sink.h +51 -0
  159. mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
  160. mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
  161. mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
  162. mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
  163. mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
  164. mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
  165. mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
  166. mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
  167. mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
  168. mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
  169. mqt/core/include/spdlog/sinks/null_sink.h +41 -0
  170. mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
  171. mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
  172. mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
  173. mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
  174. mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
  175. mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
  176. mqt/core/include/spdlog/sinks/sink.h +34 -0
  177. mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
  178. mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
  179. mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
  180. mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
  181. mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
  182. mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
  183. mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
  184. mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
  185. mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
  186. mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
  187. mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
  188. mqt/core/include/spdlog/spdlog-inl.h +96 -0
  189. mqt/core/include/spdlog/spdlog.h +357 -0
  190. mqt/core/include/spdlog/stopwatch.h +66 -0
  191. mqt/core/include/spdlog/tweakme.h +148 -0
  192. mqt/core/include/spdlog/version.h +11 -0
  193. mqt/core/ir/__init__.pyi +83 -45
  194. mqt/core/ir/operations.pyi +40 -27
  195. mqt/core/ir.cp311-win_arm64.pyd +0 -0
  196. mqt/core/lib/cmake/spdlog/spdlogConfig.cmake +44 -0
  197. mqt/core/lib/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
  198. mqt/core/lib/cmake/spdlog/spdlogConfigTargets.cmake +119 -0
  199. mqt/core/lib/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
  200. mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
  201. mqt/core/lib/mqt-core-dd.lib +0 -0
  202. mqt/core/lib/mqt-core-fomac.lib +0 -0
  203. mqt/core/lib/mqt-core-ir.lib +0 -0
  204. mqt/core/lib/mqt-core-na-fomac.lib +0 -0
  205. mqt/core/lib/mqt-core-qasm.lib +0 -0
  206. mqt/core/lib/mqt-core-qdmi-driver.lib +0 -0
  207. mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
  208. mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
  209. mqt/core/lib/pkgconfig/spdlog.pc +13 -0
  210. mqt/core/lib/spdlog.lib +0 -0
  211. mqt/core/na/__init__.py +12 -0
  212. mqt/core/na/fomac.cp311-win_arm64.pyd +0 -0
  213. mqt/core/na/fomac.pyi +117 -0
  214. mqt/core/nlohmann_json.natvis +278 -0
  215. mqt/core/plugins/qiskit/mqt_to_qiskit.py +75 -11
  216. mqt/core/plugins/qiskit/qiskit_to_mqt.py +108 -5
  217. mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +3 -0
  218. mqt/core/share/cmake/mqt-core/Cache.cmake +17 -16
  219. mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +6 -0
  220. mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +1 -1
  221. mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +3 -3
  222. mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +3 -0
  223. mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +51 -0
  224. mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +124 -3
  225. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
  226. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
  227. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +110 -0
  228. mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
  229. mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
  230. mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
  231. mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
  232. mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
  233. mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
  234. mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
  235. mqt_core-3.3.0.dist-info/DELVEWHEEL +2 -0
  236. {mqt_core-3.2.1.dist-info → mqt_core-3.3.0.dist-info}/METADATA +74 -33
  237. {mqt_core-3.2.1.dist-info → mqt_core-3.3.0.dist-info}/RECORD +240 -46
  238. {mqt_core-3.2.1.dist-info → mqt_core-3.3.0.dist-info}/WHEEL +1 -1
  239. mqt/core/include/mqt-core/ir/operations/ClassicControlledOperation.hpp +0 -156
  240. mqt_core-3.2.1.dist-info/DELVEWHEEL +0 -2
  241. {mqt_core-3.2.1.dist-info → mqt_core-3.3.0.dist-info}/entry_points.txt +0 -0
  242. {mqt_core-3.2.1.dist-info → mqt_core-3.3.0.dist-info}/licenses/LICENSE.md +0 -0
@@ -0,0 +1,177 @@
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
+ // multi producer-multi consumer blocking queue.
7
+ // enqueue(..) - will block until room found to put the new message.
8
+ // enqueue_nowait(..) - will return immediately with false if no room left in
9
+ // the queue.
10
+ // dequeue_for(..) - will block until the queue is not empty or timeout have
11
+ // passed.
12
+
13
+ #include <spdlog/details/circular_q.h>
14
+
15
+ #include <atomic>
16
+ #include <condition_variable>
17
+ #include <mutex>
18
+
19
+ namespace spdlog {
20
+ namespace details {
21
+
22
+ template <typename T>
23
+ class mpmc_blocking_queue {
24
+ public:
25
+ using item_type = T;
26
+ explicit mpmc_blocking_queue(size_t max_items)
27
+ : q_(max_items) {}
28
+
29
+ #ifndef __MINGW32__
30
+ // try to enqueue and block if no room left
31
+ void enqueue(T &&item) {
32
+ {
33
+ std::unique_lock<std::mutex> lock(queue_mutex_);
34
+ pop_cv_.wait(lock, [this] { return !this->q_.full(); });
35
+ q_.push_back(std::move(item));
36
+ }
37
+ push_cv_.notify_one();
38
+ }
39
+
40
+ // enqueue immediately. overrun oldest message in the queue if no room left.
41
+ void enqueue_nowait(T &&item) {
42
+ {
43
+ std::unique_lock<std::mutex> lock(queue_mutex_);
44
+ q_.push_back(std::move(item));
45
+ }
46
+ push_cv_.notify_one();
47
+ }
48
+
49
+ void enqueue_if_have_room(T &&item) {
50
+ bool pushed = false;
51
+ {
52
+ std::unique_lock<std::mutex> lock(queue_mutex_);
53
+ if (!q_.full()) {
54
+ q_.push_back(std::move(item));
55
+ pushed = true;
56
+ }
57
+ }
58
+
59
+ if (pushed) {
60
+ push_cv_.notify_one();
61
+ } else {
62
+ ++discard_counter_;
63
+ }
64
+ }
65
+
66
+ // dequeue with a timeout.
67
+ // Return true, if succeeded dequeue item, false otherwise
68
+ bool dequeue_for(T &popped_item, std::chrono::milliseconds wait_duration) {
69
+ {
70
+ std::unique_lock<std::mutex> lock(queue_mutex_);
71
+ if (!push_cv_.wait_for(lock, wait_duration, [this] { return !this->q_.empty(); })) {
72
+ return false;
73
+ }
74
+ popped_item = std::move(q_.front());
75
+ q_.pop_front();
76
+ }
77
+ pop_cv_.notify_one();
78
+ return true;
79
+ }
80
+
81
+ // blocking dequeue without a timeout.
82
+ void dequeue(T &popped_item) {
83
+ {
84
+ std::unique_lock<std::mutex> lock(queue_mutex_);
85
+ push_cv_.wait(lock, [this] { return !this->q_.empty(); });
86
+ popped_item = std::move(q_.front());
87
+ q_.pop_front();
88
+ }
89
+ pop_cv_.notify_one();
90
+ }
91
+
92
+ #else
93
+ // apparently mingw deadlocks if the mutex is released before cv.notify_one(),
94
+ // so release the mutex at the very end each function.
95
+
96
+ // try to enqueue and block if no room left
97
+ void enqueue(T &&item) {
98
+ std::unique_lock<std::mutex> lock(queue_mutex_);
99
+ pop_cv_.wait(lock, [this] { return !this->q_.full(); });
100
+ q_.push_back(std::move(item));
101
+ push_cv_.notify_one();
102
+ }
103
+
104
+ // enqueue immediately. overrun oldest message in the queue if no room left.
105
+ void enqueue_nowait(T &&item) {
106
+ std::unique_lock<std::mutex> lock(queue_mutex_);
107
+ q_.push_back(std::move(item));
108
+ push_cv_.notify_one();
109
+ }
110
+
111
+ void enqueue_if_have_room(T &&item) {
112
+ bool pushed = false;
113
+ std::unique_lock<std::mutex> lock(queue_mutex_);
114
+ if (!q_.full()) {
115
+ q_.push_back(std::move(item));
116
+ pushed = true;
117
+ }
118
+
119
+ if (pushed) {
120
+ push_cv_.notify_one();
121
+ } else {
122
+ ++discard_counter_;
123
+ }
124
+ }
125
+
126
+ // dequeue with a timeout.
127
+ // Return true, if succeeded dequeue item, false otherwise
128
+ bool dequeue_for(T &popped_item, std::chrono::milliseconds wait_duration) {
129
+ std::unique_lock<std::mutex> lock(queue_mutex_);
130
+ if (!push_cv_.wait_for(lock, wait_duration, [this] { return !this->q_.empty(); })) {
131
+ return false;
132
+ }
133
+ popped_item = std::move(q_.front());
134
+ q_.pop_front();
135
+ pop_cv_.notify_one();
136
+ return true;
137
+ }
138
+
139
+ // blocking dequeue without a timeout.
140
+ void dequeue(T &popped_item) {
141
+ std::unique_lock<std::mutex> lock(queue_mutex_);
142
+ push_cv_.wait(lock, [this] { return !this->q_.empty(); });
143
+ popped_item = std::move(q_.front());
144
+ q_.pop_front();
145
+ pop_cv_.notify_one();
146
+ }
147
+
148
+ #endif
149
+
150
+ size_t overrun_counter() {
151
+ std::lock_guard<std::mutex> lock(queue_mutex_);
152
+ return q_.overrun_counter();
153
+ }
154
+
155
+ size_t discard_counter() { return discard_counter_.load(std::memory_order_relaxed); }
156
+
157
+ size_t size() {
158
+ std::lock_guard<std::mutex> lock(queue_mutex_);
159
+ return q_.size();
160
+ }
161
+
162
+ void reset_overrun_counter() {
163
+ std::lock_guard<std::mutex> lock(queue_mutex_);
164
+ q_.reset_overrun_counter();
165
+ }
166
+
167
+ void reset_discard_counter() { discard_counter_.store(0, std::memory_order_relaxed); }
168
+
169
+ private:
170
+ std::mutex queue_mutex_;
171
+ std::condition_variable push_cv_;
172
+ std::condition_variable pop_cv_;
173
+ spdlog::details::circular_q<T> q_;
174
+ std::atomic<size_t> discard_counter_{0};
175
+ };
176
+ } // namespace details
177
+ } // namespace spdlog
@@ -0,0 +1,35 @@
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 <atomic>
7
+ #include <utility>
8
+ // null, no cost dummy "mutex" and dummy "atomic" int
9
+
10
+ namespace spdlog {
11
+ namespace details {
12
+ struct null_mutex {
13
+ void lock() const {}
14
+ void unlock() const {}
15
+ };
16
+
17
+ struct null_atomic_int {
18
+ int value;
19
+ null_atomic_int() = default;
20
+
21
+ explicit null_atomic_int(int new_value)
22
+ : value(new_value) {}
23
+
24
+ int load(std::memory_order = std::memory_order_relaxed) const { return value; }
25
+
26
+ void store(int new_value, std::memory_order = std::memory_order_relaxed) { value = new_value; }
27
+
28
+ int exchange(int new_value, std::memory_order = std::memory_order_relaxed) {
29
+ std::swap(new_value, value);
30
+ return new_value; // return value before the call
31
+ }
32
+ };
33
+
34
+ } // namespace details
35
+ } // namespace spdlog