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());
115 // empty queue push rvalue/non_copyable succeeds
116 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > q
;
117 //boost::sync_queue<non_copyable> q;
118 //boost::queue_back<non_copyable> q(sq);
120 q
.push(boost::move(nc
));
121 BOOST_TEST(! q
.empty());
122 BOOST_TEST(! q
.full());
123 BOOST_TEST_EQ(q
.size(), 1u);
124 BOOST_TEST(! q
.closed());
128 // empty queue push rvalue succeeds
129 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
130 boost::queue_back
<int> q(sq
);
133 BOOST_TEST(! q
.empty());
134 BOOST_TEST(! q
.full());
135 BOOST_TEST_EQ(q
.size(), 2u);
136 BOOST_TEST(! q
.closed());
139 // empty queue push lvalue succeeds
140 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
141 boost::queue_back
<int> q(sq
);
144 BOOST_TEST(! q
.empty());
145 BOOST_TEST(! q
.full());
146 BOOST_TEST_EQ(q
.size(), 1u);
147 BOOST_TEST(! q
.closed());
150 // empty queue try_push rvalue/copyable succeeds
151 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
152 boost::queue_back
<int> q(sq
);
153 BOOST_TEST(boost::queue_op_status::success
== q
.try_push(1));
154 BOOST_TEST(! q
.empty());
155 BOOST_TEST(! q
.full());
156 BOOST_TEST_EQ(q
.size(), 1u);
157 BOOST_TEST(! q
.closed());
160 // empty queue try_push rvalue/copyable succeeds
161 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
162 boost::queue_back
<int> q(sq
);
163 BOOST_TEST(boost::queue_op_status::success
== q
.try_push(1));
164 BOOST_TEST(! q
.empty());
165 BOOST_TEST(! q
.full());
166 BOOST_TEST_EQ(q
.size(), 1u);
167 BOOST_TEST(! q
.closed());
172 // empty queue try_push rvalue/non-copyable succeeds
173 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
174 boost::queue_back
<non_copyable
> q(sq
);
176 BOOST_TEST(boost::queue_op_status::success
== q
.try_push(boost::move(nc
)));
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 try_push lvalue succeeds
186 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
187 boost::queue_back
<int> q(sq
);
189 BOOST_TEST(boost::queue_op_status::success
== q
.try_push(i
));
190 BOOST_TEST(! q
.empty());
191 BOOST_TEST(! q
.full());
192 BOOST_TEST_EQ(q
.size(), 1u);
193 BOOST_TEST(! q
.closed());
196 // empty queue try_push rvalue succeeds
197 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
198 boost::queue_back
<int> q(sq
);
199 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_push(1));
200 BOOST_TEST(! q
.empty());
201 BOOST_TEST(! q
.full());
202 BOOST_TEST_EQ(q
.size(), 1u);
203 BOOST_TEST(! q
.closed());
209 // empty queue nonblocking_push rvalue/non-copyable succeeds
210 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
211 boost::queue_back
<non_copyable
> q(sq
);
212 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_push(non_copyable(1)));
213 BOOST_TEST(! q
.empty());
214 BOOST_TEST(! q
.full());
215 BOOST_TEST_EQ(q
.size(), 1u);
216 BOOST_TEST(! q
.closed());
220 // empty queue nonblocking_push rvalue/non-copyable succeeds
221 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
222 boost::queue_back
<non_copyable
> q(sq
);
224 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_push(boost::move(nc
)));
225 BOOST_TEST(! q
.empty());
226 BOOST_TEST(! q
.full());
227 BOOST_TEST_EQ(q
.size(), 1u);
228 BOOST_TEST(! q
.closed());
231 // 1-element queue pull succeed
232 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
233 boost::queue_front
<int> q(sq
);
238 BOOST_TEST(q
.empty());
239 BOOST_TEST(! q
.full());
240 BOOST_TEST_EQ(q
.size(), 0u);
241 BOOST_TEST(! q
.closed());
244 // 1-element queue pull succeed
245 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
246 boost::queue_front
<non_copyable
> q(sq
);
248 sq
.push(boost::move(nc1
));
251 BOOST_TEST_EQ(nc1
, nc2
);
252 BOOST_TEST(q
.empty());
253 BOOST_TEST(! q
.full());
254 BOOST_TEST_EQ(q
.size(), 0u);
255 BOOST_TEST(! q
.closed());
258 // 1-element queue pull succeed
259 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
260 boost::queue_front
<int> q(sq
);
264 BOOST_TEST(q
.empty());
265 BOOST_TEST(! q
.full());
266 BOOST_TEST_EQ(q
.size(), 0u);
267 BOOST_TEST(! q
.closed());
270 // 1-element queue pull succeed
271 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
272 boost::queue_front
<non_copyable
> q(sq
);
274 sq
.push(boost::move(nc1
));
275 non_copyable nc
= q
.pull();
276 BOOST_TEST_EQ(nc
, nc1
);
277 BOOST_TEST(q
.empty());
278 BOOST_TEST(! q
.full());
279 BOOST_TEST_EQ(q
.size(), 0u);
280 BOOST_TEST(! q
.closed());
283 // 1-element queue try_pull succeed
284 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
285 boost::queue_front
<int> q(sq
);
288 BOOST_TEST(boost::queue_op_status::success
== q
.try_pull(i
));
290 BOOST_TEST(q
.empty());
291 BOOST_TEST(! q
.full());
292 BOOST_TEST_EQ(q
.size(), 0u);
293 BOOST_TEST(! q
.closed());
296 // 1-element queue try_pull succeed
297 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
298 boost::queue_front
<non_copyable
> q(sq
);
300 sq
.push(boost::move(nc1
));
302 BOOST_TEST(boost::queue_op_status::success
== q
.try_pull(nc
));
303 BOOST_TEST_EQ(nc
, nc1
);
304 BOOST_TEST(q
.empty());
305 BOOST_TEST(! q
.full());
306 BOOST_TEST_EQ(q
.size(), 0u);
307 BOOST_TEST(! q
.closed());
310 // 1-element queue nonblocking_pull succeed
311 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
312 boost::queue_front
<int> q(sq
);
315 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_pull(i
));
317 BOOST_TEST(q
.empty());
318 BOOST_TEST(! q
.full());
319 BOOST_TEST_EQ(q
.size(), 0u);
320 BOOST_TEST(! q
.closed());
323 // 1-element queue nonblocking_pull succeed
324 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
325 boost::queue_front
<non_copyable
> q(sq
);
327 sq
.push(boost::move(nc1
));
329 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_pull(nc
));
330 BOOST_TEST_EQ(nc
, nc1
);
331 BOOST_TEST(q
.empty());
332 BOOST_TEST(! q
.full());
333 BOOST_TEST_EQ(q
.size(), 0u);
334 BOOST_TEST(! q
.closed());
337 // 1-element queue wait_pull succeed
338 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
339 boost::queue_front
<non_copyable
> q(sq
);
341 sq
.push(boost::move(nc1
));
343 BOOST_TEST(boost::queue_op_status::success
== q
.wait_pull(nc
));
344 BOOST_TEST_EQ(nc
, nc1
);
345 BOOST_TEST(q
.empty());
346 BOOST_TEST(! q
.full());
347 BOOST_TEST_EQ(q
.size(), 0u);
348 BOOST_TEST(! q
.closed());
351 // 1-element queue wait_pull succeed
352 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
353 boost::queue_front
<int> q(sq
);
356 BOOST_TEST(boost::queue_op_status::success
== q
.wait_pull(i
));
358 BOOST_TEST(q
.empty());
359 BOOST_TEST(! q
.full());
360 BOOST_TEST_EQ(q
.size(), 0u);
361 BOOST_TEST(! q
.closed());
364 // 1-element queue wait_pull succeed
365 boost::queue_adaptor
<boost::sync_queue
<non_copyable
> > sq
;
366 boost::queue_front
<non_copyable
> q(sq
);
368 sq
.push(boost::move(nc1
));
370 BOOST_TEST(boost::queue_op_status::success
== q
.wait_pull(nc
));
371 BOOST_TEST_EQ(nc
, nc1
);
372 BOOST_TEST(q
.empty());
373 BOOST_TEST(! q
.full());
374 BOOST_TEST_EQ(q
.size(), 0u);
375 BOOST_TEST(! q
.closed());
380 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
381 boost::queue_back
<int> q(sq
);
383 BOOST_TEST(q
.empty());
384 BOOST_TEST(! q
.full());
385 BOOST_TEST_EQ(q
.size(), 0u);
386 BOOST_TEST(q
.closed());
390 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
391 boost::queue_front
<int> q(sq
);
393 BOOST_TEST(q
.empty());
394 BOOST_TEST(! q
.full());
395 BOOST_TEST_EQ(q
.size(), 0u);
396 BOOST_TEST(q
.closed());
399 // closed queue push fails
400 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
401 boost::queue_back
<int> q(sq
);
407 BOOST_TEST(q
.empty());
408 BOOST_TEST(! q
.full());
409 BOOST_TEST_EQ(q
.size(), 0u);
410 BOOST_TEST(q
.closed());
414 // 1-element closed queue pull succeed
415 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
416 boost::queue_front
<int> q(sq
);
422 BOOST_TEST(q
.empty());
423 BOOST_TEST(! q
.full());
424 BOOST_TEST_EQ(q
.size(), 0u);
425 BOOST_TEST(q
.closed());
428 // 1-element closed queue wait_pull succeed
429 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
430 boost::queue_front
<int> q(sq
);
434 BOOST_TEST(boost::queue_op_status::success
== q
.wait_pull(i
));
436 BOOST_TEST(q
.empty());
437 BOOST_TEST(! q
.full());
438 BOOST_TEST_EQ(q
.size(), 0u);
439 BOOST_TEST(q
.closed());
442 // closed empty queue wait_pull fails
443 boost::queue_adaptor
<boost::sync_queue
<int> > sq
;
444 boost::queue_front
<int> q(sq
);
446 BOOST_TEST(q
.empty());
447 BOOST_TEST(q
.closed());
449 BOOST_TEST(boost::queue_op_status::closed
== q
.wait_pull(i
));
450 BOOST_TEST(q
.empty());
451 BOOST_TEST(q
.closed());
453 return boost::report_errors();