gtsam_points
Loading...
Searching...
No Matches
concurrent_queue.hpp
Go to the documentation of this file.
1#ifndef GUIK_CONCURRENT_QUEUE_HPP
2#define GUIK_CONCURRENT_QUEUE_HPP
3
4#include <deque>
5#include <mutex>
6
7namespace guik {
8
9template <typename T>
11public:
12 virtual ~ConcurrentQueue() {}
13
14 virtual size_t size() const = 0;
15 virtual void push(const T& item) = 0;
16 virtual std::vector<T> try_pop(int max_num_items) = 0;
17};
18
19template <typename T>
21public:
23 virtual ~StdConcurrentQueue() override {}
24
25 virtual size_t size() const override {
26 std::lock_guard<std::mutex> lock(mutex);
27 return queue.size();
28 }
29
30 virtual void push(const T& item) override {
31 std::lock_guard<std::mutex> lock(mutex);
32 queue.push_back(item);
33 }
34
35 virtual std::vector<T> try_pop(int max_num_items) override {
36 std::lock_guard<std::mutex> lock(mutex);
37
38 if (queue.empty()) {
39 return {};
40 }
41
42 if (queue.size() <= max_num_items) {
43 std::vector<T> items(queue.begin(), queue.end());
44 queue.clear();
45 return items;
46 }
47
48 std::vector<T> items(queue.begin(), queue.begin() + max_num_items);
49 queue.erase(queue.begin(), queue.begin() + max_num_items);
50 return items;
51 }
52
53private:
54 mutable std::mutex mutex;
55 std::deque<T> queue;
56};
57
58} // namespace guik
59
60#endif
Definition concurrent_queue.hpp:10
virtual size_t size() const =0
virtual ~ConcurrentQueue()
Definition concurrent_queue.hpp:12
virtual void push(const T &item)=0
virtual std::vector< T > try_pop(int max_num_items)=0
Definition concurrent_queue.hpp:20
virtual std::vector< T > try_pop(int max_num_items) override
Definition concurrent_queue.hpp:35
virtual size_t size() const override
Definition concurrent_queue.hpp:25
StdConcurrentQueue()
Definition concurrent_queue.hpp:22
virtual ~StdConcurrentQueue() override
Definition concurrent_queue.hpp:23
virtual void push(const T &item) override
Definition concurrent_queue.hpp:30
Definition drawable_container.hpp:9