RayMarching  0.0.1
Simple 3D engine based on a ray marching rendering
syncqueue.h
1 #ifndef RAYMARCHING_SYNCQUEUE_H
2 #define RAYMARCHING_SYNCQUEUE_H
3 
4 #include <queue>
5 #include <mutex>
6 #include <condition_variable>
7 
8 namespace RayMarching {
9 
16  template<typename T>
17  class SyncQueue {
18  private:
19  std::queue<T> _queue;
20  std::mutex _mutex;
21  std::condition_variable _cond;
22  public:
23 
27  SyncQueue() = default;
28 
32  ~SyncQueue() = default;
33 
38  bool empty();
39 
44  void enqueue(T element);
45 
50  T deque();
51  };
52 
53  template<typename T>
55  std::lock_guard<std::mutex> lk(_mutex);
56  return _queue.empty();
57  }
58 
59  template<typename T>
60  void SyncQueue<T>::enqueue(T element) {
61  std::lock_guard<std::mutex> lk(_mutex);
62  _queue.push(element);
63  _cond.notify_one();
64  }
65 
66  template<typename T>
68  std::unique_lock<std::mutex> lk(_mutex);
69  _cond.wait(lk, [this] { return !this->_queue.empty(); });
70  T val = _queue.front();
71  _queue.pop();
72  return val;
73  }
74 
75 }
76 #endif //RAYMARCHING_SYNCQUEUE_H
Basic synchronized Queue template.
Definition: syncqueue.h:17
bool empty()
Definition: syncqueue.h:54
T deque()
Definition: syncqueue.h:67
void enqueue(T element)
Definition: syncqueue.h:60
Namespace containing all tools implemented within RayMarching package.
Definition: algebra.h:9