WPILibC++  unspecified
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Pages
ConcurrentQueue.h
1 //
2 // Copyright (c) 2013 Juan Palacios juan.palacios.puyana@gmail.com
3 // Subject to the BSD 2-Clause License
4 // - see < http://opensource.org/licenses/BSD-2-Clause>
5 //
6 
7 #ifndef NT_SUPPORT_CONCURRENT_QUEUE_H_
8 #define NT_SUPPORT_CONCURRENT_QUEUE_H_
9 
10 #include <queue>
11 #include <thread>
12 #include <mutex>
13 #include <condition_variable>
14 
15 template <typename T>
17  public:
18  bool empty() const {
19  std::unique_lock<std::mutex> mlock(mutex_);
20  return queue_.empty();
21  }
22 
23  typename std::queue<T>::size_type size() const {
24  std::unique_lock<std::mutex> mlock(mutex_);
25  return queue_.size();
26  }
27 
28  T pop() {
29  std::unique_lock<std::mutex> mlock(mutex_);
30  while (queue_.empty()) {
31  cond_.wait(mlock);
32  }
33  auto item = std::move(queue_.front());
34  queue_.pop();
35  return item;
36  }
37 
38  void pop(T& item) {
39  std::unique_lock<std::mutex> mlock(mutex_);
40  while (queue_.empty()) {
41  cond_.wait(mlock);
42  }
43  item = queue_.front();
44  queue_.pop();
45  }
46 
47  void push(const T& item) {
48  std::unique_lock<std::mutex> mlock(mutex_);
49  queue_.push(item);
50  mlock.unlock();
51  cond_.notify_one();
52  }
53 
54  void push(T&& item) {
55  std::unique_lock<std::mutex> mlock(mutex_);
56  queue_.push(std::forward<T>(item));
57  mlock.unlock();
58  cond_.notify_one();
59  }
60 
61  template <typename... Args>
62  void emplace(Args&&... args) {
63  std::unique_lock<std::mutex> mlock(mutex_);
64  queue_.emplace(std::forward<Args>(args)...);
65  mlock.unlock();
66  cond_.notify_one();
67  }
68 
69  ConcurrentQueue() = default;
70  ConcurrentQueue(const ConcurrentQueue&) = delete;
71  ConcurrentQueue& operator=(const ConcurrentQueue&) = delete;
72 
73  private:
74  std::queue<T> queue_;
75  mutable std::mutex mutex_;
76  std::condition_variable cond_;
77 };
78 
79 #endif // NT_SUPPORT_CONCURRENT_QUEUE_H_
Definition: ConcurrentQueue.h:16