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.
- mqt/core/__init__.py +3 -3
- mqt/core/_commands.py +2 -2
- mqt/core/_version.py +16 -3
- 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.cp311-win_arm64.pyd +0 -0
- mqt/core/dd.pyi +5 -7
- mqt/core/fomac.cp311-win_arm64.pyd +0 -0
- mqt/core/fomac.pyi +125 -0
- mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +13 -0
- mqt/core/include/mqt-core/dd/CachedEdge.hpp +7 -0
- mqt/core/include/mqt-core/dd/Operations.hpp +12 -14
- mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
- mqt/core/include/mqt-core/ir/QuantumComputation.hpp +29 -28
- mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +2 -0
- mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
- mqt/core/include/mqt-core/ir/operations/OpType.hpp +3 -0
- mqt/core/include/mqt-core/ir/operations/OpType.inc +2 -2
- mqt/core/include/mqt-core/ir/operations/Operation.hpp +3 -1
- mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +2 -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/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/fomac/Device.hpp +169 -0
- mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -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 +83 -45
- mqt/core/ir/operations.pyi +40 -27
- mqt/core/ir.cp311-win_arm64.pyd +0 -0
- mqt/core/lib/cmake/spdlog/spdlogConfig.cmake +44 -0
- mqt/core/lib/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
- mqt/core/lib/cmake/spdlog/spdlogConfigTargets.cmake +119 -0
- mqt/core/lib/cmake/spdlog/spdlogConfigVersion.cmake +65 -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-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-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/pkgconfig/spdlog.pc +13 -0
- mqt/core/lib/spdlog.lib +0 -0
- mqt/core/na/__init__.py +12 -0
- mqt/core/na/fomac.cp311-win_arm64.pyd +0 -0
- mqt/core/na/fomac.pyi +117 -0
- mqt/core/nlohmann_json.natvis +278 -0
- mqt/core/plugins/qiskit/mqt_to_qiskit.py +75 -11
- mqt/core/plugins/qiskit/qiskit_to_mqt.py +108 -5
- mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +3 -0
- mqt/core/share/cmake/mqt-core/Cache.cmake +17 -16
- mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +6 -0
- mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +1 -1
- mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +3 -3
- mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +3 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +51 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +124 -3
- 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/pkgconfig/nlohmann_json.pc +7 -0
- mqt_core-3.3.0.dist-info/DELVEWHEEL +2 -0
- {mqt_core-3.2.1.dist-info → mqt_core-3.3.0.dist-info}/METADATA +74 -33
- {mqt_core-3.2.1.dist-info → mqt_core-3.3.0.dist-info}/RECORD +240 -46
- {mqt_core-3.2.1.dist-info → mqt_core-3.3.0.dist-info}/WHEEL +1 -1
- mqt/core/include/mqt-core/ir/operations/ClassicControlledOperation.hpp +0 -156
- mqt_core-3.2.1.dist-info/DELVEWHEEL +0 -2
- {mqt_core-3.2.1.dist-info → mqt_core-3.3.0.dist-info}/entry_points.txt +0 -0
- {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
|