about summary refs log tree commit diff stats
path: root/archive/2025/summer/bsc_karidas/include/BufferQueue.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'archive/2025/summer/bsc_karidas/include/BufferQueue.hpp')
-rw-r--r--archive/2025/summer/bsc_karidas/include/BufferQueue.hpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/archive/2025/summer/bsc_karidas/include/BufferQueue.hpp b/archive/2025/summer/bsc_karidas/include/BufferQueue.hpp
new file mode 100644
index 000000000..3a5ab3c08
--- /dev/null
+++ b/archive/2025/summer/bsc_karidas/include/BufferQueue.hpp
@@ -0,0 +1,49 @@
+#ifndef BUFFER_QUEUE_HPP
+#define BUFFER_QUEUE_HPP
+
+#include "QueueItem.hpp"
+#include "concurrentqueue.h"
+#include <atomic>
+#include <vector>
+#include <memory>
+#include <condition_variable>
+#include <chrono>
+
+class BufferQueue
+{
+public:
+    using ProducerToken = moodycamel::ProducerToken;
+    using ConsumerToken = moodycamel::ConsumerToken;
+
+private:
+    moodycamel::ConcurrentQueue<QueueItem> m_queue;
+
+public:
+    explicit BufferQueue(size_t capacity, size_t maxExplicitProducers);
+
+    ProducerToken createProducerToken() { return ProducerToken(m_queue); }
+    ConsumerToken createConsumerToken() { return ConsumerToken(m_queue); }
+
+    bool enqueueBlocking(QueueItem item,
+                         ProducerToken &token,
+                         std::chrono::milliseconds timeout = std::chrono::milliseconds::max());
+    bool enqueueBatchBlocking(std::vector<QueueItem> items,
+                              ProducerToken &token,
+                              std::chrono::milliseconds timeout = std::chrono::milliseconds::max());
+    bool tryDequeue(QueueItem &item, ConsumerToken &token);
+    size_t tryDequeueBatch(std::vector<QueueItem> &items, size_t maxItems, ConsumerToken &token);
+    bool flush();
+    size_t size() const;
+
+    // delete copy/move
+    BufferQueue(const BufferQueue &) = delete;
+    BufferQueue &operator=(const BufferQueue &) = delete;
+    BufferQueue(BufferQueue &&) = delete;
+    BufferQueue &operator=(BufferQueue &&) = delete;
+
+private:
+    bool enqueue(QueueItem item, ProducerToken &token);
+    bool enqueueBatch(std::vector<QueueItem> items, ProducerToken &token);
+};
+
+#endif
\ No newline at end of file