sequencer
thread_safe_queue.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <deque>
4 #include <mutex>
5 #include <optional>
6 
7 namespace sequencer
8 {
9  template < class T, typename std::deque< T >::size_type max_size =
10  std::numeric_limits< typename std::deque< T >::size_type >::max() >
12  {
13  public:
14  using size_type = typename std::deque< T >::size_type;
15 
16  thread_safe_queue_t() = default;
17 
18  thread_safe_queue_t( const thread_safe_queue_t& ) = delete;
19 
20  thread_safe_queue_t( thread_safe_queue_t&& other ) = delete;
21 
23 
25 
26  bool push( const T& entry )
27  {
28  std::lock_guard< std::mutex > lock( m_mutex );
29 
30  if ( m_queue.size() == max_size )
31  return false;
32 
33  m_queue.push_back( entry );
34  return true;
35  }
36 
37  bool push( T&& entry )
38  {
39  std::lock_guard< std::mutex > lock( m_mutex );
40 
41  if ( m_queue.size() == max_size )
42  return false;
43 
44  m_queue.push_back( std::move( entry ) );
45  return true;
46  }
47 
48  template < class... Args >
49  bool emplace( Args&&... args )
50  {
51  std::lock_guard< std::mutex > lock( m_mutex );
52 
53  if ( m_queue.size() == max_size )
54  return false;
55 
56  m_queue.emplace_back( std::forward< Args >( args )... );
57  return true;
58  }
59 
60  std::optional< T > try_pop()
61  {
62  std::lock_guard< std::mutex > lock( m_mutex );
63  if ( m_queue.empty() )
64  {
65  return {};
66  }
67 
68  auto entry = std::move( m_queue.front() );
69  m_queue.pop_front();
70  return entry;
71  }
72 
73  void clear()
74  {
75  std::lock_guard< std::mutex > lock( m_mutex );
76  m_queue.clear();
77  }
78 
79  private:
80  std::mutex m_mutex;
81  std::deque< T > m_queue;
82  };
83 } // namespace sequencer
thread_safe_queue_t & operator=(const thread_safe_queue_t &)=delete
void clear()
Definition: thread_safe_queue.hpp:73
bool push(const T &entry)
Definition: thread_safe_queue.hpp:26
bool emplace(Args &&... args)
Definition: thread_safe_queue.hpp:49
bool push(T &&entry)
Definition: thread_safe_queue.hpp:37
Definition: thread_safe_queue.hpp:11
typename std::deque< Task >::size_type size_type
Definition: thread_safe_queue.hpp:14
std::optional< T > try_pop()
Definition: thread_safe_queue.hpp:60