#pragma once #ifndef CONCURRENT_QUEUE_HPP #define CONCURRENT_QUEUE_HPP #include #include #include #include template class ConcurrentQueue { private: using queueType = std::queue; public: using sizeType = typename queueType::size_type; using valueType = typename queueType::value_type; using reference = typename queueType::reference; using constReference = typename queueType::const_reference; using containerType = typename queueType::container_type; ConcurrentQueue() = default; ConcurrentQueue(const ConcurrentQueue&) = delete; ~ConcurrentQueue() noexcept = default; ConcurrentQueue& operator=(const ConcurrentQueue&) = delete; void clear() { std::scoped_lock lock(mtx); while (!q.empty()) q.pop(); } [[nodiscard]] bool empty() const { std::scoped_lock lock(mtx); return q.empty(); } template void emplace(Ts&&... args) { std::scoped_lock lock(mtx); q.emplace(std::forward(args)...); } [[nodiscard]] std::optional tryPop() { std::scoped_lock lock(mtx); if (q.empty()) return std::nullopt; auto out = std::make_optional(std::move(q.front())); q.pop(); return out; } private: mutable std::mutex mtx; queueType q; }; #endif