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;
56 const typename erew_normal_fifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_type::
pool_type::
size_type erew_normal_fifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_size;
81 const typename erew_priority_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_type::
pool_type::
size_type erew_priority_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_size;
83 typedef boost::mpl::list<
84 erew_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>,
85 erew_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>,
86 erew_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>,
87 erew_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>,
91 erew_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>,
92 erew_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>,
93 erew_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>,
94 erew_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>
95 > infinite_test_types;
116 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
118 BOOST_AUTO_TEST_SUITE(joinable_dataflow)
120 BOOST_AUTO_TEST_SUITE(infinite)
122 BOOST_AUTO_TEST_SUITE(empty_colln)
124 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, infinite_test_types) {
125 typedef typename T::vtr_colln_t vtr_colln_t;
126 typedef typename T::pool_type pool_type;
127 typedef typename pool_type::joinable joinable;
131 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
132 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::min());
133 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
134 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
137 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, infinite_test_types) {
138 typedef typename T::vtr_colln_t vtr_colln_t;
139 typedef typename T::pool_type pool_type;
140 typedef typename pool_type::joinable joinable;
144 auto const &context=pool<<joinable()<<pool.max_element(v);
145 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::min());
146 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
147 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
150 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, infinite_test_types) {
151 typedef typename T::vtr_colln_t vtr_colln_t;
152 typedef typename T::pool_type pool_type;
153 typedef typename pool_type::joinable joinable;
157 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
158 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::max());
159 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
160 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
163 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, infinite_test_types) {
164 typedef typename T::vtr_colln_t vtr_colln_t;
165 typedef typename T::pool_type pool_type;
166 typedef typename pool_type::joinable joinable;
170 auto const &context=pool<<joinable()<<pool.min_element(v);
171 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::max());
172 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
173 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
176 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, infinite_test_types) {
177 typedef typename T::vtr_colln_t vtr_colln_t;
178 typedef typename T::pool_type pool_type;
179 typedef typename pool_type::joinable joinable;
182 vtr_colln_t v, v1, v_out;
183 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
184 pool.min_time(vtr_colln_t::memory_access_mode);
185 pool.min_processors(vtr_colln_t::memory_access_mode);
187 BOOST_CHECK_EQUAL(v.empty(),
true);
188 BOOST_CHECK_EQUAL(v1.empty(),
true);
189 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
190 BOOST_CHECK(v==v_out);
191 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
192 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
194 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>());
195 BOOST_CHECK(v_out==v_chk);
198 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, infinite_test_types) {
199 typedef typename T::vtr_colln_t vtr_colln_t;
200 typedef typename T::pool_type pool_type;
201 typedef typename pool_type::joinable joinable;
204 vtr_colln_t v, v1, v_out;
205 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
206 pool.min_time(vtr_colln_t::memory_access_mode);
207 pool.min_processors(vtr_colln_t::memory_access_mode);
209 BOOST_CHECK_EQUAL(v.empty(),
true);
210 BOOST_CHECK_EQUAL(v1.empty(),
true);
211 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
212 BOOST_CHECK(v==v_out);
213 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
214 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
216 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
217 BOOST_CHECK(v_out==v_chk);
220 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op, T, infinite_test_types) {
221 typedef typename T::vtr_colln_t vtr_colln_t;
222 typedef typename T::pool_type pool_type;
223 typedef typename pool_type::joinable joinable;
227 vtr_colln_t v_chk(v);
228 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
229 pool.min_time(vtr_colln_t::memory_access_mode);
230 pool.min_processors(vtr_colln_t::memory_access_mode);
232 BOOST_CHECK_EQUAL(v.empty(),
true);
233 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
234 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
235 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
236 BOOST_CHECK(v==v_chk);
239 BOOST_AUTO_TEST_CASE_TEMPLATE(sort, T, infinite_test_types) {
240 typedef typename T::vtr_colln_t vtr_colln_t;
241 typedef typename T::pool_type pool_type;
242 typedef typename pool_type::joinable joinable;
246 vtr_colln_t v_chk(v);
247 auto const &context=pool<<joinable()<<pool.sort(v);
248 pool.min_time(vtr_colln_t::memory_access_mode);
249 pool.min_processors(vtr_colln_t::memory_access_mode);
251 BOOST_CHECK_EQUAL(v.empty(),
true);
252 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
253 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
254 std::sort(v_chk.colln().begin(), v_chk.colln().end());
255 BOOST_CHECK(v==v_chk);
258 BOOST_AUTO_TEST_SUITE_END()
260 BOOST_AUTO_TEST_SUITE(nonempty_colln)
262 BOOST_AUTO_TEST_SUITE(one_element)
264 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, infinite_test_types) {
265 typedef typename T::vtr_colln_t vtr_colln_t;
266 typedef typename T::pool_type pool_type;
267 typedef typename pool_type::joinable joinable;
272 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
273 BOOST_CHECK_EQUAL(*context, 1);
276 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, infinite_test_types) {
277 typedef typename T::vtr_colln_t vtr_colln_t;
278 typedef typename T::pool_type pool_type;
279 typedef typename pool_type::joinable joinable;
284 auto const &context=pool<<joinable()<<pool.max_element(v);
285 BOOST_CHECK_EQUAL(*context, 1);
288 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, infinite_test_types) {
289 typedef typename T::vtr_colln_t vtr_colln_t;
290 typedef typename T::pool_type pool_type;
291 typedef typename pool_type::joinable joinable;
296 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
297 BOOST_CHECK_EQUAL(*context, 1);
300 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, infinite_test_types) {
301 typedef typename T::vtr_colln_t vtr_colln_t;
302 typedef typename T::pool_type pool_type;
303 typedef typename pool_type::joinable joinable;
308 auto const &context=pool<<joinable()<<pool.min_element(v);
309 BOOST_CHECK_EQUAL(*context, 1);
312 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, infinite_test_types) {
313 typedef typename T::vtr_colln_t vtr_colln_t;
314 typedef typename T::pool_type pool_type;
315 typedef typename pool_type::joinable joinable;
318 vtr_colln_t v, v1, v_out;
321 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
322 pool.min_time(vtr_colln_t::memory_access_mode);
323 pool.min_processors(vtr_colln_t::memory_access_mode);
325 BOOST_CHECK_EQUAL(v.size(), 1U);
326 BOOST_CHECK_EQUAL(v1.size(), 1U);
327 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
328 BOOST_CHECK_EQUAL(v_out[0], v[0]);
329 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
331 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>());
332 BOOST_CHECK(v_out==v_chk);
335 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, infinite_test_types) {
336 typedef typename T::vtr_colln_t vtr_colln_t;
337 typedef typename T::pool_type pool_type;
338 typedef typename pool_type::joinable joinable;
341 vtr_colln_t v, v1, v_out;
344 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
345 pool.min_time(vtr_colln_t::memory_access_mode);
346 pool.min_processors(vtr_colln_t::memory_access_mode);
348 BOOST_CHECK_EQUAL(v.size(), 1U);
349 BOOST_CHECK_EQUAL(v1.size(), 1U);
350 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
351 BOOST_CHECK_EQUAL(v_out[0], v[0]);
352 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
354 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
355 BOOST_CHECK(v_out==v_chk);
358 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op, T, infinite_test_types) {
359 typedef typename T::vtr_colln_t vtr_colln_t;
360 typedef typename T::pool_type pool_type;
361 typedef typename pool_type::joinable joinable;
366 vtr_colln_t v_chk(v);
367 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
368 pool.min_time(vtr_colln_t::memory_access_mode);
369 pool.min_processors(vtr_colln_t::memory_access_mode);
371 BOOST_CHECK_EQUAL(v.size(), 1U);
372 BOOST_CHECK_EQUAL(v[0], 1);
373 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
374 BOOST_CHECK(v==v_chk);
377 BOOST_AUTO_TEST_CASE_TEMPLATE(sort, T, infinite_test_types) {
378 typedef typename T::vtr_colln_t vtr_colln_t;
379 typedef typename T::pool_type pool_type;
380 typedef typename pool_type::joinable joinable;
385 vtr_colln_t v_chk(v);
386 auto const &context=pool<<joinable()<<pool.sort(v);
387 pool.min_time(vtr_colln_t::memory_access_mode);
388 pool.min_processors(vtr_colln_t::memory_access_mode);
390 BOOST_CHECK_EQUAL(v.size(), 1U);
391 BOOST_CHECK_EQUAL(v[0], 1);
392 std::sort(v_chk.colln().begin(), v_chk.colln().end());
393 BOOST_CHECK(v==v_chk);
396 BOOST_AUTO_TEST_SUITE_END()
398 BOOST_AUTO_TEST_SUITE(two_elements)
400 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, infinite_test_types) {
401 typedef typename T::vtr_colln_t vtr_colln_t;
402 typedef typename T::pool_type pool_type;
403 typedef typename pool_type::joinable joinable;
409 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
410 BOOST_CHECK_EQUAL(*context, 1);
413 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, infinite_test_types) {
414 typedef typename T::vtr_colln_t vtr_colln_t;
415 typedef typename T::pool_type pool_type;
416 typedef typename pool_type::joinable joinable;
422 auto const &context=pool<<joinable()<<pool.max_element(v);
423 BOOST_CHECK_EQUAL(*context, 2);
426 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, infinite_test_types) {
427 typedef typename T::vtr_colln_t vtr_colln_t;
428 typedef typename T::pool_type pool_type;
429 typedef typename pool_type::joinable joinable;
435 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
436 BOOST_CHECK_EQUAL(*context, 2);
439 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, infinite_test_types) {
440 typedef typename T::vtr_colln_t vtr_colln_t;
441 typedef typename T::pool_type pool_type;
442 typedef typename pool_type::joinable joinable;
448 auto const &context=pool<<joinable()<<pool.min_element(v);
449 BOOST_CHECK_EQUAL(*context, 1);
452 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, infinite_test_types) {
453 typedef typename T::vtr_colln_t vtr_colln_t;
454 typedef typename T::pool_type pool_type;
455 typedef typename pool_type::joinable joinable;
458 vtr_colln_t v, v1, v_out;
463 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
464 pool.min_time(vtr_colln_t::memory_access_mode);
465 pool.min_processors(vtr_colln_t::memory_access_mode);
467 BOOST_CHECK_EQUAL(v.size(), 2U);
468 BOOST_CHECK_EQUAL(v1.size(), 2U);
469 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
470 BOOST_CHECK_EQUAL(v_out[0], v[0]);
471 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
472 BOOST_CHECK_EQUAL(v_out[2], v[1]);
473 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
475 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>());
476 BOOST_CHECK(v_out==v_chk);
479 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, infinite_test_types) {
480 typedef typename T::vtr_colln_t vtr_colln_t;
481 typedef typename T::pool_type pool_type;
482 typedef typename pool_type::joinable joinable;
485 vtr_colln_t v, v1, v_out;
490 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
491 pool.min_time(vtr_colln_t::memory_access_mode);
492 pool.min_processors(vtr_colln_t::memory_access_mode);
494 BOOST_CHECK_EQUAL(v.size(), 2U);
495 BOOST_CHECK_EQUAL(v1.size(), 2U);
496 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
497 BOOST_CHECK_EQUAL(v_out[0], v[0]);
498 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
499 BOOST_CHECK_EQUAL(v_out[2], v[1]);
500 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
502 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
503 BOOST_CHECK(v_out==v_chk);
506 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_sorted, T, infinite_test_types) {
507 typedef typename T::vtr_colln_t vtr_colln_t;
508 typedef typename T::pool_type pool_type;
509 typedef typename pool_type::joinable joinable;
515 vtr_colln_t v_chk(v);
516 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
517 pool.min_time(vtr_colln_t::memory_access_mode);
518 pool.min_processors(vtr_colln_t::memory_access_mode);
520 BOOST_CHECK_EQUAL(v.size(), 2U);
521 BOOST_CHECK_EQUAL(v[0], 2);
522 BOOST_CHECK_EQUAL(v[1], 1);
523 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
524 BOOST_CHECK(v==v_chk);
527 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_unsorted, T, infinite_test_types) {
528 typedef typename T::vtr_colln_t vtr_colln_t;
529 typedef typename T::pool_type pool_type;
530 typedef typename pool_type::joinable joinable;
536 vtr_colln_t v_chk(v);
537 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
538 pool.min_time(vtr_colln_t::memory_access_mode);
539 pool.min_processors(vtr_colln_t::memory_access_mode);
541 BOOST_CHECK_EQUAL(v.size(), 2U);
542 BOOST_CHECK_EQUAL(v[0], 2);
543 BOOST_CHECK_EQUAL(v[1], 1);
544 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
545 BOOST_CHECK(v==v_chk);
548 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_sorted, T, infinite_test_types) {
549 typedef typename T::vtr_colln_t vtr_colln_t;
550 typedef typename T::pool_type pool_type;
551 typedef typename pool_type::joinable joinable;
557 vtr_colln_t v_chk(v);
558 auto const &context=pool<<joinable()<<pool.sort(v);
559 pool.min_time(vtr_colln_t::memory_access_mode);
560 pool.min_processors(vtr_colln_t::memory_access_mode);
562 BOOST_CHECK_EQUAL(v.size(), 2U);
563 BOOST_CHECK_EQUAL(v[0], 1);
564 BOOST_CHECK_EQUAL(v[1], 2);
565 std::sort(v_chk.colln().begin(), v_chk.colln().end());
566 BOOST_CHECK(v==v_chk);
569 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_unsorted, T, infinite_test_types) {
570 typedef typename T::vtr_colln_t vtr_colln_t;
571 typedef typename T::pool_type pool_type;
572 typedef typename pool_type::joinable joinable;
578 vtr_colln_t v_chk(v);
579 auto const &context=pool<<joinable()<<pool.sort(v);
580 pool.min_time(vtr_colln_t::memory_access_mode);
581 pool.min_processors(vtr_colln_t::memory_access_mode);
583 BOOST_CHECK_EQUAL(v.size(), 2U);
584 BOOST_CHECK_EQUAL(v[0], 1);
585 BOOST_CHECK_EQUAL(v[1], 2);
586 std::sort(v_chk.colln().begin(), v_chk.colln().end());
587 BOOST_CHECK(v==v_chk);
590 BOOST_AUTO_TEST_SUITE_END()
592 BOOST_AUTO_TEST_SUITE(n_elements)
594 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, infinite_test_types) {
595 typedef typename T::vtr_colln_t vtr_colln_t;
596 typedef typename T::pool_type pool_type;
597 typedef typename pool_type::joinable joinable;
609 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
610 BOOST_CHECK_EQUAL(*context, 1);
613 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, infinite_test_types) {
614 typedef typename T::vtr_colln_t vtr_colln_t;
615 typedef typename T::pool_type pool_type;
616 typedef typename pool_type::joinable joinable;
628 auto const &context=pool<<joinable()<<pool.max_element(v);
629 BOOST_CHECK_EQUAL(*context, 8);
632 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, infinite_test_types) {
633 typedef typename T::vtr_colln_t vtr_colln_t;
634 typedef typename T::pool_type pool_type;
635 typedef typename pool_type::joinable joinable;
647 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
648 BOOST_CHECK_EQUAL(*context, 8);
651 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, infinite_test_types) {
652 typedef typename T::vtr_colln_t vtr_colln_t;
653 typedef typename T::pool_type pool_type;
654 typedef typename pool_type::joinable joinable;
666 auto const &context=pool<<joinable()<<pool.min_element(v);
667 BOOST_CHECK_EQUAL(*context, 1);
670 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, infinite_test_types) {
671 typedef typename T::vtr_colln_t vtr_colln_t;
672 typedef typename T::pool_type pool_type;
673 typedef typename pool_type::joinable joinable;
676 vtr_colln_t v, v1, v_out;
693 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
694 pool.min_time(vtr_colln_t::memory_access_mode);
695 pool.min_processors(vtr_colln_t::memory_access_mode);
697 BOOST_CHECK_EQUAL(v.size(), 8U);
698 BOOST_CHECK_EQUAL(v1.size(), 8U);
699 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
700 BOOST_CHECK_EQUAL(v_out[0], v[0]);
701 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
702 BOOST_CHECK_EQUAL(v_out[2], v[1]);
703 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
704 BOOST_CHECK_EQUAL(v_out[4], v[2]);
705 BOOST_CHECK_EQUAL(v_out[5], v1[2]);
706 BOOST_CHECK_EQUAL(v_out[6], v[3]);
707 BOOST_CHECK_EQUAL(v_out[7], v1[3]);
708 BOOST_CHECK_EQUAL(v_out[8], v[4]);
709 BOOST_CHECK_EQUAL(v_out[9], v1[4]);
710 BOOST_CHECK_EQUAL(v_out[10], v[5]);
711 BOOST_CHECK_EQUAL(v_out[11], v1[5]);
712 BOOST_CHECK_EQUAL(v_out[12], v[6]);
713 BOOST_CHECK_EQUAL(v_out[13], v1[6]);
714 BOOST_CHECK_EQUAL(v_out[14], v[7]);
715 BOOST_CHECK_EQUAL(v_out[15], v1[7]);
717 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>());
718 BOOST_CHECK(v_out==v_chk);
721 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, infinite_test_types) {
722 typedef typename T::vtr_colln_t vtr_colln_t;
723 typedef typename T::pool_type pool_type;
724 typedef typename pool_type::joinable joinable;
727 vtr_colln_t v, v1, v_out;
744 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
745 pool.min_time(vtr_colln_t::memory_access_mode);
746 pool.min_processors(vtr_colln_t::memory_access_mode);
748 BOOST_CHECK_EQUAL(v.size(), 8U);
749 BOOST_CHECK_EQUAL(v1.size(), 8U);
750 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
751 BOOST_CHECK_EQUAL(v_out[0], v[0]);
752 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
753 BOOST_CHECK_EQUAL(v_out[2], v[1]);
754 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
755 BOOST_CHECK_EQUAL(v_out[4], v[2]);
756 BOOST_CHECK_EQUAL(v_out[5], v1[2]);
757 BOOST_CHECK_EQUAL(v_out[6], v[3]);
758 BOOST_CHECK_EQUAL(v_out[7], v1[3]);
759 BOOST_CHECK_EQUAL(v_out[8], v[4]);
760 BOOST_CHECK_EQUAL(v_out[9], v1[4]);
761 BOOST_CHECK_EQUAL(v_out[10], v[5]);
762 BOOST_CHECK_EQUAL(v_out[11], v1[5]);
763 BOOST_CHECK_EQUAL(v_out[12], v[6]);
764 BOOST_CHECK_EQUAL(v_out[13], v1[6]);
765 BOOST_CHECK_EQUAL(v_out[14], v[7]);
766 BOOST_CHECK_EQUAL(v_out[15], v1[7]);
768 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
769 BOOST_CHECK(v_out==v_chk);
772 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_sorted, T, infinite_test_types) {
773 typedef typename T::vtr_colln_t vtr_colln_t;
774 typedef typename T::pool_type pool_type;
775 typedef typename pool_type::joinable joinable;
787 vtr_colln_t v_chk(v);
788 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
789 pool.min_time(vtr_colln_t::memory_access_mode);
790 pool.min_processors(vtr_colln_t::memory_access_mode);
792 BOOST_CHECK_EQUAL(v.size(), 8U);
793 BOOST_CHECK_EQUAL(v[0], 8);
794 BOOST_CHECK_EQUAL(v[1], 7);
795 BOOST_CHECK_EQUAL(v[2], 6);
796 BOOST_CHECK_EQUAL(v[3], 5);
797 BOOST_CHECK_EQUAL(v[4], 4);
798 BOOST_CHECK_EQUAL(v[5], 3);
799 BOOST_CHECK_EQUAL(v[6], 2);
800 BOOST_CHECK_EQUAL(v[7], 1);
801 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
802 BOOST_CHECK(v==v_chk);
805 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_unsorted, T, infinite_test_types) {
806 typedef typename T::vtr_colln_t vtr_colln_t;
807 typedef typename T::pool_type pool_type;
808 typedef typename pool_type::joinable joinable;
820 vtr_colln_t v_chk(v);
821 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
822 pool.min_time(vtr_colln_t::memory_access_mode);
823 pool.min_processors(vtr_colln_t::memory_access_mode);
825 BOOST_CHECK_EQUAL(v.size(), 8U);
826 BOOST_CHECK_EQUAL(v[0], 8);
827 BOOST_CHECK_EQUAL(v[1], 7);
828 BOOST_CHECK_EQUAL(v[2], 6);
829 BOOST_CHECK_EQUAL(v[3], 5);
830 BOOST_CHECK_EQUAL(v[4], 4);
831 BOOST_CHECK_EQUAL(v[5], 3);
832 BOOST_CHECK_EQUAL(v[6], 2);
833 BOOST_CHECK_EQUAL(v[7], 1);
834 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
835 BOOST_CHECK(v==v_chk);
838 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_sorted, T, infinite_test_types) {
839 typedef typename T::vtr_colln_t vtr_colln_t;
840 typedef typename T::pool_type pool_type;
841 typedef typename pool_type::joinable joinable;
853 vtr_colln_t v_chk(v);
854 auto const &context=pool<<joinable()<<pool.sort(v);
855 pool.min_time(vtr_colln_t::memory_access_mode);
856 pool.min_processors(vtr_colln_t::memory_access_mode);
858 BOOST_CHECK_EQUAL(v.size(), 8U);
859 BOOST_CHECK_EQUAL(v[0], 1);
860 BOOST_CHECK_EQUAL(v[1], 2);
861 BOOST_CHECK_EQUAL(v[2], 3);
862 BOOST_CHECK_EQUAL(v[3], 4);
863 BOOST_CHECK_EQUAL(v[4], 5);
864 BOOST_CHECK_EQUAL(v[5], 6);
865 BOOST_CHECK_EQUAL(v[6], 7);
866 BOOST_CHECK_EQUAL(v[7], 8);
867 std::sort(v_chk.colln().begin(), v_chk.colln().end());
868 BOOST_CHECK(v==v_chk);
871 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_unsorted, T, infinite_test_types) {
872 typedef typename T::vtr_colln_t vtr_colln_t;
873 typedef typename T::pool_type pool_type;
874 typedef typename pool_type::joinable joinable;
886 vtr_colln_t v_chk(v);
887 auto const &context=pool<<joinable()<<pool.sort(v);
888 pool.min_time(vtr_colln_t::memory_access_mode);
889 pool.min_processors(vtr_colln_t::memory_access_mode);
891 BOOST_CHECK_EQUAL(v.size(), 8U);
892 BOOST_CHECK_EQUAL(v[0], 1);
893 BOOST_CHECK_EQUAL(v[1], 2);
894 BOOST_CHECK_EQUAL(v[2], 3);
895 BOOST_CHECK_EQUAL(v[3], 4);
896 BOOST_CHECK_EQUAL(v[4], 5);
897 BOOST_CHECK_EQUAL(v[5], 6);
898 BOOST_CHECK_EQUAL(v[6], 7);
899 BOOST_CHECK_EQUAL(v[7], 8);
900 std::sort(v_chk.colln().begin(), v_chk.colln().end());
901 BOOST_CHECK(v==v_chk);
904 BOOST_AUTO_TEST_SUITE_END()
906 BOOST_AUTO_TEST_SUITE_END()
908 BOOST_AUTO_TEST_SUITE_END()
910 BOOST_AUTO_TEST_SUITE_END()
912 BOOST_AUTO_TEST_SUITE_END()