WPILibC++  unspecified
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 WPIUTIL_SUPPORT_CONCURRENT_QUEUE_H_
8 #define WPIUTIL_SUPPORT_CONCURRENT_QUEUE_H_
9 
10 #include <queue>
11 #include <thread>
12 #include <mutex>
13 #include <condition_variable>
14 
15 namespace wpi {
16 
17 template <typename T>
19  public:
20  bool empty() const {
21  std::unique_lock<std::mutex> mlock(mutex_);
22  return queue_.empty();
23  }
24 
25  typename std::queue<T>::size_type size() const {
26  std::unique_lock<std::mutex> mlock(mutex_);
27  return queue_.size();
28  }
29 
30  T pop() {
31  std::unique_lock<std::mutex> mlock(mutex_);
32  while (queue_.empty()) {
33  cond_.wait(mlock);
34  }
35  auto item = std::move(queue_.front());
36  queue_.pop();
37  return item;
38  }
39 
40  void pop(T& item) {
41  std::unique_lock<std::mutex> mlock(mutex_);
42  while (queue_.empty()) {
43  cond_.wait(mlock);
44  }
45  item = queue_.front();
46  queue_.pop();
47  }
48 
49  void push(const T& item) {
50  std::unique_lock<std::mutex> mlock(mutex_);
51  queue_.push(item);
52  mlock.unlock();
53  cond_.notify_one();
54  }
55 
56  void push(T&& item) {
57  std::unique_lock<std::mutex> mlock(mutex_);
58  queue_.push(std::forward<T>(item));
59  mlock.unlock();
60  cond_.notify_one();
61  }
62 
63  template <typename... Args>
64  void emplace(Args&&... args) {
65  std::unique_lock<std::mutex> mlock(mutex_);
66  queue_.emplace(std::forward<Args>(args)...);
67  mlock.unlock();
68  cond_.notify_one();
69  }
70 
71  ConcurrentQueue() = default;
72  ConcurrentQueue(const ConcurrentQueue&) = delete;
73  ConcurrentQueue& operator=(const ConcurrentQueue&) = delete;
74 
75  private:
76  std::queue<T> queue_;
77  mutable std::mutex mutex_;
78  std::condition_variable cond_;
79 };
80 
81 } // namespace wpi
82 
83 #endif // WPIUTIL_SUPPORT_CONCURRENT_QUEUE_H_
Definition: SocketError.cpp:18
Definition: ConcurrentQueue.h:18