1 // Copyright (C) 2014 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/concurrent_queues/sync_queue.hpp>
16 #include <boost/thread/concurrent_queues/queue_adaptor.hpp>
17 #include <boost/thread/concurrent_queues/queue_views.hpp>
19 #include <boost/detail/lightweight_test.hpp>
20 #include <boost/static_assert.hpp>
26 BOOST_THREAD_MOVABLE_ONLY(non_copyable
)
27 non_copyable(int v
) : val(v
){}
28 non_copyable(BOOST_RV_REF(non_copyable
) x
): val(x
.val
) {}
29 non_copyable
& operator=(BOOST_RV_REF(non_copyable
) x
) { val
=x
.val
; return *this; }
30 bool operator==(non_copyable
const& x
) const {return val
==x
.val
;}
31 template <typename OSTREAM
>
32 friend OSTREAM
& operator <<(OSTREAM
& os
, non_copyable
const&x
)
40 #if defined BOOST_NO_CXX11_RVALUE_REFERENCES
41 BOOST_STATIC_ASSERT( ! boost::is_copy_constructible
<non_copyable
>::value
);
42 BOOST_STATIC_ASSERT( boost::has_move_emulation_enabled
<non_copyable
>::value
);
49 // default queue invariants
50 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
51 boost::queue_back
<int> q(sq
);
52 BOOST_TEST(q
.empty());
53 BOOST_TEST(! q
.full());
54 BOOST_TEST_EQ(q
.size(), 0u);
55 BOOST_TEST(! q
.closed());
58 // default queue invariants
59 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
60 boost::queue_front
<int> q(sq
);
61 BOOST_TEST(q
.empty());
62 BOOST_TEST(! q
.full());
63 BOOST_TEST_EQ(q
.size(), 0u);
64 BOOST_TEST(! q
.closed());
69 // empty queue try_pull fails
70 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
71 boost::queue_front
<int> q(sq
);
73 BOOST_TEST( boost::queue_op_status::empty
== q
.try_pull(i
));
74 BOOST_TEST(q
.empty());
75 BOOST_TEST(! q
.full());
76 BOOST_TEST_EQ(q
.size(), 0u);
77 BOOST_TEST(! q
.closed());
80 // empty queue push rvalue/copyable succeeds
81 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
82 boost::queue_back
<int> q(sq
);
84 BOOST_TEST(! q
.empty());
85 BOOST_TEST(! q
.full());
86 BOOST_TEST_EQ(q
.size(), 1u);
87 BOOST_TEST(! q
.closed());
90 // empty queue push lvalue/copyable succeeds
91 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
92 boost::queue_back
<int> q(sq
);
95 BOOST_TEST(! q
.empty());
96 BOOST_TEST(! q
.full());
97 BOOST_TEST_EQ(q
.size(), 1u);
98 BOOST_TEST(! q
.closed());
104 // empty queue push rvalue/non_copyable succeeds
105 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
106 boost::queue_back
<non_copyable
> q(sq
);
107 q
.push(non_copyable(1));
108 BOOST_TEST(! q
.empty());
109 BOOST_TEST(! q
.full());
110 BOOST_TEST_EQ(q
.size(), 1u);
111 BOOST_TEST(! q
.closed());
114 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1900)
116 // empty queue push rvalue/non_copyable succeeds
117 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > q
;
118 //boost::sync_queue<non_copyable> q;
119 //boost::queue_back<non_copyable> q(sq);
121 q
.push(boost::move(nc
));
122 BOOST_TEST(! q
.empty());
123 BOOST_TEST(! q
.full());
124 BOOST_TEST_EQ(q
.size(), 1u);
125 BOOST_TEST(! q
.closed());
130 // empty queue push rvalue succeeds
131 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
132 boost::queue_back
<int> q(sq
);
135 BOOST_TEST(! q
.empty());
136 BOOST_TEST(! q
.full());
137 BOOST_TEST_EQ(q
.size(), 2u);
138 BOOST_TEST(! q
.closed());
141 // empty queue push lvalue succeeds
142 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
143 boost::queue_back
<int> q(sq
);
146 BOOST_TEST(! q
.empty());
147 BOOST_TEST(! q
.full());
148 BOOST_TEST_EQ(q
.size(), 1u);
149 BOOST_TEST(! q
.closed());
152 // empty queue try_push rvalue/copyable succeeds
153 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
154 boost::queue_back
<int> q(sq
);
155 BOOST_TEST(boost::queue_op_status::success
== q
.try_push(1));
156 BOOST_TEST(! q
.empty());
157 BOOST_TEST(! q
.full());
158 BOOST_TEST_EQ(q
.size(), 1u);
159 BOOST_TEST(! q
.closed());
162 // empty queue try_push rvalue/copyable succeeds
163 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
164 boost::queue_back
<int> q(sq
);
165 BOOST_TEST(boost::queue_op_status::success
== q
.try_push(1));
166 BOOST_TEST(! q
.empty());
167 BOOST_TEST(! q
.full());
168 BOOST_TEST_EQ(q
.size(), 1u);
169 BOOST_TEST(! q
.closed());
174 // empty queue try_push rvalue/non-copyable succeeds
175 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
176 boost::queue_back
<non_copyable
> q(sq
);
178 BOOST_TEST(boost::queue_op_status::success
== q
.try_push(boost::move(nc
)));
179 BOOST_TEST(! q
.empty());
180 BOOST_TEST(! q
.full());
181 BOOST_TEST_EQ(q
.size(), 1u);
182 BOOST_TEST(! q
.closed());
187 // empty queue try_push lvalue succeeds
188 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
189 boost::queue_back
<int> q(sq
);
191 BOOST_TEST(boost::queue_op_status::success
== q
.try_push(i
));
192 BOOST_TEST(! q
.empty());
193 BOOST_TEST(! q
.full());
194 BOOST_TEST_EQ(q
.size(), 1u);
195 BOOST_TEST(! q
.closed());
198 // empty queue try_push rvalue succeeds
199 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
200 boost::queue_back
<int> q(sq
);
201 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_push(1));
202 BOOST_TEST(! q
.empty());
203 BOOST_TEST(! q
.full());
204 BOOST_TEST_EQ(q
.size(), 1u);
205 BOOST_TEST(! q
.closed());
211 // empty queue nonblocking_push rvalue/non-copyable succeeds
212 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
213 boost::queue_back
<non_copyable
> q(sq
);
214 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_push(non_copyable(1)));
215 BOOST_TEST(! q
.empty());
216 BOOST_TEST(! q
.full());
217 BOOST_TEST_EQ(q
.size(), 1u);
218 BOOST_TEST(! q
.closed());
221 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1900)
223 // empty queue nonblocking_push rvalue/non-copyable succeeds
224 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
225 boost::queue_back
<non_copyable
> q(sq
);
227 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_push(boost::move(nc
)));
228 BOOST_TEST(! q
.empty());
229 BOOST_TEST(! q
.full());
230 BOOST_TEST_EQ(q
.size(), 1u);
231 BOOST_TEST(! q
.closed());
235 // 1-element queue pull succeed
236 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
237 boost::queue_front
<int> q(sq
);
242 BOOST_TEST(q
.empty());
243 BOOST_TEST(! q
.full());
244 BOOST_TEST_EQ(q
.size(), 0u);
245 BOOST_TEST(! q
.closed());
247 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1900)
249 // 1-element queue pull succeed
250 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
251 boost::queue_front
<non_copyable
> q(sq
);
253 sq
.push(boost::move(nc1
));
256 BOOST_TEST_EQ(nc1
, nc2
);
257 BOOST_TEST(q
.empty());
258 BOOST_TEST(! q
.full());
259 BOOST_TEST_EQ(q
.size(), 0u);
260 BOOST_TEST(! q
.closed());
264 // 1-element queue pull succeed
265 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
266 boost::queue_front
<int> q(sq
);
270 BOOST_TEST(q
.empty());
271 BOOST_TEST(! q
.full());
272 BOOST_TEST_EQ(q
.size(), 0u);
273 BOOST_TEST(! q
.closed());
275 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1900)
277 // 1-element queue pull succeed
278 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
279 boost::queue_front
<non_copyable
> q(sq
);
281 sq
.push(boost::move(nc1
));
282 non_copyable nc
= q
.pull();
283 BOOST_TEST_EQ(nc
, nc1
);
284 BOOST_TEST(q
.empty());
285 BOOST_TEST(! q
.full());
286 BOOST_TEST_EQ(q
.size(), 0u);
287 BOOST_TEST(! q
.closed());
291 // 1-element queue try_pull succeed
292 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
293 boost::queue_front
<int> q(sq
);
296 BOOST_TEST(boost::queue_op_status::success
== q
.try_pull(i
));
298 BOOST_TEST(q
.empty());
299 BOOST_TEST(! q
.full());
300 BOOST_TEST_EQ(q
.size(), 0u);
301 BOOST_TEST(! q
.closed());
303 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1900)
305 // 1-element queue try_pull succeed
306 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
307 boost::queue_front
<non_copyable
> q(sq
);
309 sq
.push(boost::move(nc1
));
311 BOOST_TEST(boost::queue_op_status::success
== q
.try_pull(nc
));
312 BOOST_TEST_EQ(nc
, nc1
);
313 BOOST_TEST(q
.empty());
314 BOOST_TEST(! q
.full());
315 BOOST_TEST_EQ(q
.size(), 0u);
316 BOOST_TEST(! q
.closed());
320 // 1-element queue nonblocking_pull succeed
321 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
322 boost::queue_front
<int> q(sq
);
325 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_pull(i
));
327 BOOST_TEST(q
.empty());
328 BOOST_TEST(! q
.full());
329 BOOST_TEST_EQ(q
.size(), 0u);
330 BOOST_TEST(! q
.closed());
332 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1900)
334 // 1-element queue nonblocking_pull succeed
335 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
336 boost::queue_front
<non_copyable
> q(sq
);
338 sq
.push(boost::move(nc1
));
340 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_pull(nc
));
341 BOOST_TEST_EQ(nc
, nc1
);
342 BOOST_TEST(q
.empty());
343 BOOST_TEST(! q
.full());
344 BOOST_TEST_EQ(q
.size(), 0u);
345 BOOST_TEST(! q
.closed());
348 // 1-element queue wait_pull succeed
349 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
350 boost::queue_front
<non_copyable
> q(sq
);
352 sq
.push(boost::move(nc1
));
354 BOOST_TEST(boost::queue_op_status::success
== q
.wait_pull(nc
));
355 BOOST_TEST_EQ(nc
, nc1
);
356 BOOST_TEST(q
.empty());
357 BOOST_TEST(! q
.full());
358 BOOST_TEST_EQ(q
.size(), 0u);
359 BOOST_TEST(! q
.closed());
363 // 1-element queue wait_pull succeed
364 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
365 boost::queue_front
<int> q(sq
);
368 BOOST_TEST(boost::queue_op_status::success
== q
.wait_pull(i
));
370 BOOST_TEST(q
.empty());
371 BOOST_TEST(! q
.full());
372 BOOST_TEST_EQ(q
.size(), 0u);
373 BOOST_TEST(! q
.closed());
375 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1900)
377 // 1-element queue wait_pull succeed
378 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
379 boost::queue_front
<non_copyable
> q(sq
);
381 sq
.push(boost::move(nc1
));
383 BOOST_TEST(boost::queue_op_status::success
== q
.wait_pull(nc
));
384 BOOST_TEST_EQ(nc
, nc1
);
385 BOOST_TEST(q
.empty());
386 BOOST_TEST(! q
.full());
387 BOOST_TEST_EQ(q
.size(), 0u);
388 BOOST_TEST(! q
.closed());
393 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
394 boost::queue_back
<int> q(sq
);
396 BOOST_TEST(q
.empty());
397 BOOST_TEST(! q
.full());
398 BOOST_TEST_EQ(q
.size(), 0u);
399 BOOST_TEST(q
.closed());
403 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
404 boost::queue_front
<int> q(sq
);
406 BOOST_TEST(q
.empty());
407 BOOST_TEST(! q
.full());
408 BOOST_TEST_EQ(q
.size(), 0u);
409 BOOST_TEST(q
.closed());
412 // closed queue push fails
413 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
414 boost::queue_back
<int> q(sq
);
420 BOOST_TEST(q
.empty());
421 BOOST_TEST(! q
.full());
422 BOOST_TEST_EQ(q
.size(), 0u);
423 BOOST_TEST(q
.closed());
427 // 1-element closed queue pull succeed
428 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
429 boost::queue_front
<int> q(sq
);
435 BOOST_TEST(q
.empty());
436 BOOST_TEST(! q
.full());
437 BOOST_TEST_EQ(q
.size(), 0u);
438 BOOST_TEST(q
.closed());
441 // 1-element closed queue wait_pull succeed
442 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
443 boost::queue_front
<int> q(sq
);
447 BOOST_TEST(boost::queue_op_status::success
== q
.wait_pull(i
));
449 BOOST_TEST(q
.empty());
450 BOOST_TEST(! q
.full());
451 BOOST_TEST_EQ(q
.size(), 0u);
452 BOOST_TEST(q
.closed());
455 // closed empty queue wait_pull fails
456 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
457 boost::queue_front
<int> q(sq
);
459 BOOST_TEST(q
.empty());
460 BOOST_TEST(q
.closed());
462 BOOST_TEST(boost::queue_op_status::closed
== q
.wait_pull(i
));
463 BOOST_TEST(q
.empty());
464 BOOST_TEST(q
.closed());
466 return boost::report_errors();