21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include <boost/mpl/list.hpp>
26 #include "core/thread_pool_sequential.hpp"
27 #include "core/thread_pool_master.hpp"
28 #include "core/thread_pool_workers.hpp"
30 using namespace libjmmcg;
57 const typename crew_normal_fifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_type::
pool_type::
size_type crew_normal_fifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_size;
83 const typename crew_priority_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_type::
pool_type::
size_type crew_priority_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_size;
85 typedef boost::mpl::list<
86 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
87 crew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
89 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
91 crew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
94 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
95 crew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>
101 struct square :
std::unary_function<T,
void> {
117 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
119 BOOST_AUTO_TEST_SUITE(joinable_dataflow)
121 BOOST_AUTO_TEST_SUITE(finite)
123 BOOST_AUTO_TEST_SUITE(empty_colln)
125 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, finite_test_types) {
126 typedef typename T::vtr_colln_t vtr_colln_t;
127 typedef typename T::pool_type pool_type;
128 typedef typename pool_type::joinable joinable;
130 pool_type pool(T::pool_size);
132 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
133 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::min());
134 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
135 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
138 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, finite_test_types) {
139 typedef typename T::vtr_colln_t vtr_colln_t;
140 typedef typename T::pool_type pool_type;
141 typedef typename pool_type::joinable joinable;
143 pool_type pool(T::pool_size);
145 auto const &context=pool<<joinable()<<pool.max_element(v);
146 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::min());
147 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
148 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
151 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, finite_test_types) {
152 typedef typename T::vtr_colln_t vtr_colln_t;
153 typedef typename T::pool_type pool_type;
154 typedef typename pool_type::joinable joinable;
156 pool_type pool(T::pool_size);
158 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
159 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::max());
160 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
161 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
164 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, finite_test_types) {
165 typedef typename T::vtr_colln_t vtr_colln_t;
166 typedef typename T::pool_type pool_type;
167 typedef typename pool_type::joinable joinable;
169 pool_type pool(T::pool_size);
171 auto const &context=pool<<joinable()<<pool.min_element(v);
172 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::max());
173 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
174 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
177 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, finite_test_types) {
178 typedef typename T::vtr_colln_t vtr_colln_t;
179 typedef typename T::pool_type pool_type;
180 typedef typename pool_type::joinable joinable;
182 pool_type pool(T::pool_size);
183 vtr_colln_t v, v1, v_out;
184 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
185 pool.min_time(vtr_colln_t::memory_access_mode);
186 pool.min_processors(vtr_colln_t::memory_access_mode);
188 BOOST_CHECK_EQUAL(v.empty(),
true);
189 BOOST_CHECK_EQUAL(v1.empty(),
true);
190 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
191 BOOST_CHECK(v==v_out);
192 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
193 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
195 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()),
std::less<
typename vtr_colln_t::value_type>());
196 BOOST_CHECK(v_out==v_chk);
199 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, finite_test_types) {
200 typedef typename T::vtr_colln_t vtr_colln_t;
201 typedef typename T::pool_type pool_type;
202 typedef typename pool_type::joinable joinable;
204 pool_type pool(T::pool_size);
205 vtr_colln_t v, v1, v_out;
206 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
207 pool.min_time(vtr_colln_t::memory_access_mode);
208 pool.min_processors(vtr_colln_t::memory_access_mode);
210 BOOST_CHECK_EQUAL(v.empty(),
true);
211 BOOST_CHECK_EQUAL(v1.empty(),
true);
212 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
213 BOOST_CHECK(v==v_out);
214 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
215 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
217 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
218 BOOST_CHECK(v_out==v_chk);
221 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op, T, finite_test_types) {
222 typedef typename T::vtr_colln_t vtr_colln_t;
223 typedef typename T::pool_type pool_type;
224 typedef typename pool_type::joinable joinable;
226 pool_type pool(T::pool_size);
228 vtr_colln_t v_chk(v);
229 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
230 pool.min_time(vtr_colln_t::memory_access_mode);
231 pool.min_processors(vtr_colln_t::memory_access_mode);
233 BOOST_CHECK_EQUAL(v.empty(),
true);
234 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
235 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
236 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
237 BOOST_CHECK(v==v_chk);
240 BOOST_AUTO_TEST_CASE_TEMPLATE(sort, T, finite_test_types) {
241 typedef typename T::vtr_colln_t vtr_colln_t;
242 typedef typename T::pool_type pool_type;
243 typedef typename pool_type::joinable joinable;
245 pool_type pool(T::pool_size);
247 vtr_colln_t v_chk(v);
248 auto const &context=pool<<joinable()<<pool.sort(v);
249 pool.min_time(vtr_colln_t::memory_access_mode);
250 pool.min_processors(vtr_colln_t::memory_access_mode);
252 BOOST_CHECK_EQUAL(v.empty(),
true);
253 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
254 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
255 std::sort(v_chk.colln().begin(), v_chk.colln().end());
256 BOOST_CHECK(v==v_chk);
259 BOOST_AUTO_TEST_SUITE_END()
261 BOOST_AUTO_TEST_SUITE(nonempty_colln)
263 BOOST_AUTO_TEST_SUITE(one_element)
265 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, finite_test_types) {
266 typedef typename T::vtr_colln_t vtr_colln_t;
267 typedef typename T::pool_type pool_type;
268 typedef typename pool_type::joinable joinable;
270 pool_type pool(T::pool_size);
273 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
274 BOOST_CHECK_EQUAL(*context, 1);
277 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, finite_test_types) {
278 typedef typename T::vtr_colln_t vtr_colln_t;
279 typedef typename T::pool_type pool_type;
280 typedef typename pool_type::joinable joinable;
282 pool_type pool(T::pool_size);
285 auto const &context=pool<<joinable()<<pool.max_element(v);
286 BOOST_CHECK_EQUAL(*context, 1);
289 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, finite_test_types) {
290 typedef typename T::vtr_colln_t vtr_colln_t;
291 typedef typename T::pool_type pool_type;
292 typedef typename pool_type::joinable joinable;
294 pool_type pool(T::pool_size);
297 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
298 BOOST_CHECK_EQUAL(*context, 1);
301 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, finite_test_types) {
302 typedef typename T::vtr_colln_t vtr_colln_t;
303 typedef typename T::pool_type pool_type;
304 typedef typename pool_type::joinable joinable;
306 pool_type pool(T::pool_size);
309 auto const &context=pool<<joinable()<<pool.min_element(v);
310 BOOST_CHECK_EQUAL(*context, 1);
313 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, finite_test_types) {
314 typedef typename T::vtr_colln_t vtr_colln_t;
315 typedef typename T::pool_type pool_type;
316 typedef typename pool_type::joinable joinable;
318 pool_type pool(T::pool_size);
319 vtr_colln_t v, v1, v_out;
322 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
323 pool.min_time(vtr_colln_t::memory_access_mode);
324 pool.min_processors(vtr_colln_t::memory_access_mode);
326 BOOST_CHECK_EQUAL(v.size(), 1U);
327 BOOST_CHECK_EQUAL(v1.size(), 1U);
328 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
329 BOOST_CHECK_EQUAL(v_out[0], v[0]);
330 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
332 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()),
std::less<
typename vtr_colln_t::value_type>());
333 BOOST_CHECK(v_out==v_chk);
336 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, finite_test_types) {
337 typedef typename T::vtr_colln_t vtr_colln_t;
338 typedef typename T::pool_type pool_type;
339 typedef typename pool_type::joinable joinable;
341 pool_type pool(T::pool_size);
342 vtr_colln_t v, v1, v_out;
345 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
346 pool.min_time(vtr_colln_t::memory_access_mode);
347 pool.min_processors(vtr_colln_t::memory_access_mode);
349 BOOST_CHECK_EQUAL(v.size(), 1U);
350 BOOST_CHECK_EQUAL(v1.size(), 1U);
351 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
352 BOOST_CHECK_EQUAL(v_out[0], v[0]);
353 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
355 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
356 BOOST_CHECK(v_out==v_chk);
359 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op, T, finite_test_types) {
360 typedef typename T::vtr_colln_t vtr_colln_t;
361 typedef typename T::pool_type pool_type;
362 typedef typename pool_type::joinable joinable;
364 pool_type pool(T::pool_size);
367 vtr_colln_t v_chk(v);
368 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
369 pool.min_time(vtr_colln_t::memory_access_mode);
370 pool.min_processors(vtr_colln_t::memory_access_mode);
372 BOOST_CHECK_EQUAL(v.size(), 1U);
373 BOOST_CHECK_EQUAL(v[0], 1);
374 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
375 BOOST_CHECK(v==v_chk);
378 BOOST_AUTO_TEST_CASE_TEMPLATE(sort, T, finite_test_types) {
379 typedef typename T::vtr_colln_t vtr_colln_t;
380 typedef typename T::pool_type pool_type;
381 typedef typename pool_type::joinable joinable;
383 pool_type pool(T::pool_size);
386 vtr_colln_t v_chk(v);
387 auto const &context=pool<<joinable()<<pool.sort(v);
388 pool.min_time(vtr_colln_t::memory_access_mode);
389 pool.min_processors(vtr_colln_t::memory_access_mode);
391 BOOST_CHECK_EQUAL(v.size(), 1U);
392 BOOST_CHECK_EQUAL(v[0], 1);
393 std::sort(v_chk.colln().begin(), v_chk.colln().end());
394 BOOST_CHECK(v==v_chk);
397 BOOST_AUTO_TEST_SUITE_END()
399 BOOST_AUTO_TEST_SUITE(two_elements)
401 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, finite_test_types) {
402 typedef typename T::vtr_colln_t vtr_colln_t;
403 typedef typename T::pool_type pool_type;
404 typedef typename pool_type::joinable joinable;
406 pool_type pool(T::pool_size);
410 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
411 BOOST_CHECK_EQUAL(*context, 1);
414 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, finite_test_types) {
415 typedef typename T::vtr_colln_t vtr_colln_t;
416 typedef typename T::pool_type pool_type;
417 typedef typename pool_type::joinable joinable;
419 pool_type pool(T::pool_size);
423 auto const &context=pool<<joinable()<<pool.max_element(v);
424 BOOST_CHECK_EQUAL(*context, 2);
427 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, finite_test_types) {
428 typedef typename T::vtr_colln_t vtr_colln_t;
429 typedef typename T::pool_type pool_type;
430 typedef typename pool_type::joinable joinable;
432 pool_type pool(T::pool_size);
436 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
437 BOOST_CHECK_EQUAL(*context, 2);
440 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, finite_test_types) {
441 typedef typename T::vtr_colln_t vtr_colln_t;
442 typedef typename T::pool_type pool_type;
443 typedef typename pool_type::joinable joinable;
445 pool_type pool(T::pool_size);
449 auto const &context=pool<<joinable()<<pool.min_element(v);
450 BOOST_CHECK_EQUAL(*context, 1);
453 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, finite_test_types) {
454 typedef typename T::vtr_colln_t vtr_colln_t;
455 typedef typename T::pool_type pool_type;
456 typedef typename pool_type::joinable joinable;
458 pool_type pool(T::pool_size);
459 vtr_colln_t v, v1, v_out;
464 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
465 pool.min_time(vtr_colln_t::memory_access_mode);
466 pool.min_processors(vtr_colln_t::memory_access_mode);
468 BOOST_CHECK_EQUAL(v.size(), 2U);
469 BOOST_CHECK_EQUAL(v1.size(), 2U);
470 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
471 BOOST_CHECK_EQUAL(v_out[0], v[0]);
472 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
473 BOOST_CHECK_EQUAL(v_out[2], v[1]);
474 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
476 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()),
std::less<
typename vtr_colln_t::value_type>());
477 BOOST_CHECK(v_out==v_chk);
480 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, finite_test_types) {
481 typedef typename T::vtr_colln_t vtr_colln_t;
482 typedef typename T::pool_type pool_type;
483 typedef typename pool_type::joinable joinable;
485 pool_type pool(T::pool_size);
486 vtr_colln_t v, v1, v_out;
491 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
492 pool.min_time(vtr_colln_t::memory_access_mode);
493 pool.min_processors(vtr_colln_t::memory_access_mode);
495 BOOST_CHECK_EQUAL(v.size(), 2U);
496 BOOST_CHECK_EQUAL(v1.size(), 2U);
497 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
498 BOOST_CHECK_EQUAL(v_out[0], v[0]);
499 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
500 BOOST_CHECK_EQUAL(v_out[2], v[1]);
501 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
503 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
504 BOOST_CHECK(v_out==v_chk);
507 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_sorted, T, finite_test_types) {
508 typedef typename T::vtr_colln_t vtr_colln_t;
509 typedef typename T::pool_type pool_type;
510 typedef typename pool_type::joinable joinable;
512 pool_type pool(T::pool_size);
516 vtr_colln_t v_chk(v);
517 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
518 pool.min_time(vtr_colln_t::memory_access_mode);
519 pool.min_processors(vtr_colln_t::memory_access_mode);
521 BOOST_CHECK_EQUAL(v.size(), 2U);
522 BOOST_CHECK_EQUAL(v[0], 2);
523 BOOST_CHECK_EQUAL(v[1], 1);
524 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
525 BOOST_CHECK(v==v_chk);
528 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_unsorted, T, finite_test_types) {
529 typedef typename T::vtr_colln_t vtr_colln_t;
530 typedef typename T::pool_type pool_type;
531 typedef typename pool_type::joinable joinable;
533 pool_type pool(T::pool_size);
537 vtr_colln_t v_chk(v);
538 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
539 pool.min_time(vtr_colln_t::memory_access_mode);
540 pool.min_processors(vtr_colln_t::memory_access_mode);
542 BOOST_CHECK_EQUAL(v.size(), 2U);
543 BOOST_CHECK_EQUAL(v[0], 2);
544 BOOST_CHECK_EQUAL(v[1], 1);
545 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
546 BOOST_CHECK(v==v_chk);
549 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_sorted, T, finite_test_types) {
550 typedef typename T::vtr_colln_t vtr_colln_t;
551 typedef typename T::pool_type pool_type;
552 typedef typename pool_type::joinable joinable;
554 pool_type pool(T::pool_size);
558 vtr_colln_t v_chk(v);
559 auto const &context=pool<<joinable()<<pool.sort(v);
560 pool.min_time(vtr_colln_t::memory_access_mode);
561 pool.min_processors(vtr_colln_t::memory_access_mode);
563 BOOST_CHECK_EQUAL(v.size(), 2U);
564 BOOST_CHECK_EQUAL(v[0], 1);
565 BOOST_CHECK_EQUAL(v[1], 2);
566 std::sort(v_chk.colln().begin(), v_chk.colln().end());
567 BOOST_CHECK(v==v_chk);
570 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_unsorted, T, finite_test_types) {
571 typedef typename T::vtr_colln_t vtr_colln_t;
572 typedef typename T::pool_type pool_type;
573 typedef typename pool_type::joinable joinable;
575 pool_type pool(T::pool_size);
579 vtr_colln_t v_chk(v);
580 auto const &context=pool<<joinable()<<pool.sort(v);
581 pool.min_time(vtr_colln_t::memory_access_mode);
582 pool.min_processors(vtr_colln_t::memory_access_mode);
584 BOOST_CHECK_EQUAL(v.size(), 2U);
585 BOOST_CHECK_EQUAL(v[0], 1);
586 BOOST_CHECK_EQUAL(v[1], 2);
587 std::sort(v_chk.colln().begin(), v_chk.colln().end());
588 BOOST_CHECK(v==v_chk);
591 BOOST_AUTO_TEST_SUITE_END()
593 BOOST_AUTO_TEST_SUITE(n_elements)
595 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, finite_test_types) {
596 typedef typename T::vtr_colln_t vtr_colln_t;
597 typedef typename T::pool_type pool_type;
598 typedef typename pool_type::joinable joinable;
600 pool_type pool(T::pool_size);
610 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
611 BOOST_CHECK_EQUAL(*context, 1);
614 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, finite_test_types) {
615 typedef typename T::vtr_colln_t vtr_colln_t;
616 typedef typename T::pool_type pool_type;
617 typedef typename pool_type::joinable joinable;
619 pool_type pool(T::pool_size);
629 auto const &context=pool<<joinable()<<pool.max_element(v);
630 BOOST_CHECK_EQUAL(*context, 8);
633 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, finite_test_types) {
634 typedef typename T::vtr_colln_t vtr_colln_t;
635 typedef typename T::pool_type pool_type;
636 typedef typename pool_type::joinable joinable;
638 pool_type pool(T::pool_size);
648 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
649 BOOST_CHECK_EQUAL(*context, 8);
652 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, finite_test_types) {
653 typedef typename T::vtr_colln_t vtr_colln_t;
654 typedef typename T::pool_type pool_type;
655 typedef typename pool_type::joinable joinable;
657 pool_type pool(T::pool_size);
667 auto const &context=pool<<joinable()<<pool.min_element(v);
668 BOOST_CHECK_EQUAL(*context, 1);
671 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, finite_test_types) {
672 typedef typename T::vtr_colln_t vtr_colln_t;
673 typedef typename T::pool_type pool_type;
674 typedef typename pool_type::joinable joinable;
676 pool_type pool(T::pool_size);
677 vtr_colln_t v, v1, v_out;
694 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
695 pool.min_time(vtr_colln_t::memory_access_mode);
696 pool.min_processors(vtr_colln_t::memory_access_mode);
698 BOOST_CHECK_EQUAL(v.size(), 8U);
699 BOOST_CHECK_EQUAL(v1.size(), 8U);
700 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
701 BOOST_CHECK_EQUAL(v_out[0], v[0]);
702 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
703 BOOST_CHECK_EQUAL(v_out[2], v[1]);
704 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
705 BOOST_CHECK_EQUAL(v_out[4], v[2]);
706 BOOST_CHECK_EQUAL(v_out[5], v1[2]);
707 BOOST_CHECK_EQUAL(v_out[6], v[3]);
708 BOOST_CHECK_EQUAL(v_out[7], v1[3]);
709 BOOST_CHECK_EQUAL(v_out[8], v[4]);
710 BOOST_CHECK_EQUAL(v_out[9], v1[4]);
711 BOOST_CHECK_EQUAL(v_out[10], v[5]);
712 BOOST_CHECK_EQUAL(v_out[11], v1[5]);
713 BOOST_CHECK_EQUAL(v_out[12], v[6]);
714 BOOST_CHECK_EQUAL(v_out[13], v1[6]);
715 BOOST_CHECK_EQUAL(v_out[14], v[7]);
716 BOOST_CHECK_EQUAL(v_out[15], v1[7]);
718 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()),
std::less<
typename vtr_colln_t::value_type>());
719 BOOST_CHECK(v_out==v_chk);
722 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, finite_test_types) {
723 typedef typename T::vtr_colln_t vtr_colln_t;
724 typedef typename T::pool_type pool_type;
725 typedef typename pool_type::joinable joinable;
727 pool_type pool(T::pool_size);
728 vtr_colln_t v, v1, v_out;
745 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
746 pool.min_time(vtr_colln_t::memory_access_mode);
747 pool.min_processors(vtr_colln_t::memory_access_mode);
749 BOOST_CHECK_EQUAL(v.size(), 8U);
750 BOOST_CHECK_EQUAL(v1.size(), 8U);
751 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
752 BOOST_CHECK_EQUAL(v_out[0], v[0]);
753 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
754 BOOST_CHECK_EQUAL(v_out[2], v[1]);
755 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
756 BOOST_CHECK_EQUAL(v_out[4], v[2]);
757 BOOST_CHECK_EQUAL(v_out[5], v1[2]);
758 BOOST_CHECK_EQUAL(v_out[6], v[3]);
759 BOOST_CHECK_EQUAL(v_out[7], v1[3]);
760 BOOST_CHECK_EQUAL(v_out[8], v[4]);
761 BOOST_CHECK_EQUAL(v_out[9], v1[4]);
762 BOOST_CHECK_EQUAL(v_out[10], v[5]);
763 BOOST_CHECK_EQUAL(v_out[11], v1[5]);
764 BOOST_CHECK_EQUAL(v_out[12], v[6]);
765 BOOST_CHECK_EQUAL(v_out[13], v1[6]);
766 BOOST_CHECK_EQUAL(v_out[14], v[7]);
767 BOOST_CHECK_EQUAL(v_out[15], v1[7]);
769 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
770 BOOST_CHECK(v_out==v_chk);
773 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_sorted, T, finite_test_types) {
774 typedef typename T::vtr_colln_t vtr_colln_t;
775 typedef typename T::pool_type pool_type;
776 typedef typename pool_type::joinable joinable;
778 pool_type pool(T::pool_size);
788 vtr_colln_t v_chk(v);
789 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
790 pool.min_time(vtr_colln_t::memory_access_mode);
791 pool.min_processors(vtr_colln_t::memory_access_mode);
793 BOOST_CHECK_EQUAL(v.size(), 8U);
794 BOOST_CHECK_EQUAL(v[0], 8);
795 BOOST_CHECK_EQUAL(v[1], 7);
796 BOOST_CHECK_EQUAL(v[2], 6);
797 BOOST_CHECK_EQUAL(v[3], 5);
798 BOOST_CHECK_EQUAL(v[4], 4);
799 BOOST_CHECK_EQUAL(v[5], 3);
800 BOOST_CHECK_EQUAL(v[6], 2);
801 BOOST_CHECK_EQUAL(v[7], 1);
802 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
803 BOOST_CHECK(v==v_chk);
806 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_unsorted, T, finite_test_types) {
807 typedef typename T::vtr_colln_t vtr_colln_t;
808 typedef typename T::pool_type pool_type;
809 typedef typename pool_type::joinable joinable;
811 pool_type pool(T::pool_size);
821 vtr_colln_t v_chk(v);
822 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
823 pool.min_time(vtr_colln_t::memory_access_mode);
824 pool.min_processors(vtr_colln_t::memory_access_mode);
826 BOOST_CHECK_EQUAL(v.size(), 8U);
827 BOOST_CHECK_EQUAL(v[0], 8);
828 BOOST_CHECK_EQUAL(v[1], 7);
829 BOOST_CHECK_EQUAL(v[2], 6);
830 BOOST_CHECK_EQUAL(v[3], 5);
831 BOOST_CHECK_EQUAL(v[4], 4);
832 BOOST_CHECK_EQUAL(v[5], 3);
833 BOOST_CHECK_EQUAL(v[6], 2);
834 BOOST_CHECK_EQUAL(v[7], 1);
835 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
836 BOOST_CHECK(v==v_chk);
839 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_sorted, T, finite_test_types) {
840 typedef typename T::vtr_colln_t vtr_colln_t;
841 typedef typename T::pool_type pool_type;
842 typedef typename pool_type::joinable joinable;
844 pool_type pool(T::pool_size);
854 vtr_colln_t v_chk(v);
855 auto const &context=pool<<joinable()<<pool.sort(v);
856 pool.min_time(vtr_colln_t::memory_access_mode);
857 pool.min_processors(vtr_colln_t::memory_access_mode);
859 BOOST_CHECK_EQUAL(v.size(), 8U);
860 BOOST_CHECK_EQUAL(v[0], 1);
861 BOOST_CHECK_EQUAL(v[1], 2);
862 BOOST_CHECK_EQUAL(v[2], 3);
863 BOOST_CHECK_EQUAL(v[3], 4);
864 BOOST_CHECK_EQUAL(v[4], 5);
865 BOOST_CHECK_EQUAL(v[5], 6);
866 BOOST_CHECK_EQUAL(v[6], 7);
867 BOOST_CHECK_EQUAL(v[7], 8);
868 std::sort(v_chk.colln().begin(), v_chk.colln().end());
869 BOOST_CHECK(v==v_chk);
872 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_unsorted, T, finite_test_types) {
873 typedef typename T::vtr_colln_t vtr_colln_t;
874 typedef typename T::pool_type pool_type;
875 typedef typename pool_type::joinable joinable;
877 pool_type pool(T::pool_size);
887 vtr_colln_t v_chk(v);
888 auto const &context=pool<<joinable()<<pool.sort(v);
889 pool.min_time(vtr_colln_t::memory_access_mode);
890 pool.min_processors(vtr_colln_t::memory_access_mode);
892 BOOST_CHECK_EQUAL(v.size(), 8U);
893 BOOST_CHECK_EQUAL(v[0], 1);
894 BOOST_CHECK_EQUAL(v[1], 2);
895 BOOST_CHECK_EQUAL(v[2], 3);
896 BOOST_CHECK_EQUAL(v[3], 4);
897 BOOST_CHECK_EQUAL(v[4], 5);
898 BOOST_CHECK_EQUAL(v[5], 6);
899 BOOST_CHECK_EQUAL(v[6], 7);
900 BOOST_CHECK_EQUAL(v[7], 8);
901 std::sort(v_chk.colln().begin(), v_chk.colln().end());
902 BOOST_CHECK(v==v_chk);
905 BOOST_AUTO_TEST_SUITE_END()
907 BOOST_AUTO_TEST_SUITE_END()
909 BOOST_AUTO_TEST_SUITE_END()
911 BOOST_AUTO_TEST_SUITE_END()
913 BOOST_AUTO_TEST_SUITE_END()