Sirius  0.0.0
concurrent_queue.h
Go to the documentation of this file.
1 
22 #ifndef SIRIUS_UTILS_CONCURRENT_QUEUE_H_
23 #define SIRIUS_UTILS_CONCURRENT_QUEUE_H_
24 
25 #include <condition_variable>
26 #include <mutex>
27 #include <queue>
28 #include <system_error>
29 
30 namespace sirius {
31 namespace utils {
32 
45 template <typename T>
47  public:
55  ConcurrentQueue(std::size_t max_queue_size = 10);
56  ~ConcurrentQueue() = default;
57 
58  ConcurrentQueue(const ConcurrentQueue&) = delete;
59  ConcurrentQueue& operator=(const ConcurrentQueue&) = delete;
60  ConcurrentQueue(ConcurrentQueue&&) = delete;
62 
73  void Push(T&& element, std::error_code& ec);
74 
85  T Pop(std::error_code& ec);
86 
92  std::size_t Size();
93 
99  bool Empty();
100 
106  bool CanPop();
107 
113  void Activate();
114 
120  void Deactivate();
121 
128  void DeactivateAndClear();
129 
135  bool IsActive();
136 
137  private:
138  std::mutex queue_mutex_;
139  bool is_active_{true};
140  std::size_t max_queue_size_{10};
141  std::queue<T> queue_;
142  std::condition_variable push_cond_;
143  std::condition_variable pop_cond_;
144 };
145 
146 } // namespace utils
147 } // namespace sirius
148 
149 #include "sirius/utils/concurrent_queue.txx"
150 
151 #endif // SIRIUS_UTILS_CONCURRENT_QUEUE_H_
bool Empty()
Queue is empty.
Concurrent queue.
Definition: concurrent_queue.h:46
std::size_t Size()
Get queue size.
bool IsActive()
Can the queue be filled with new elements.
Definition: exception.h:27
void Push(T &&element, std::error_code &ec)
Push an element in the queue.
ConcurrentQueue & operator=(const ConcurrentQueue &)=delete
T Pop(std::error_code &ec)
Pop an element from the queue.
bool CanPop()
Elements can be popped from the queue.
void DeactivateAndClear()
Deactivate the queue and clear its content.
ConcurrentQueue(std::size_t max_queue_size=10)
Instanciate a concurrent queue with a maximum size.
void Activate()
Activate the queue.
void Deactivate()
Deactivate the queue.