File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -486,6 +486,9 @@ namespace daking {
486486 DAKING_ALWAYS_INLINE void enqueue_bulk (const_reference value, size_type n) {
487487 // N times thread_local operation, One time CAS operation.
488488 // So it is more efficient than N times enqueue.
489+ if (n == 0 ) {
490+ return ;
491+ }
489492
490493 node_t * first_new_node = _allocate ();
491494 node_t * prev_node = first_new_node;
@@ -511,6 +514,9 @@ namespace daking {
511514 " Iterator must be at least input iterator." );
512515 static_assert (std::is_same_v<typename std::iterator_traits<InputIt>::value_type, value_type>,
513516 " The value type of iterator must be same as MPSC_queue::value_type." );
517+ if (n == 0 ) {
518+ return ;
519+ }
514520
515521 node_t * first_new_node = _allocate ();
516522 node_t * prev_node = first_new_node;
@@ -743,4 +749,4 @@ namespace daking {
743749 };
744750}
745751
746- #endif // !DAKING_MPSC_QUEUE_HPP
752+ #endif // !DAKING_MPSC_QUEUE_HPP
Original file line number Diff line number Diff line change @@ -133,6 +133,21 @@ TEST(MPSCQueueBulkTest, EnqueueBulk_InputIterator) {
133133 EXPECT_TRUE (queue.empty ());
134134}
135135
136+ TEST (MPSCQueueBulkTest, EnqueueBulk_EmptyRangeIsNoOp) {
137+ TestQueue queue;
138+ const int value = 99 ;
139+ std::vector<int > data;
140+
141+ queue.enqueue_bulk (value, 0 );
142+ EXPECT_TRUE (queue.empty ());
143+
144+ queue.enqueue_bulk (data.begin (), data.size ());
145+ EXPECT_TRUE (queue.empty ());
146+
147+ queue.enqueue_bulk (data.begin (), data.end ());
148+ EXPECT_TRUE (queue.empty ());
149+ }
150+
136151TEST (MPSCQueueBulkTest, TryDequeueBulk_Partial) {
137152 TestQueue queue;
138153 queue.enqueue (1 );
@@ -306,4 +321,4 @@ TEST(MPSCQueueBlockTest, DequeueBulk_BlockAndWait) {
306321 EXPECT_EQ (results[2 ], 3 );
307322 EXPECT_TRUE (queue.empty ());
308323}
309- #endif
324+ #endif
You can’t perform that action at this time.
0 commit comments