/** --------------------------------------------------------------------------- * @file: syncqueue.h * * Copyright (c) 2017 Yann Herklotz Grave * MIT License, see LICENSE file for more details. * ---------------------------------------------------------------------------- */ #pragma once #include #include #include namespace yage { template class SyncQueue { public: SyncQueue() = default; SyncQueue(const SyncQueue &) = delete; SyncQueue &operator=(const SyncQueue &) = delete; T pop(); void pop(T &item); void push(const T &item); void push(T &&item); private: std::queue queue_; std::mutex mutex_; std::condition_variable cond_; }; // Template definitions template T SyncQueue::pop() { std::unique_lock mlock(mutex_); while (queue_.empty()) { cond_.wait(mlock); } auto item = queue_.front(); queue_.pop(); return item; } template void SyncQueue::pop(T &item) { std::unique_lock mlock(mutex_); while (queue_.empty()) { cond_.wait(mlock); } item = queue_.front(); queue_.pop(); } template void SyncQueue::push(const T &item) { std::unique_lock mlock(mutex_); queue_.push(item); mlock.unlock(); cond_.notify_one(); } template void SyncQueue::push(T &&item) { std::unique_lock mlock(mutex_); queue_.push(std::move(item)); mlock.unlock(); cond_.notify_one(); } } // namespace yage