File tree Expand file tree Collapse file tree 1 file changed +13
-1
lines changed Expand file tree Collapse file tree 1 file changed +13
-1
lines changed Original file line number Diff line number Diff line change @@ -71,6 +71,18 @@ class BoundedQueue {
71
71
T* pool_ = nullptr ;
72
72
std::unique_ptr<WaitStrategy> wait_strategy_ = nullptr ;
73
73
volatile bool break_all_wait_ = false ;
74
+
75
+ template <typename U = T>
76
+ typename std::enable_if<std::is_move_assignable<U>::value, void >::type
77
+ assign (T* element, uint64_t new_head) {
78
+ *element = std::move (pool_[GetIndex (new_head)]);
79
+ }
80
+
81
+ template <typename U = T>
82
+ typename std::enable_if<!std::is_move_assignable<U>::value, void >::type
83
+ assign (T* element, uint64_t new_head) {
84
+ *element = pool_[GetIndex (new_head)];
85
+ }
74
86
};
75
87
76
88
template <typename T>
@@ -161,10 +173,10 @@ bool BoundedQueue<T>::Dequeue(T* element) {
161
173
if (new_head == commit_.load (std::memory_order_acquire)) {
162
174
return false ;
163
175
}
164
- *element = pool_[GetIndex (new_head)];
165
176
} while (!head_.compare_exchange_weak (old_head, new_head,
166
177
std::memory_order_acq_rel,
167
178
std::memory_order_relaxed));
179
+ assign (element, new_head);
168
180
return true ;
169
181
}
170
182
You can’t perform that action at this time.
0 commit comments