1 // Copyright (C) 2013 Vicente J. Botet Escriba
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 // <boost/thread/sync_queue.hpp>
12 #define BOOST_THREAD_VERSION 4
13 //#define BOOST_THREAD_QUEUE_DEPRECATE_OLD
15 #include <boost/thread/sync_queue.hpp>
17 #include <boost/detail/lightweight_test.hpp>
21 BOOST_THREAD_MOVABLE_ONLY(non_copyable)
24 non_copyable(int v) : val(v){}
25 non_copyable(BOOST_RV_REF(non_copyable) x): val(x.val) {}
26 non_copyable& operator=(BOOST_RV_REF(non_copyable) x) { val=x.val; return *this; }
27 bool operator==(non_copyable const& x) const {return val==x.val;}
28 template <typename OSTREAM>
29 friend OSTREAM& operator <<(OSTREAM& os, non_copyable const&x )
43 // default queue invariants
44 boost::sync_queue<int> q;
45 BOOST_TEST(q.empty());
46 BOOST_TEST(! q.full());
47 BOOST_TEST_EQ(q.size(), 0u);
48 BOOST_TEST(! q.closed());
50 #ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
52 // empty queue try_pull fails
53 boost::sync_queue<int> q;
55 BOOST_TEST(! q.try_pull(i));
56 BOOST_TEST(q.empty());
57 BOOST_TEST(! q.full());
58 BOOST_TEST_EQ(q.size(), 0u);
59 BOOST_TEST(! q.closed());
62 // empty queue try_pull fails
63 boost::sync_queue<int> q;
64 BOOST_TEST(! q.try_pull());
65 BOOST_TEST(q.empty());
66 BOOST_TEST(! q.full());
67 BOOST_TEST_EQ(q.size(), 0u);
68 BOOST_TEST(! q.closed());
71 // empty queue push rvalue/copyable succeeds
72 boost::sync_queue<int> q;
74 BOOST_TEST(! q.empty());
75 BOOST_TEST(! q.full());
76 BOOST_TEST_EQ(q.size(), 1u);
77 BOOST_TEST(! q.closed());
80 // empty queue push lvalue/copyable succeeds
81 boost::sync_queue<int> q;
84 BOOST_TEST(! q.empty());
85 BOOST_TEST(! q.full());
86 BOOST_TEST_EQ(q.size(), 1u);
87 BOOST_TEST(! q.closed());
92 // empty queue try_pull fails
93 boost::sync_queue<int> q;
95 BOOST_TEST( boost::queue_op_status::empty == q.try_pull_front(i));
96 BOOST_TEST(q.empty());
97 BOOST_TEST(! q.full());
98 BOOST_TEST_EQ(q.size(), 0u);
99 BOOST_TEST(! q.closed());
102 // empty queue push rvalue/copyable succeeds
103 boost::sync_queue<int> q;
105 BOOST_TEST(! q.empty());
106 BOOST_TEST(! q.full());
107 BOOST_TEST_EQ(q.size(), 1u);
108 BOOST_TEST(! q.closed());
111 // empty queue push lvalue/copyable succeeds
112 boost::sync_queue<int> q;
115 BOOST_TEST(! q.empty());
116 BOOST_TEST(! q.full());
117 BOOST_TEST_EQ(q.size(), 1u);
118 BOOST_TEST(! q.closed());
121 #ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
124 // empty queue push rvalue/non_copyable succeeds
125 boost::sync_queue<non_copyable> q;
126 q.push(non_copyable(1));
127 BOOST_TEST(! q.empty());
128 BOOST_TEST(! q.full());
129 BOOST_TEST_EQ(q.size(), 1u);
130 BOOST_TEST(! q.closed());
134 // empty queue push rvalue/non_copyable succeeds
135 boost::sync_queue<non_copyable> q;
137 q.push(boost::move(nc));
138 BOOST_TEST(! q.empty());
139 BOOST_TEST(! q.full());
140 BOOST_TEST_EQ(q.size(), 1u);
141 BOOST_TEST(! q.closed());
145 // empty queue push rvalue succeeds
146 boost::sync_queue<int> q;
149 BOOST_TEST(! q.empty());
150 BOOST_TEST(! q.full());
151 BOOST_TEST_EQ(q.size(), 2u);
152 BOOST_TEST(! q.closed());
155 // empty queue push lvalue succeeds
156 boost::sync_queue<int> q;
159 BOOST_TEST(! q.empty());
160 BOOST_TEST(! q.full());
161 BOOST_TEST_EQ(q.size(), 1u);
162 BOOST_TEST(! q.closed());
165 // empty queue try_push rvalue/copyable succeeds
166 boost::sync_queue<int> q;
167 BOOST_TEST(q.try_push(1));
168 BOOST_TEST(! q.empty());
169 BOOST_TEST(! q.full());
170 BOOST_TEST_EQ(q.size(), 1u);
171 BOOST_TEST(! q.closed());
174 // empty queue try_push rvalue/copyable succeeds
175 boost::sync_queue<int> q;
176 BOOST_TEST(q.try_push(1));
177 BOOST_TEST(! q.empty());
178 BOOST_TEST(! q.full());
179 BOOST_TEST_EQ(q.size(), 1u);
180 BOOST_TEST(! q.closed());
185 // empty queue push rvalue/non_copyable succeeds
186 boost::sync_queue<non_copyable> q;
187 q.push_back(non_copyable(1));
188 BOOST_TEST(! q.empty());
189 BOOST_TEST(! q.full());
190 BOOST_TEST_EQ(q.size(), 1u);
191 BOOST_TEST(! q.closed());
195 // empty queue push rvalue/non_copyable succeeds
196 boost::sync_queue<non_copyable> q;
198 q.push_back(boost::move(nc));
199 BOOST_TEST(! q.empty());
200 BOOST_TEST(! q.full());
201 BOOST_TEST_EQ(q.size(), 1u);
202 BOOST_TEST(! q.closed());
206 // empty queue push rvalue succeeds
207 boost::sync_queue<int> q;
210 BOOST_TEST(! q.empty());
211 BOOST_TEST(! q.full());
212 BOOST_TEST_EQ(q.size(), 2u);
213 BOOST_TEST(! q.closed());
216 // empty queue push lvalue succeeds
217 boost::sync_queue<int> q;
220 BOOST_TEST(! q.empty());
221 BOOST_TEST(! q.full());
222 BOOST_TEST_EQ(q.size(), 1u);
223 BOOST_TEST(! q.closed());
226 // empty queue try_push rvalue/copyable succeeds
227 boost::sync_queue<int> q;
228 BOOST_TEST(boost::queue_op_status::success == q.try_push_back(1));
229 BOOST_TEST(! q.empty());
230 BOOST_TEST(! q.full());
231 BOOST_TEST_EQ(q.size(), 1u);
232 BOOST_TEST(! q.closed());
235 // empty queue try_push rvalue/copyable succeeds
236 boost::sync_queue<int> q;
237 BOOST_TEST(boost::queue_op_status::success == q.try_push_back(1));
238 BOOST_TEST(! q.empty());
239 BOOST_TEST(! q.full());
240 BOOST_TEST_EQ(q.size(), 1u);
241 BOOST_TEST(! q.closed());
243 #ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
246 // empty queue try_push rvalue/non-copyable succeeds
247 boost::sync_queue<non_copyable> q;
248 BOOST_TEST(q.try_push(non_copyable()));
249 BOOST_TEST(! q.empty());
250 BOOST_TEST(! q.full());
251 BOOST_TEST_EQ(q.size(), 1u);
252 BOOST_TEST(! q.closed());
256 // empty queue try_push rvalue/non-copyable succeeds
257 boost::sync_queue<non_copyable> q;
259 BOOST_TEST(q.try_push(boost::move(nc)));
260 BOOST_TEST(! q.empty());
261 BOOST_TEST(! q.full());
262 BOOST_TEST_EQ(q.size(), 1u);
263 BOOST_TEST(! q.closed());
267 // empty queue try_push lvalue succeeds
268 boost::sync_queue<int> q;
270 BOOST_TEST(q.try_push(i));
271 BOOST_TEST(! q.empty());
272 BOOST_TEST(! q.full());
273 BOOST_TEST_EQ(q.size(), 1u);
274 BOOST_TEST(! q.closed());
277 // empty queue try_push rvalue succeeds
278 boost::sync_queue<int> q;
279 BOOST_TEST(q.try_push(boost::no_block, 1));
280 BOOST_TEST(! q.empty());
281 BOOST_TEST(! q.full());
282 BOOST_TEST_EQ(q.size(), 1u);
283 BOOST_TEST(! q.closed());
288 // empty queue try_push rvalue/non-copyable succeeds
289 boost::sync_queue<non_copyable> q;
290 BOOST_TEST(boost::queue_op_status::success ==q.try_push_back(non_copyable()));
291 BOOST_TEST(! q.empty());
292 BOOST_TEST(! q.full());
293 BOOST_TEST_EQ(q.size(), 1u);
294 BOOST_TEST(! q.closed());
298 // empty queue try_push rvalue/non-copyable succeeds
299 boost::sync_queue<non_copyable> q;
301 BOOST_TEST(boost::queue_op_status::success == q.try_push_back(boost::move(nc)));
302 BOOST_TEST(! q.empty());
303 BOOST_TEST(! q.full());
304 BOOST_TEST_EQ(q.size(), 1u);
305 BOOST_TEST(! q.closed());
309 // empty queue try_push lvalue succeeds
310 boost::sync_queue<int> q;
312 BOOST_TEST(boost::queue_op_status::success == q.try_push_back(i));
313 BOOST_TEST(! q.empty());
314 BOOST_TEST(! q.full());
315 BOOST_TEST_EQ(q.size(), 1u);
316 BOOST_TEST(! q.closed());
319 // empty queue try_push rvalue succeeds
320 boost::sync_queue<int> q;
321 BOOST_TEST(boost::queue_op_status::success == q.nonblocking_push_back(1));
322 BOOST_TEST(! q.empty());
323 BOOST_TEST(! q.full());
324 BOOST_TEST_EQ(q.size(), 1u);
325 BOOST_TEST(! q.closed());
328 #ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
331 // empty queue try_push rvalue/non-copyable succeeds
332 boost::sync_queue<non_copyable> q;
333 BOOST_TEST(q.try_push(boost::no_block, non_copyable(1)));
334 BOOST_TEST(! q.empty());
335 BOOST_TEST(! q.full());
336 BOOST_TEST_EQ(q.size(), 1u);
337 BOOST_TEST(! q.closed());
341 // empty queue try_push rvalue/non-copyable succeeds
342 boost::sync_queue<non_copyable> q;
344 BOOST_TEST(q.try_push(boost::no_block, boost::move(nc)));
345 BOOST_TEST(! q.empty());
346 BOOST_TEST(! q.full());
347 BOOST_TEST_EQ(q.size(), 1u);
348 BOOST_TEST(! q.closed());
351 // 1-element queue pull succeed
352 boost::sync_queue<int> q;
357 BOOST_TEST(q.empty());
358 BOOST_TEST(! q.full());
359 BOOST_TEST_EQ(q.size(), 0u);
360 BOOST_TEST(! q.closed());
363 // 1-element queue pull succeed
364 boost::sync_queue<non_copyable> q;
366 q.push(boost::move(nc1));
369 BOOST_TEST_EQ(nc1, nc2);
370 BOOST_TEST(q.empty());
371 BOOST_TEST(! q.full());
372 BOOST_TEST_EQ(q.size(), 0u);
373 BOOST_TEST(! q.closed());
376 // 1-element queue pull succeed
377 boost::sync_queue<int> q;
381 BOOST_TEST(q.empty());
382 BOOST_TEST(! q.full());
383 BOOST_TEST_EQ(q.size(), 0u);
384 BOOST_TEST(! q.closed());
387 // 1-element queue pull succeed
388 boost::sync_queue<non_copyable> q;
390 q.push(boost::move(nc1));
391 non_copyable nc = q.pull();
392 BOOST_TEST_EQ(nc, nc1);
393 BOOST_TEST(q.empty());
394 BOOST_TEST(! q.full());
395 BOOST_TEST_EQ(q.size(), 0u);
396 BOOST_TEST(! q.closed());
399 // 1-element queue try_pull succeed
400 boost::sync_queue<int> q;
403 BOOST_TEST(q.try_pull(i));
405 BOOST_TEST(q.empty());
406 BOOST_TEST(! q.full());
407 BOOST_TEST_EQ(q.size(), 0u);
408 BOOST_TEST(! q.closed());
411 // 1-element queue try_pull succeed
412 boost::sync_queue<non_copyable> q;
414 q.push(boost::move(nc1));
416 BOOST_TEST(q.try_pull(nc));
417 BOOST_TEST_EQ(nc, nc1);
418 BOOST_TEST(q.empty());
419 BOOST_TEST(! q.full());
420 BOOST_TEST_EQ(q.size(), 0u);
421 BOOST_TEST(! q.closed());
424 // 1-element queue try_pull succeed
425 boost::sync_queue<int> q;
428 BOOST_TEST(q.try_pull(boost::no_block, i));
430 BOOST_TEST(q.empty());
431 BOOST_TEST(! q.full());
432 BOOST_TEST_EQ(q.size(), 0u);
433 BOOST_TEST(! q.closed());
436 // 1-element queue try_pull succeed
437 boost::sync_queue<non_copyable> q;
439 q.push(boost::move(nc1));
441 BOOST_TEST(q.try_pull(boost::no_block, nc));
442 BOOST_TEST_EQ(nc, nc1);
443 BOOST_TEST(q.empty());
444 BOOST_TEST(! q.full());
445 BOOST_TEST_EQ(q.size(), 0u);
446 BOOST_TEST(! q.closed());
449 // 1-element queue try_pull succeed
450 boost::sync_queue<int> q;
452 boost::shared_ptr<int> i = q.try_pull();
453 BOOST_TEST_EQ(*i, 1);
454 BOOST_TEST(q.empty());
455 BOOST_TEST(! q.full());
456 BOOST_TEST_EQ(q.size(), 0u);
457 BOOST_TEST(! q.closed());
462 boost::sync_queue<int> q;
464 BOOST_TEST(q.empty());
465 BOOST_TEST(! q.full());
466 BOOST_TEST_EQ(q.size(), 0u);
467 BOOST_TEST(q.closed());
470 // closed queue push fails
471 boost::sync_queue<int> q;
477 BOOST_TEST(q.empty());
478 BOOST_TEST(! q.full());
479 BOOST_TEST_EQ(q.size(), 0u);
480 BOOST_TEST(q.closed());
484 // closed empty queue try_pull_front closed
485 boost::sync_queue<int> q;
488 BOOST_TEST(boost::queue_op_status::closed == q.try_pull_front(i));
489 BOOST_TEST(q.empty());
490 BOOST_TEST(! q.full());
491 BOOST_TEST_EQ(q.size(), 0u);
492 BOOST_TEST(q.closed());
495 // closed empty queue nonblocking_pull_front closed
496 boost::sync_queue<int> q;
499 BOOST_TEST(boost::queue_op_status::closed == q.nonblocking_pull_front(i));
500 BOOST_TEST(q.empty());
501 BOOST_TEST(! q.full());
502 BOOST_TEST_EQ(q.size(), 0u);
503 BOOST_TEST(q.closed());
506 // 1-element closed queue pull succeed
507 boost::sync_queue<int> q;
513 BOOST_TEST(q.empty());
514 BOOST_TEST(! q.full());
515 BOOST_TEST_EQ(q.size(), 0u);
516 BOOST_TEST(q.closed());
521 // empty queue nonblocking_push_back rvalue/non-copyable succeeds
522 boost::sync_queue<non_copyable> q;
523 BOOST_TEST(boost::queue_op_status::success == q.nonblocking_push_back(non_copyable(1)));
524 BOOST_TEST(! q.empty());
525 BOOST_TEST(! q.full());
526 BOOST_TEST_EQ(q.size(), 1u);
527 BOOST_TEST(! q.closed());
531 // empty queue nonblocking_push_back rvalue/non-copyable succeeds
532 boost::sync_queue<non_copyable> q;
534 BOOST_TEST(boost::queue_op_status::success == q.nonblocking_push_back(boost::move(nc)));
535 BOOST_TEST(! q.empty());
536 BOOST_TEST(! q.full());
537 BOOST_TEST_EQ(q.size(), 1u);
538 BOOST_TEST(! q.closed());
541 // 1-element queue pull_front succeed
542 boost::sync_queue<int> q;
547 BOOST_TEST(q.empty());
548 BOOST_TEST(! q.full());
549 BOOST_TEST_EQ(q.size(), 0u);
550 BOOST_TEST(! q.closed());
553 // 1-element queue pull_front succeed
554 boost::sync_queue<non_copyable> q;
556 q.push_back(boost::move(nc1));
559 BOOST_TEST_EQ(nc1, nc2);
560 BOOST_TEST(q.empty());
561 BOOST_TEST(! q.full());
562 BOOST_TEST_EQ(q.size(), 0u);
563 BOOST_TEST(! q.closed());
566 // 1-element queue pull_front succeed
567 boost::sync_queue<int> q;
569 int i = q.pull_front();
571 BOOST_TEST(q.empty());
572 BOOST_TEST(! q.full());
573 BOOST_TEST_EQ(q.size(), 0u);
574 BOOST_TEST(! q.closed());
577 // 1-element queue pull_front succeed
578 boost::sync_queue<non_copyable> q;
580 q.push_back(boost::move(nc1));
581 non_copyable nc = q.pull_front();
582 BOOST_TEST_EQ(nc, nc1);
583 BOOST_TEST(q.empty());
584 BOOST_TEST(! q.full());
585 BOOST_TEST_EQ(q.size(), 0u);
586 BOOST_TEST(! q.closed());
589 // 1-element queue try_pull_front succeed
590 boost::sync_queue<int> q;
593 BOOST_TEST(boost::queue_op_status::success == q.try_pull_front(i));
595 BOOST_TEST(q.empty());
596 BOOST_TEST(! q.full());
597 BOOST_TEST_EQ(q.size(), 0u);
598 BOOST_TEST(! q.closed());
601 // 1-element queue try_pull_front succeed
602 boost::sync_queue<non_copyable> q;
604 q.push_back(boost::move(nc1));
606 BOOST_TEST(boost::queue_op_status::success == q.try_pull_front(nc));
607 BOOST_TEST_EQ(nc, nc1);
608 BOOST_TEST(q.empty());
609 BOOST_TEST(! q.full());
610 BOOST_TEST_EQ(q.size(), 0u);
611 BOOST_TEST(! q.closed());
614 // 1-element queue nonblocking_pull_front succeed
615 boost::sync_queue<int> q;
618 BOOST_TEST(boost::queue_op_status::success == q.nonblocking_pull_front(i));
620 BOOST_TEST(q.empty());
621 BOOST_TEST(! q.full());
622 BOOST_TEST_EQ(q.size(), 0u);
623 BOOST_TEST(! q.closed());
626 // 1-element queue nonblocking_pull_front succeed
627 boost::sync_queue<non_copyable> q;
629 q.push_back(boost::move(nc1));
631 BOOST_TEST(boost::queue_op_status::success == q.nonblocking_pull_front(nc));
632 BOOST_TEST_EQ(nc, nc1);
633 BOOST_TEST(q.empty());
634 BOOST_TEST(! q.full());
635 BOOST_TEST_EQ(q.size(), 0u);
636 BOOST_TEST(! q.closed());
639 // 1-element queue wait_pull_front succeed
640 boost::sync_queue<non_copyable> q;
642 q.push_back(boost::move(nc1));
644 BOOST_TEST(boost::queue_op_status::success == q.wait_pull_front(nc));
645 BOOST_TEST_EQ(nc, nc1);
646 BOOST_TEST(q.empty());
647 BOOST_TEST(! q.full());
648 BOOST_TEST_EQ(q.size(), 0u);
649 BOOST_TEST(! q.closed());
652 // 1-element queue wait_pull_front succeed
653 boost::sync_queue<int> q;
656 BOOST_TEST(boost::queue_op_status::success == q.wait_pull_front(i));
658 BOOST_TEST(q.empty());
659 BOOST_TEST(! q.full());
660 BOOST_TEST_EQ(q.size(), 0u);
661 BOOST_TEST(! q.closed());
664 // 1-element queue wait_pull_front succeed
665 boost::sync_queue<non_copyable> q;
667 q.push_back(boost::move(nc1));
669 BOOST_TEST(boost::queue_op_status::success == q.wait_pull_front(nc));
670 BOOST_TEST_EQ(nc, nc1);
671 BOOST_TEST(q.empty());
672 BOOST_TEST(! q.full());
673 BOOST_TEST_EQ(q.size(), 0u);
674 BOOST_TEST(! q.closed());
679 boost::sync_queue<int> q;
681 BOOST_TEST(q.empty());
682 BOOST_TEST(! q.full());
683 BOOST_TEST_EQ(q.size(), 0u);
684 BOOST_TEST(q.closed());
687 // closed queue push fails
688 boost::sync_queue<int> q;
694 BOOST_TEST(q.empty());
695 BOOST_TEST(! q.full());
696 BOOST_TEST_EQ(q.size(), 0u);
697 BOOST_TEST(q.closed());
701 // 1-element closed queue pull succeed
702 boost::sync_queue<int> q;
708 BOOST_TEST(q.empty());
709 BOOST_TEST(! q.full());
710 BOOST_TEST_EQ(q.size(), 0u);
711 BOOST_TEST(q.closed());
714 // 1-element closed queue wait_pull_front succeed
715 boost::sync_queue<int> q;
719 BOOST_TEST(boost::queue_op_status::success == q.wait_pull_front(i));
721 BOOST_TEST(q.empty());
722 BOOST_TEST(! q.full());
723 BOOST_TEST_EQ(q.size(), 0u);
724 BOOST_TEST(q.closed());
727 // closed empty queue wait_pull_front fails
728 boost::sync_queue<int> q;
730 BOOST_TEST(q.empty());
731 BOOST_TEST(q.closed());
733 BOOST_TEST(boost::queue_op_status::closed == q.wait_pull_front(i));
734 BOOST_TEST(q.empty());
735 BOOST_TEST(q.closed());
738 return boost::report_errors();