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>,
88 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
89 crew_priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
93 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
94 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading, 0, 2>,
95 crew_priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
96 crew_priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading, 0, 2>
97 > infinite_test_types;
102 struct square :
std::unary_function<T,
void> {
118 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
120 BOOST_AUTO_TEST_SUITE(joinable_dataflow)
122 BOOST_AUTO_TEST_SUITE(infinite)
124 BOOST_AUTO_TEST_SUITE(empty_colln)
126 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, infinite_test_types) {
127 typedef typename T::vtr_colln_t vtr_colln_t;
128 typedef typename T::pool_type pool_type;
129 typedef typename pool_type::joinable joinable;
133 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
134 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::min());
135 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
136 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
139 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, infinite_test_types) {
140 typedef typename T::vtr_colln_t vtr_colln_t;
141 typedef typename T::pool_type pool_type;
142 typedef typename pool_type::joinable joinable;
146 auto const &context=pool<<joinable()<<pool.max_element(v);
147 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::min());
148 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
149 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
152 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, infinite_test_types) {
153 typedef typename T::vtr_colln_t vtr_colln_t;
154 typedef typename T::pool_type pool_type;
155 typedef typename pool_type::joinable joinable;
159 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
160 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::max());
161 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
162 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
165 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, infinite_test_types) {
166 typedef typename T::vtr_colln_t vtr_colln_t;
167 typedef typename T::pool_type pool_type;
168 typedef typename pool_type::joinable joinable;
172 auto const &context=pool<<joinable()<<pool.min_element(v);
173 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::max());
174 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
175 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
178 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, infinite_test_types) {
179 typedef typename T::vtr_colln_t vtr_colln_t;
180 typedef typename T::pool_type pool_type;
181 typedef typename pool_type::joinable joinable;
184 vtr_colln_t v, v1, v_out;
185 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
186 pool.min_time(vtr_colln_t::memory_access_mode);
187 pool.min_processors(vtr_colln_t::memory_access_mode);
189 BOOST_CHECK_EQUAL(v.empty(),
true);
190 BOOST_CHECK_EQUAL(v1.empty(),
true);
191 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
192 BOOST_CHECK(v==v_out);
193 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
194 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
196 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>());
197 BOOST_CHECK(v_out==v_chk);
200 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, infinite_test_types) {
201 typedef typename T::vtr_colln_t vtr_colln_t;
202 typedef typename T::pool_type pool_type;
203 typedef typename pool_type::joinable joinable;
206 vtr_colln_t v, v1, v_out;
207 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
208 pool.min_time(vtr_colln_t::memory_access_mode);
209 pool.min_processors(vtr_colln_t::memory_access_mode);
211 BOOST_CHECK_EQUAL(v.empty(),
true);
212 BOOST_CHECK_EQUAL(v1.empty(),
true);
213 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
214 BOOST_CHECK(v==v_out);
215 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
216 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
218 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
219 BOOST_CHECK(v_out==v_chk);
222 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op, T, infinite_test_types) {
223 typedef typename T::vtr_colln_t vtr_colln_t;
224 typedef typename T::pool_type pool_type;
225 typedef typename pool_type::joinable joinable;
229 vtr_colln_t v_chk(v);
230 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
231 pool.min_time(vtr_colln_t::memory_access_mode);
232 pool.min_processors(vtr_colln_t::memory_access_mode);
234 BOOST_CHECK_EQUAL(v.empty(),
true);
235 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
236 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
237 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
238 BOOST_CHECK(v==v_chk);
241 BOOST_AUTO_TEST_CASE_TEMPLATE(sort, T, infinite_test_types) {
242 typedef typename T::vtr_colln_t vtr_colln_t;
243 typedef typename T::pool_type pool_type;
244 typedef typename pool_type::joinable joinable;
248 vtr_colln_t v_chk(v);
249 auto const &context=pool<<joinable()<<pool.sort(v);
250 pool.min_time(vtr_colln_t::memory_access_mode);
251 pool.min_processors(vtr_colln_t::memory_access_mode);
253 BOOST_CHECK_EQUAL(v.empty(),
true);
254 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
255 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
256 std::sort(v_chk.colln().begin(), v_chk.colln().end());
257 BOOST_CHECK(v==v_chk);
260 BOOST_AUTO_TEST_SUITE_END()
262 BOOST_AUTO_TEST_SUITE(nonempty_colln)
264 BOOST_AUTO_TEST_SUITE(one_element)
266 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, infinite_test_types) {
267 typedef typename T::vtr_colln_t vtr_colln_t;
268 typedef typename T::pool_type pool_type;
269 typedef typename pool_type::joinable joinable;
274 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
275 BOOST_CHECK_EQUAL(*context, 1);
278 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, infinite_test_types) {
279 typedef typename T::vtr_colln_t vtr_colln_t;
280 typedef typename T::pool_type pool_type;
281 typedef typename pool_type::joinable joinable;
286 auto const &context=pool<<joinable()<<pool.max_element(v);
287 BOOST_CHECK_EQUAL(*context, 1);
290 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, infinite_test_types) {
291 typedef typename T::vtr_colln_t vtr_colln_t;
292 typedef typename T::pool_type pool_type;
293 typedef typename pool_type::joinable joinable;
298 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
299 BOOST_CHECK_EQUAL(*context, 1);
302 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, infinite_test_types) {
303 typedef typename T::vtr_colln_t vtr_colln_t;
304 typedef typename T::pool_type pool_type;
305 typedef typename pool_type::joinable joinable;
310 auto const &context=pool<<joinable()<<pool.min_element(v);
311 BOOST_CHECK_EQUAL(*context, 1);
314 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, infinite_test_types) {
315 typedef typename T::vtr_colln_t vtr_colln_t;
316 typedef typename T::pool_type pool_type;
317 typedef typename pool_type::joinable joinable;
320 vtr_colln_t v, v1, v_out;
323 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
324 pool.min_time(vtr_colln_t::memory_access_mode);
325 pool.min_processors(vtr_colln_t::memory_access_mode);
327 BOOST_CHECK_EQUAL(v.size(), 1U);
328 BOOST_CHECK_EQUAL(v1.size(), 1U);
329 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
330 BOOST_CHECK_EQUAL(v_out[0], v[0]);
331 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
333 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>());
334 BOOST_CHECK(v_out==v_chk);
337 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, infinite_test_types) {
338 typedef typename T::vtr_colln_t vtr_colln_t;
339 typedef typename T::pool_type pool_type;
340 typedef typename pool_type::joinable joinable;
343 vtr_colln_t v, v1, v_out;
346 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
347 pool.min_time(vtr_colln_t::memory_access_mode);
348 pool.min_processors(vtr_colln_t::memory_access_mode);
350 BOOST_CHECK_EQUAL(v.size(), 1U);
351 BOOST_CHECK_EQUAL(v1.size(), 1U);
352 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
353 BOOST_CHECK_EQUAL(v_out[0], v[0]);
354 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
356 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
357 BOOST_CHECK(v_out==v_chk);
360 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op, T, infinite_test_types) {
361 typedef typename T::vtr_colln_t vtr_colln_t;
362 typedef typename T::pool_type pool_type;
363 typedef typename pool_type::joinable joinable;
368 vtr_colln_t v_chk(v);
369 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
370 pool.min_time(vtr_colln_t::memory_access_mode);
371 pool.min_processors(vtr_colln_t::memory_access_mode);
373 BOOST_CHECK_EQUAL(v.size(), 1U);
374 BOOST_CHECK_EQUAL(v[0], 1);
375 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
376 BOOST_CHECK(v==v_chk);
379 BOOST_AUTO_TEST_CASE_TEMPLATE(sort, T, infinite_test_types) {
380 typedef typename T::vtr_colln_t vtr_colln_t;
381 typedef typename T::pool_type pool_type;
382 typedef typename pool_type::joinable joinable;
387 vtr_colln_t v_chk(v);
388 auto const &context=pool<<joinable()<<pool.sort(v);
389 pool.min_time(vtr_colln_t::memory_access_mode);
390 pool.min_processors(vtr_colln_t::memory_access_mode);
392 BOOST_CHECK_EQUAL(v.size(), 1U);
393 BOOST_CHECK_EQUAL(v[0], 1);
394 std::sort(v_chk.colln().begin(), v_chk.colln().end());
395 BOOST_CHECK(v==v_chk);
398 BOOST_AUTO_TEST_SUITE_END()
400 BOOST_AUTO_TEST_SUITE(two_elements)
402 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, infinite_test_types) {
403 typedef typename T::vtr_colln_t vtr_colln_t;
404 typedef typename T::pool_type pool_type;
405 typedef typename pool_type::joinable joinable;
411 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
412 BOOST_CHECK_EQUAL(*context, 1);
415 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, infinite_test_types) {
416 typedef typename T::vtr_colln_t vtr_colln_t;
417 typedef typename T::pool_type pool_type;
418 typedef typename pool_type::joinable joinable;
424 auto const &context=pool<<joinable()<<pool.max_element(v);
425 BOOST_CHECK_EQUAL(*context, 2);
428 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, infinite_test_types) {
429 typedef typename T::vtr_colln_t vtr_colln_t;
430 typedef typename T::pool_type pool_type;
431 typedef typename pool_type::joinable joinable;
437 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
438 BOOST_CHECK_EQUAL(*context, 2);
441 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, infinite_test_types) {
442 typedef typename T::vtr_colln_t vtr_colln_t;
443 typedef typename T::pool_type pool_type;
444 typedef typename pool_type::joinable joinable;
450 auto const &context=pool<<joinable()<<pool.min_element(v);
451 BOOST_CHECK_EQUAL(*context, 1);
454 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, infinite_test_types) {
455 typedef typename T::vtr_colln_t vtr_colln_t;
456 typedef typename T::pool_type pool_type;
457 typedef typename pool_type::joinable joinable;
460 vtr_colln_t v, v1, v_out;
465 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
466 pool.min_time(vtr_colln_t::memory_access_mode);
467 pool.min_processors(vtr_colln_t::memory_access_mode);
469 BOOST_CHECK_EQUAL(v.size(), 2U);
470 BOOST_CHECK_EQUAL(v1.size(), 2U);
471 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
472 BOOST_CHECK_EQUAL(v_out[0], v[0]);
473 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
474 BOOST_CHECK_EQUAL(v_out[2], v[1]);
475 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
477 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>());
478 BOOST_CHECK(v_out==v_chk);
481 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, infinite_test_types) {
482 typedef typename T::vtr_colln_t vtr_colln_t;
483 typedef typename T::pool_type pool_type;
484 typedef typename pool_type::joinable joinable;
487 vtr_colln_t v, v1, v_out;
492 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
493 pool.min_time(vtr_colln_t::memory_access_mode);
494 pool.min_processors(vtr_colln_t::memory_access_mode);
496 BOOST_CHECK_EQUAL(v.size(), 2U);
497 BOOST_CHECK_EQUAL(v1.size(), 2U);
498 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
499 BOOST_CHECK_EQUAL(v_out[0], v[0]);
500 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
501 BOOST_CHECK_EQUAL(v_out[2], v[1]);
502 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
504 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
505 BOOST_CHECK(v_out==v_chk);
508 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_sorted, T, infinite_test_types) {
509 typedef typename T::vtr_colln_t vtr_colln_t;
510 typedef typename T::pool_type pool_type;
511 typedef typename pool_type::joinable joinable;
517 vtr_colln_t v_chk(v);
518 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
519 pool.min_time(vtr_colln_t::memory_access_mode);
520 pool.min_processors(vtr_colln_t::memory_access_mode);
522 BOOST_CHECK_EQUAL(v.size(), 2U);
523 BOOST_CHECK_EQUAL(v[0], 2);
524 BOOST_CHECK_EQUAL(v[1], 1);
525 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
526 BOOST_CHECK(v==v_chk);
529 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_unsorted, T, infinite_test_types) {
530 typedef typename T::vtr_colln_t vtr_colln_t;
531 typedef typename T::pool_type pool_type;
532 typedef typename pool_type::joinable joinable;
538 vtr_colln_t v_chk(v);
539 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
540 pool.min_time(vtr_colln_t::memory_access_mode);
541 pool.min_processors(vtr_colln_t::memory_access_mode);
543 BOOST_CHECK_EQUAL(v.size(), 2U);
544 BOOST_CHECK_EQUAL(v[0], 2);
545 BOOST_CHECK_EQUAL(v[1], 1);
546 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
547 BOOST_CHECK(v==v_chk);
550 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_sorted, T, infinite_test_types) {
551 typedef typename T::vtr_colln_t vtr_colln_t;
552 typedef typename T::pool_type pool_type;
553 typedef typename pool_type::joinable joinable;
559 vtr_colln_t v_chk(v);
560 auto const &context=pool<<joinable()<<pool.sort(v);
561 pool.min_time(vtr_colln_t::memory_access_mode);
562 pool.min_processors(vtr_colln_t::memory_access_mode);
564 BOOST_CHECK_EQUAL(v.size(), 2U);
565 BOOST_CHECK_EQUAL(v[0], 1);
566 BOOST_CHECK_EQUAL(v[1], 2);
567 std::sort(v_chk.colln().begin(), v_chk.colln().end());
568 BOOST_CHECK(v==v_chk);
571 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_unsorted, T, infinite_test_types) {
572 typedef typename T::vtr_colln_t vtr_colln_t;
573 typedef typename T::pool_type pool_type;
574 typedef typename pool_type::joinable joinable;
580 vtr_colln_t v_chk(v);
581 auto const &context=pool<<joinable()<<pool.sort(v);
582 pool.min_time(vtr_colln_t::memory_access_mode);
583 pool.min_processors(vtr_colln_t::memory_access_mode);
585 BOOST_CHECK_EQUAL(v.size(), 2U);
586 BOOST_CHECK_EQUAL(v[0], 1);
587 BOOST_CHECK_EQUAL(v[1], 2);
588 std::sort(v_chk.colln().begin(), v_chk.colln().end());
589 BOOST_CHECK(v==v_chk);
592 BOOST_AUTO_TEST_SUITE_END()
594 BOOST_AUTO_TEST_SUITE(n_elements)
596 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, infinite_test_types) {
597 typedef typename T::vtr_colln_t vtr_colln_t;
598 typedef typename T::pool_type pool_type;
599 typedef typename pool_type::joinable joinable;
611 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
612 BOOST_CHECK_EQUAL(*context, 1);
615 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, infinite_test_types) {
616 typedef typename T::vtr_colln_t vtr_colln_t;
617 typedef typename T::pool_type pool_type;
618 typedef typename pool_type::joinable joinable;
630 auto const &context=pool<<joinable()<<pool.max_element(v);
631 BOOST_CHECK_EQUAL(*context, 8);
634 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, infinite_test_types) {
635 typedef typename T::vtr_colln_t vtr_colln_t;
636 typedef typename T::pool_type pool_type;
637 typedef typename pool_type::joinable joinable;
649 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
650 BOOST_CHECK_EQUAL(*context, 8);
653 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, infinite_test_types) {
654 typedef typename T::vtr_colln_t vtr_colln_t;
655 typedef typename T::pool_type pool_type;
656 typedef typename pool_type::joinable joinable;
668 auto const &context=pool<<joinable()<<pool.min_element(v);
669 BOOST_CHECK_EQUAL(*context, 1);
672 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, infinite_test_types) {
673 typedef typename T::vtr_colln_t vtr_colln_t;
674 typedef typename T::pool_type pool_type;
675 typedef typename pool_type::joinable joinable;
678 vtr_colln_t v, v1, v_out;
695 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
696 pool.min_time(vtr_colln_t::memory_access_mode);
697 pool.min_processors(vtr_colln_t::memory_access_mode);
699 BOOST_CHECK_EQUAL(v.size(), 8U);
700 BOOST_CHECK_EQUAL(v1.size(), 8U);
701 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
702 BOOST_CHECK_EQUAL(v_out[0], v[0]);
703 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
704 BOOST_CHECK_EQUAL(v_out[2], v[1]);
705 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
706 BOOST_CHECK_EQUAL(v_out[4], v[2]);
707 BOOST_CHECK_EQUAL(v_out[5], v1[2]);
708 BOOST_CHECK_EQUAL(v_out[6], v[3]);
709 BOOST_CHECK_EQUAL(v_out[7], v1[3]);
710 BOOST_CHECK_EQUAL(v_out[8], v[4]);
711 BOOST_CHECK_EQUAL(v_out[9], v1[4]);
712 BOOST_CHECK_EQUAL(v_out[10], v[5]);
713 BOOST_CHECK_EQUAL(v_out[11], v1[5]);
714 BOOST_CHECK_EQUAL(v_out[12], v[6]);
715 BOOST_CHECK_EQUAL(v_out[13], v1[6]);
716 BOOST_CHECK_EQUAL(v_out[14], v[7]);
717 BOOST_CHECK_EQUAL(v_out[15], v1[7]);
719 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>());
720 BOOST_CHECK(v_out==v_chk);
723 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, infinite_test_types) {
724 typedef typename T::vtr_colln_t vtr_colln_t;
725 typedef typename T::pool_type pool_type;
726 typedef typename pool_type::joinable joinable;
729 vtr_colln_t v, v1, v_out;
746 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
747 pool.min_time(vtr_colln_t::memory_access_mode);
748 pool.min_processors(vtr_colln_t::memory_access_mode);
750 BOOST_CHECK_EQUAL(v.size(), 8U);
751 BOOST_CHECK_EQUAL(v1.size(), 8U);
752 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
753 BOOST_CHECK_EQUAL(v_out[0], v[0]);
754 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
755 BOOST_CHECK_EQUAL(v_out[2], v[1]);
756 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
757 BOOST_CHECK_EQUAL(v_out[4], v[2]);
758 BOOST_CHECK_EQUAL(v_out[5], v1[2]);
759 BOOST_CHECK_EQUAL(v_out[6], v[3]);
760 BOOST_CHECK_EQUAL(v_out[7], v1[3]);
761 BOOST_CHECK_EQUAL(v_out[8], v[4]);
762 BOOST_CHECK_EQUAL(v_out[9], v1[4]);
763 BOOST_CHECK_EQUAL(v_out[10], v[5]);
764 BOOST_CHECK_EQUAL(v_out[11], v1[5]);
765 BOOST_CHECK_EQUAL(v_out[12], v[6]);
766 BOOST_CHECK_EQUAL(v_out[13], v1[6]);
767 BOOST_CHECK_EQUAL(v_out[14], v[7]);
768 BOOST_CHECK_EQUAL(v_out[15], v1[7]);
770 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
771 BOOST_CHECK(v_out==v_chk);
774 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_sorted, T, infinite_test_types) {
775 typedef typename T::vtr_colln_t vtr_colln_t;
776 typedef typename T::pool_type pool_type;
777 typedef typename pool_type::joinable joinable;
789 vtr_colln_t v_chk(v);
790 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
791 pool.min_time(vtr_colln_t::memory_access_mode);
792 pool.min_processors(vtr_colln_t::memory_access_mode);
794 BOOST_CHECK_EQUAL(v.size(), 8U);
795 BOOST_CHECK_EQUAL(v[0], 8);
796 BOOST_CHECK_EQUAL(v[1], 7);
797 BOOST_CHECK_EQUAL(v[2], 6);
798 BOOST_CHECK_EQUAL(v[3], 5);
799 BOOST_CHECK_EQUAL(v[4], 4);
800 BOOST_CHECK_EQUAL(v[5], 3);
801 BOOST_CHECK_EQUAL(v[6], 2);
802 BOOST_CHECK_EQUAL(v[7], 1);
803 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
804 BOOST_CHECK(v==v_chk);
807 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_unsorted, T, infinite_test_types) {
808 typedef typename T::vtr_colln_t vtr_colln_t;
809 typedef typename T::pool_type pool_type;
810 typedef typename pool_type::joinable joinable;
822 vtr_colln_t v_chk(v);
823 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
824 pool.min_time(vtr_colln_t::memory_access_mode);
825 pool.min_processors(vtr_colln_t::memory_access_mode);
827 BOOST_CHECK_EQUAL(v.size(), 8U);
828 BOOST_CHECK_EQUAL(v[0], 8);
829 BOOST_CHECK_EQUAL(v[1], 7);
830 BOOST_CHECK_EQUAL(v[2], 6);
831 BOOST_CHECK_EQUAL(v[3], 5);
832 BOOST_CHECK_EQUAL(v[4], 4);
833 BOOST_CHECK_EQUAL(v[5], 3);
834 BOOST_CHECK_EQUAL(v[6], 2);
835 BOOST_CHECK_EQUAL(v[7], 1);
836 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
837 BOOST_CHECK(v==v_chk);
840 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_sorted, T, infinite_test_types) {
841 typedef typename T::vtr_colln_t vtr_colln_t;
842 typedef typename T::pool_type pool_type;
843 typedef typename pool_type::joinable joinable;
855 vtr_colln_t v_chk(v);
856 auto const &context=pool<<joinable()<<pool.sort(v);
857 pool.min_time(vtr_colln_t::memory_access_mode);
858 pool.min_processors(vtr_colln_t::memory_access_mode);
860 BOOST_CHECK_EQUAL(v.size(), 8U);
861 BOOST_CHECK_EQUAL(v[0], 1);
862 BOOST_CHECK_EQUAL(v[1], 2);
863 BOOST_CHECK_EQUAL(v[2], 3);
864 BOOST_CHECK_EQUAL(v[3], 4);
865 BOOST_CHECK_EQUAL(v[4], 5);
866 BOOST_CHECK_EQUAL(v[5], 6);
867 BOOST_CHECK_EQUAL(v[6], 7);
868 BOOST_CHECK_EQUAL(v[7], 8);
869 std::sort(v_chk.colln().begin(), v_chk.colln().end());
870 BOOST_CHECK(v==v_chk);
873 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_unsorted, T, infinite_test_types) {
874 typedef typename T::vtr_colln_t vtr_colln_t;
875 typedef typename T::pool_type pool_type;
876 typedef typename pool_type::joinable joinable;
888 vtr_colln_t v_chk(v);
889 auto const &context=pool<<joinable()<<pool.sort(v);
890 pool.min_time(vtr_colln_t::memory_access_mode);
891 pool.min_processors(vtr_colln_t::memory_access_mode);
893 BOOST_CHECK_EQUAL(v.size(), 8U);
894 BOOST_CHECK_EQUAL(v[0], 1);
895 BOOST_CHECK_EQUAL(v[1], 2);
896 BOOST_CHECK_EQUAL(v[2], 3);
897 BOOST_CHECK_EQUAL(v[3], 4);
898 BOOST_CHECK_EQUAL(v[4], 5);
899 BOOST_CHECK_EQUAL(v[5], 6);
900 BOOST_CHECK_EQUAL(v[6], 7);
901 BOOST_CHECK_EQUAL(v[7], 8);
902 std::sort(v_chk.colln().begin(), v_chk.colln().end());
903 BOOST_CHECK(v==v_chk);
906 BOOST_AUTO_TEST_SUITE_END()
908 BOOST_AUTO_TEST_SUITE_END()
910 BOOST_AUTO_TEST_SUITE_END()
912 BOOST_AUTO_TEST_SUITE_END()
914 BOOST_AUTO_TEST_SUITE_END()