Nix (Dev) 3.5.10
dev - 3.5.10 - 1af9301
Loading...
Searching...
No Matches
Queue.hpp
Go to the documentation of this file.
1#ifndef IV_SRC_CONTAINERS_QUEUE_HPP_
2#define IV_SRC_CONTAINERS_QUEUE_HPP_
3
4#include <condition_variable>
5#include <mutex>
6#include <queue>
7#include <type_traits>
8
9namespace iv::containers
10{
11
12template<typename T, uint64_t Size>
13class Queue
14{
15public:
16 Queue() = default;
17 Queue(const Queue &) = delete;
18
19 virtual ~Queue()
20 {
21 clear();
22 }
23
24 Queue &operator=(const Queue &other) = delete;
25
26 void pop(T &item)
27 {
28 std::scoped_lock lock(m_mutex);
29
30 while (m_data.empty())
31 {
32 m_cond.wait(lock);
33 }
34
35 item = m_data.front();
36 m_data.pop();
37 }
38
39 bool push(const T &item)
40 {
41 std::scoped_lock lock(m_mutex);
42
43 if (m_data.size() < Size)
44 {
45 m_data.push(item);
46 m_cond.notify_one();
47
48 return true;
49 }
50
51 return false;
52 }
53
54 void clear()
55 {
56 std::scoped_lock lock(m_mutex);
57
58 while (not m_data.empty())
59 {
60 if (std::is_pointer<T>::value)
61 {
62 T item = m_data.front();
63 m_data.pop();
64
65 delete item;
66 item = nullptr;
67 }
68 }
69 }
70
71 bool empty()
72 {
73 std::scoped_lock lock(m_mutex);
74 return m_data.empty();
75 }
76
77 bool full()
78 {
79 std::scoped_lock lock(m_mutex);
80 return m_data.size() == Size;
81 }
82
83private:
84 static_assert(std::is_default_constructible<T>::value, "T must be default constructible");
85 static_assert(Size >= 50, "Size is too small!");
86 static_assert(Size <= 5000, "Size is too long!");
87
88 std::queue<T> m_data;
89 std::mutex m_mutex;
90 std::condition_variable_any m_cond;
91};
92
93}// namespace iv::containers
94
95#endif//IV_SRC_CONTAINERS_QUEUE_HPP_
Definition Queue.hpp:14
Queue(const Queue &)=delete
bool push(const T &item)
Definition Queue.hpp:39
void clear()
Definition Queue.hpp:54
bool empty()
Definition Queue.hpp:71
std::condition_variable_any m_cond
Definition Queue.hpp:90
bool full()
Definition Queue.hpp:77
std::queue< T > m_data
Definition Queue.hpp:88
Queue & operator=(const Queue &other)=delete
void pop(T &item)
Definition Queue.hpp:26
virtual ~Queue()
Definition Queue.hpp:19
std::mutex m_mutex
Definition Queue.hpp:89
Definition CircularQueue.hpp:11