1 #ifndef theplu_yat_utility_basic_queue 2 #define theplu_yat_utility_basic_queue 23 #include <condition_variable> 35 template<
class Derived,
typename T,
class Container>
51 : capacity_(
std::numeric_limits<size_t>::
max())
59 std::unique_lock<std::mutex> lock(other.mutex_);
61 capacity_ = other.capacity_;
68 :
q_(container), capacity_(
std::numeric_limits<size_t>::
max())
79 std::unique_lock<std::mutex> lock(mutex_);
91 std::unique_lock<std::mutex> lock(mutex_);
96 push_condition_.notify_all();
106 std::unique_lock<std::mutex> lock(mutex_);
111 push_condition_.notify_all();
120 std::unique_lock<std::mutex> lock(mutex_);
134 std::unique_lock<std::mutex> lock(mutex_);
136 pop_condition_.wait(lock);
142 static_cast<Derived*
>(
this)->pop_impl(value, lock);
144 push_condition_.notify_one();
156 std::unique_lock<std::mutex> lock(mutex_);
157 while (
q_.size() >= capacity_)
158 push_condition_.wait(lock);
159 static_cast<Derived*
>(
this)->push_impl(t, lock);
163 pop_condition_.notify_one();
174 std::unique_lock<std::mutex> lock(mutex_);
175 while (
q_.size() >= capacity_)
176 push_condition_.wait(lock);
177 static_cast<Derived*
>(
this)->push_impl(std::move(t), lock);
181 pop_condition_.notify_one();
190 std::unique_lock<std::mutex> lock(mutex_);
201 std::unique_lock<std::mutex> lock(mutex_);
204 static_cast<Derived*
>(
this)->pop_impl(value, lock);
208 push_condition_.notify_one();
221 std::unique_lock<std::mutex> lock(mutex_);
222 if (
q_.size() >= capacity_)
224 static_cast<Derived*
>(
this)->push_impl(value, lock);
228 pop_condition_.notify_one();
241 std::unique_lock<std::mutex> lock(mutex_);
242 if (
q_.size() >= capacity_)
244 static_cast<Derived*
>(
this)->push_impl(std::move(value), lock);
248 pop_condition_.notify_one();
258 if (
this != &other) {
263 std::lock(mutex_, other.mutex_);
264 std::unique_lock<std::mutex> lock(mutex_, std::adopt_lock_t());
265 std::unique_lock<std::mutex> other_lock(other.mutex_,
266 std::adopt_lock_t());
268 capacity_ = other.capacity_;
275 mutable std::mutex mutex_;
276 std::condition_variable pop_condition_;
277 std::condition_variable push_condition_;
Container::size_type size_type
Definition: BasicQueue.h:45
void capacity(size_t c)
change maximal number of element stored in container
Definition: BasicQueue.h:89
bool try_push(T &&value)
Definition: BasicQueue.h:239
void clear(void)
clear queue
Definition: BasicQueue.h:104
bool try_push(T &value)
Definition: BasicQueue.h:219
BasicQueue(const BasicQueue &other)
Definition: BasicQueue.h:57
The Department of Theoretical Physics namespace as we define it.
bool try_pop(T &value)
Definition: BasicQueue.h:199
Definition: stl_utility.h:64
void assign(const BasicQueue &other)
Definition: BasicQueue.h:256
T max(const T &a, const T &b, const T &c)
Definition: stl_utility.h:699
size_t capacity(void)
Definition: BasicQueue.h:77
Definition: BasicQueue.h:36
BasicQueue(void)
Definition: BasicQueue.h:50
void push(const T &t)
insert an element into container
Definition: BasicQueue.h:154
void pop(T &value)
access next element in queue
Definition: BasicQueue.h:132
size_type size(void) const
Definition: BasicQueue.h:188
Container q_
data
Definition: BasicQueue.h:273
BasicQueue(const Container &container)
Definition: BasicQueue.h:67
void push(T &&t)
insert an element into container
Definition: BasicQueue.h:172
bool empty(void) const
Definition: BasicQueue.h:118
Container::value_type value_type
Type of object stored.
Definition: BasicQueue.h:40