Gamedev Framework (gf) 1.2.0
A C++17 framework for 2D games
Queue.h
1/*
2 * Gamedev Framework (gf)
3 * Copyright (C) 2016-2022 Julien Bernard
4 *
5 * This software is provided 'as-is', without any express or implied
6 * warranty. In no event will the authors be held liable for any damages
7 * arising from the use of this software.
8 *
9 * Permission is granted to anyone to use this software for any purpose,
10 * including commercial applications, and to alter it and redistribute it
11 * freely, subject to the following restrictions:
12 *
13 * 1. The origin of this software must not be misrepresented; you must not
14 * claim that you wrote the original software. If you use this software
15 * in a product, an acknowledgment in the product documentation would be
16 * appreciated but is not required.
17 * 2. Altered source versions must be plainly marked as such, and must not be
18 * misrepresented as being the original software.
19 * 3. This notice may not be removed or altered from any source distribution.
20 */
21#ifndef GF_QUEUE_H
22#define GF_QUEUE_H
23
24#include <condition_variable>
25#include <deque>
26#include <mutex>
27
28namespace gf {
29#ifndef DOXYGEN_SHOULD_SKIP_THIS
30inline namespace v1 {
31#endif
32
41 template<typename T>
42 class Queue {
43 public:
50 bool poll(T& value) {
51 std::lock_guard<std::mutex> lock(m_mutex);
52
53 if (m_queue.empty()) {
54 return false;
55 }
56
57 value = m_queue.front();
58 m_queue.pop_front();
59 return true;
60 }
61
67 void wait(T& value) {
68 std::unique_lock<std::mutex> lock(m_mutex);
69 m_condition.wait(lock, [this]() { return !m_queue.empty(); });
70 value = m_queue.front();
71 m_queue.pop_front();
72 }
73
79 void push(const T& value) {
80 std::lock_guard<std::mutex> lock(m_mutex);
81 m_queue.push_back(value);
82 m_condition.notify_one();
83 }
84
90 void push(T&& value) {
91 std::lock_guard<std::mutex> lock(m_mutex);
92 m_queue.push_back(std::move(value));
93 m_condition.notify_one();
94 }
95
99 void clear() {
100 std::lock_guard<std::mutex> lock(m_mutex);
101 m_queue.clear();
102 }
103
104 private:
105 std::mutex m_mutex;
106 std::condition_variable m_condition;
107 std::deque<T> m_queue;
108 };
109
110#ifndef DOXYGEN_SHOULD_SKIP_THIS
111}
112#endif
113}
114
115#endif // GF_QUEUE_H
A simple concurrent queue.
Definition: Queue.h:42
void clear()
Clear the queue.
Definition: Queue.h:99
void push(const T &value)
Push a value on the queue.
Definition: Queue.h:79
bool poll(T &value)
Poll a value from the queue, if possible.
Definition: Queue.h:50
void wait(T &value)
Wait for a value from the queue.
Definition: Queue.h:67
void push(T &&value)
Push a value on the queue.
Definition: Queue.h:90
The namespace for gf classes.