Babel
Epitech's C++ VoIP project
TSQueue.hpp
Go to the documentation of this file.
1 //
2 // Created by cbihan on 28/09/2021.
3 //
4 
5 #pragma once
6 
7 #include <mutex>
8 #include <condition_variable>
9 #include <deque>
10 #include <chrono>
11 
12 namespace Babel
13 {
16  template<typename T>
17  class TSQueue
18  {
19  public:
20  TSQueue() = default;
21 
22  TSQueue(const TSQueue<T> &) = delete;
23 
25  {
26  this->clear();
27  };
28 
30  const T &front()
31  {
32  std::scoped_lock lock(this->_mutex);
33  return this->_queue.front();
34  }
35 
37  const T &back()
38  {
39  std::scoped_lock lock(this->_mutex);
40  return this->_queue.back();
41  }
42 
45  {
46  std::scoped_lock lock(this->_mutex);
47  auto t = std::move(this->_queue.front());
48  this->_queue.pop_front();
49  return t;
50  }
51 
53  T popBack()
54  {
55  std::scoped_lock lock(this->_mutex);
56  auto t = std::move(this->_queue.back());
57  this->_queue.pop_back();
58  return t;
59  }
60 
62  void pushFront(const T &t)
63  {
64  std::scoped_lock lock(this->_mutex);
65  this->_queue.push_front(t);
66  this->_blocker.notify_one();
67  }
68 
70  void pushBack(const T &t)
71  {
72  std::scoped_lock lock(this->_mutex);
73  this->_queue.push_back(t);
74  this->_blocker.notify_one();
75  }
76 
78  bool empty()
79  {
80  std::scoped_lock lock(this->_mutex);
81  return this->_queue.empty();
82  }
83 
85  size_t count()
86  {
87  std::scoped_lock lock(this->_mutex);
88  return this->_queue.size();
89  }
90 
92  void clear()
93  {
94  std::scoped_lock lock(this->_mutex);
95  this->_queue.clear();
96  }
97 
100  template<typename TimeType>
101  void waitFor(std::chrono::duration<TimeType> time)
102  {
103  using namespace std::chrono_literals;
104  std::unique_lock<std::mutex> ul(this->_waitMutex);
105  this->_blocker.wait_for(ul, time);
106  }
107 
108  protected:
109  std::mutex _mutex;
110  std::deque<T> _queue;
111  std::condition_variable _blocker;
112  std::mutex _waitMutex;
113  };
114 }
Babel::TSQueue::pushBack
void pushBack(const T &t)
Adds an element to the beginning of the queue.
Definition: TSQueue.hpp:70
Babel::TSQueue::pushFront
void pushFront(const T &t)
Adds an element to the beginning of the queue.
Definition: TSQueue.hpp:62
Babel::TSQueue::count
size_t count()
Returns the number of elements in the queue.
Definition: TSQueue.hpp:85
Babel::TSQueue::TSQueue
TSQueue()=default
Babel
Definition: IAudioManager.hpp:13
Babel::TSQueue::_queue
std::deque< T > _queue
Definition: TSQueue.hpp:110
Babel::TSQueue::popBack
T popBack()
Removes and returns the last element of the queue.
Definition: TSQueue.hpp:53
Babel::TSQueue::clear
void clear()
Removes every elements in the queue.
Definition: TSQueue.hpp:92
Babel::TSQueue
Thread Safe queue.
Definition: TSQueue.hpp:17
Babel::TSQueue::waitFor
void waitFor(std::chrono::duration< TimeType > time)
Block a thread until the queue is non empty or the timeout is reached.
Definition: TSQueue.hpp:101
Babel::TSQueue::empty
bool empty()
Returns true if the queue is empty, false otherwise.
Definition: TSQueue.hpp:78
Babel::TSQueue::_mutex
std::mutex _mutex
Definition: TSQueue.hpp:109
Babel::TSQueue::front
const T & front()
Returns a constant reference to the first element of the queue.
Definition: TSQueue.hpp:30
Babel::TSQueue::~TSQueue
~TSQueue()
Definition: TSQueue.hpp:24
Babel::TSQueue::_waitMutex
std::mutex _waitMutex
Definition: TSQueue.hpp:112
Babel::TSQueue::_blocker
std::condition_variable _blocker
Definition: TSQueue.hpp:111
Babel::TSQueue::back
const T & back()
Returns a constant reference to the last element of the queue.
Definition: TSQueue.hpp:37
Babel::TSQueue::popFront
T popFront()
Removes and returns the first element of the queue.
Definition: TSQueue.hpp:44