rmcv  v0.1.0
A library for RoboMaster computer vision based on OpenCV.
parallequeue.hpp
1 //
2 // Created by yaione on 3/13/22.
3 //
4 
5 #ifndef RMCV_PARALLEQUEUE_HPP
6 #define RMCV_PARALLEQUEUE_HPP
7 
8 #include <mutex>
9 #include <condition_variable>
10 #include <deque>
11 #include <queue>
12 #include <memory>
13 
14 namespace rm {
15  template<typename DATATYPE, typename SEQUENCE = std::deque<DATATYPE>>
16  class ParallelQueue {
17  private:
18  std::condition_variable m_cond;
19  std::queue<DATATYPE, SEQUENCE> m_data;
20  mutable std::mutex m_mutex;
21 
22  public:
23  ParallelQueue() = default;
24 
25  ParallelQueue(ParallelQueue &&) = delete;
26 
27  ~ParallelQueue() = default;
28 
29  ParallelQueue &operator=(const ParallelQueue &) = delete;
30 
31  bool Empty() const {
32  std::lock_guard<std::mutex> lg(m_mutex);
33  return m_data.empty();
34  }
35 
36  ParallelQueue(const ParallelQueue &other) {
37  std::lock_guard<std::mutex> lg(other.m_mutex);
38  m_data = other.m_data;
39  }
40 
41  void push(const DATATYPE &data) {
42  std::lock_guard<std::mutex> lg(m_mutex);
43  m_data.push(data);
44  m_cond.notify_one();
45  }
46 
47  void push(DATATYPE &&data) {
48  std::lock_guard<std::mutex> lg(m_mutex);
49  m_data.push(std::move(data));
50  m_cond.notify_one();
51  }
52 
53  std::shared_ptr<DATATYPE> tryPop() {
54  std::lock_guard<std::mutex> lg(m_mutex);
55  if (m_data.empty()) return {};
56  auto res = std::make_shared<DATATYPE>(m_data.front());
57  m_data.pop();
58  return res;
59  }
60 
61  std::shared_ptr<DATATYPE> pop() {
62  std::unique_lock<std::mutex> lg(m_mutex);
63  m_cond.wait(lg, [this] { return !m_data.empty(); });
64  auto res = std::make_shared<DATATYPE>(std::move(m_data.front()));
65  m_data.pop();
66  return res;
67  }
68  };
69 }
70 
71 #endif //RMCV_PARALLEQUEUE_HPP
rm::ParallelQueue
Definition: parallequeue.hpp:16
rm
Main modules.
Definition: daheng.h:17