4 #include <condition_variable>
7 namespace fly::detail {
15 template <
typename T,
typename Container>
19 using size_type =
typename Container::size_type;
51 template <
typename R,
typename P>
52 bool pop(T &item, std::chrono::duration<R, P> duration);
79 mutable std::mutex m_container_mutex;
80 Container m_container;
83 std::condition_variable m_push_condition;
87 template <
typename T,
typename Container>
91 std::unique_lock<std::mutex> lock(m_container_mutex);
92 push_internal(std::move(item));
95 m_push_condition.notify_one();
99 template <
typename T,
typename Container>
102 std::unique_lock<std::mutex> lock(m_container_mutex);
104 while (m_container.empty())
106 m_push_condition.wait(lock);
113 template <
typename T,
typename Container>
114 template <
typename R,
typename P>
117 std::unique_lock<std::mutex> lock(m_container_mutex);
119 auto empty_test = [
this] {
120 return !m_container.empty();
123 bool item_popped = m_push_condition.wait_for(lock, wait_time, std::move(empty_test));
134 template <
typename T,
typename Container>
137 std::unique_lock<std::mutex> lock(m_container_mutex);
138 return m_container.empty();
142 template <
typename T,
typename Container>
145 std::unique_lock<std::mutex> lock(m_container_mutex);
146 return m_container.size();
Definition: concurrent_container.hpp:17
size_type size() const
Definition: concurrent_container.hpp:143
void push(T &&item)
Definition: concurrent_container.hpp:88
virtual ~ConcurrentContainer()=default
virtual void push_internal(T &&item)=0
virtual void pop_internal(T &item)=0
void pop(T &item)
Definition: concurrent_container.hpp:100
bool empty() const
Definition: concurrent_container.hpp:135
bool pop(T &item, std::chrono::duration< R, P > duration)
Definition: concurrent_container.hpp:115