#ifndef WEBCC_QUEUE_H_ #define WEBCC_QUEUE_H_ // A general message queue. #include #include #include #include namespace webcc { template class Queue { public: Queue() = default; Queue(const Queue&) = delete; Queue& operator=(const Queue&) = delete; T PopOrWait() { std::unique_lock lock(mutex_); // Wait for a message. not_empty_cv_.wait(lock, [this] { return !message_list_.empty(); }); T message = message_list_.front(); message_list_.pop_front(); return message; } T Pop() { std::lock_guard lock(mutex_); if (message_list_.empty()) { return T(); } T message = message_list_.front(); message_list_.pop_front(); return message; } void Clear() { std::lock_guard lock(mutex_); message_list_.clear(); } void Push(const T& message) { { std::lock_guard lock(mutex_); message_list_.push_back(message); } not_empty_cv_.notify_one(); } std::size_t Size() const { std::lock_guard lock(mutex_); return message_list_.size(); } private: std::list message_list_; mutable std::mutex mutex_; std::condition_variable not_empty_cv_; }; } // namespace webcc #endif // WEBCC_QUEUE_H_