#pragma once #include #include #include #include namespace data { /// Thread safe queue template class safe_queue { private: std::queue queue; std::mutex mutex; std::condition_variable cv; public: void push(const T& in) { std::unique_lock lock(mutex); queue.push(in); cv.notify_one(); } bool pop(T& out) { std::unique_lock lock(mutex); if (queue.empty()) return false; out = queue.front(); queue.pop(); return true; } bool empty() { std::unique_lock lock(mutex); return queue.empty(); } size_t size() { std::unique_lock lock(mutex); return queue.size(); } void notify() { cv.notify_all(); } void wait() { std::unique_lock lock(mutex); if(queue.empty()) cv.wait(lock); } }; }