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>,
87 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::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
89 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::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
92 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::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
93 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::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>
99 struct square :
std::unary_function<T,
void> {
115 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
117 BOOST_AUTO_TEST_SUITE(joinable_dataflow)
119 BOOST_AUTO_TEST_SUITE(finite)
121 BOOST_AUTO_TEST_SUITE(empty_colln)
123 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, finite_test_types) {
124 typedef typename T::vtr_colln_t vtr_colln_t;
125 typedef typename T::pool_type pool_type;
126 typedef typename pool_type::joinable joinable;
128 pool_type pool(T::pool_size);
130 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
131 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::min());
132 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
133 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
136 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, finite_test_types) {
137 typedef typename T::vtr_colln_t vtr_colln_t;
138 typedef typename T::pool_type pool_type;
139 typedef typename pool_type::joinable joinable;
141 pool_type pool(T::pool_size);
143 auto const &context=pool<<joinable()<<pool.max_element(v);
144 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::min());
145 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
146 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
149 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, finite_test_types) {
150 typedef typename T::vtr_colln_t vtr_colln_t;
151 typedef typename T::pool_type pool_type;
152 typedef typename pool_type::joinable joinable;
154 pool_type pool(T::pool_size);
156 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
157 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::max());
158 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
159 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
162 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, finite_test_types) {
163 typedef typename T::vtr_colln_t vtr_colln_t;
164 typedef typename T::pool_type pool_type;
165 typedef typename pool_type::joinable joinable;
167 pool_type pool(T::pool_size);
169 auto const &context=pool<<joinable()<<pool.min_element(v);
170 BOOST_CHECK_EQUAL(*context, std::numeric_limits<
typename vtr_colln_t::value_type>::max());
171 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
172 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
175 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, finite_test_types) {
176 typedef typename T::vtr_colln_t vtr_colln_t;
177 typedef typename T::pool_type pool_type;
178 typedef typename pool_type::joinable joinable;
180 pool_type pool(T::pool_size);
181 vtr_colln_t v, v1, v_out;
182 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
183 pool.min_time(vtr_colln_t::memory_access_mode);
184 pool.min_processors(vtr_colln_t::memory_access_mode);
186 BOOST_CHECK_EQUAL(v.empty(),
true);
187 BOOST_CHECK_EQUAL(v1.empty(),
true);
188 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
189 BOOST_CHECK(v==v_out);
190 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
191 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
193 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>());
194 BOOST_CHECK(v_out==v_chk);
197 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, finite_test_types) {
198 typedef typename T::vtr_colln_t vtr_colln_t;
199 typedef typename T::pool_type pool_type;
200 typedef typename pool_type::joinable joinable;
202 pool_type pool(T::pool_size);
203 vtr_colln_t v, v1, v_out;
204 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
205 pool.min_time(vtr_colln_t::memory_access_mode);
206 pool.min_processors(vtr_colln_t::memory_access_mode);
208 BOOST_CHECK_EQUAL(v.empty(),
true);
209 BOOST_CHECK_EQUAL(v1.empty(),
true);
210 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
211 BOOST_CHECK(v==v_out);
212 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
213 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
215 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
216 BOOST_CHECK(v_out==v_chk);
219 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op, T, finite_test_types) {
220 typedef typename T::vtr_colln_t vtr_colln_t;
221 typedef typename T::pool_type pool_type;
222 typedef typename pool_type::joinable joinable;
224 pool_type pool(T::pool_size);
226 vtr_colln_t v_chk(v);
227 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
228 pool.min_time(vtr_colln_t::memory_access_mode);
229 pool.min_processors(vtr_colln_t::memory_access_mode);
231 BOOST_CHECK_EQUAL(v.empty(),
true);
232 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
233 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
234 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
235 BOOST_CHECK(v==v_chk);
238 BOOST_AUTO_TEST_CASE_TEMPLATE(sort, T, finite_test_types) {
239 typedef typename T::vtr_colln_t vtr_colln_t;
240 typedef typename T::pool_type pool_type;
241 typedef typename pool_type::joinable joinable;
243 pool_type pool(T::pool_size);
245 vtr_colln_t v_chk(v);
246 auto const &context=pool<<joinable()<<pool.sort(v);
247 pool.min_time(vtr_colln_t::memory_access_mode);
248 pool.min_processors(vtr_colln_t::memory_access_mode);
250 BOOST_CHECK_EQUAL(v.empty(),
true);
251 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
252 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
253 std::sort(v_chk.colln().begin(), v_chk.colln().end());
254 BOOST_CHECK(v==v_chk);
257 BOOST_AUTO_TEST_SUITE_END()
259 BOOST_AUTO_TEST_SUITE(nonempty_colln)
261 BOOST_AUTO_TEST_SUITE(one_element)
263 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, finite_test_types) {
264 typedef typename T::vtr_colln_t vtr_colln_t;
265 typedef typename T::pool_type pool_type;
266 typedef typename pool_type::joinable joinable;
268 pool_type pool(T::pool_size);
271 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
272 BOOST_CHECK_EQUAL(*context, 1);
275 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, finite_test_types) {
276 typedef typename T::vtr_colln_t vtr_colln_t;
277 typedef typename T::pool_type pool_type;
278 typedef typename pool_type::joinable joinable;
280 pool_type pool(T::pool_size);
283 auto const &context=pool<<joinable()<<pool.max_element(v);
284 BOOST_CHECK_EQUAL(*context, 1);
287 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, finite_test_types) {
288 typedef typename T::vtr_colln_t vtr_colln_t;
289 typedef typename T::pool_type pool_type;
290 typedef typename pool_type::joinable joinable;
292 pool_type pool(T::pool_size);
295 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
296 BOOST_CHECK_EQUAL(*context, 1);
299 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, finite_test_types) {
300 typedef typename T::vtr_colln_t vtr_colln_t;
301 typedef typename T::pool_type pool_type;
302 typedef typename pool_type::joinable joinable;
304 pool_type pool(T::pool_size);
307 auto const &context=pool<<joinable()<<pool.min_element(v);
308 BOOST_CHECK_EQUAL(*context, 1);
311 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, finite_test_types) {
312 typedef typename T::vtr_colln_t vtr_colln_t;
313 typedef typename T::pool_type pool_type;
314 typedef typename pool_type::joinable joinable;
316 pool_type pool(T::pool_size);
317 vtr_colln_t v, v1, v_out;
320 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
321 pool.min_time(vtr_colln_t::memory_access_mode);
322 pool.min_processors(vtr_colln_t::memory_access_mode);
324 BOOST_CHECK_EQUAL(v.size(), 1U);
325 BOOST_CHECK_EQUAL(v1.size(), 1U);
326 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
327 BOOST_CHECK_EQUAL(v_out[0], v[0]);
328 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
330 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>());
331 BOOST_CHECK(v_out==v_chk);
334 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, finite_test_types) {
335 typedef typename T::vtr_colln_t vtr_colln_t;
336 typedef typename T::pool_type pool_type;
337 typedef typename pool_type::joinable joinable;
339 pool_type pool(T::pool_size);
340 vtr_colln_t v, v1, v_out;
343 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
344 pool.min_time(vtr_colln_t::memory_access_mode);
345 pool.min_processors(vtr_colln_t::memory_access_mode);
347 BOOST_CHECK_EQUAL(v.size(), 1U);
348 BOOST_CHECK_EQUAL(v1.size(), 1U);
349 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
350 BOOST_CHECK_EQUAL(v_out[0], v[0]);
351 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
353 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
354 BOOST_CHECK(v_out==v_chk);
357 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op, T, finite_test_types) {
358 typedef typename T::vtr_colln_t vtr_colln_t;
359 typedef typename T::pool_type pool_type;
360 typedef typename pool_type::joinable joinable;
362 pool_type pool(T::pool_size);
365 vtr_colln_t v_chk(v);
366 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
367 pool.min_time(vtr_colln_t::memory_access_mode);
368 pool.min_processors(vtr_colln_t::memory_access_mode);
370 BOOST_CHECK_EQUAL(v.size(), 1U);
371 BOOST_CHECK_EQUAL(v[0], 1);
372 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
373 BOOST_CHECK(v==v_chk);
376 BOOST_AUTO_TEST_CASE_TEMPLATE(sort, T, finite_test_types) {
377 typedef typename T::vtr_colln_t vtr_colln_t;
378 typedef typename T::pool_type pool_type;
379 typedef typename pool_type::joinable joinable;
381 pool_type pool(T::pool_size);
384 vtr_colln_t v_chk(v);
385 auto const &context=pool<<joinable()<<pool.sort(v);
386 pool.min_time(vtr_colln_t::memory_access_mode);
387 pool.min_processors(vtr_colln_t::memory_access_mode);
389 BOOST_CHECK_EQUAL(v.size(), 1U);
390 BOOST_CHECK_EQUAL(v[0], 1);
391 std::sort(v_chk.colln().begin(), v_chk.colln().end());
392 BOOST_CHECK(v==v_chk);
395 BOOST_AUTO_TEST_SUITE_END()
397 BOOST_AUTO_TEST_SUITE(two_elements)
399 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, finite_test_types) {
400 typedef typename T::vtr_colln_t vtr_colln_t;
401 typedef typename T::pool_type pool_type;
402 typedef typename pool_type::joinable joinable;
404 pool_type pool(T::pool_size);
408 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
409 BOOST_CHECK_EQUAL(*context, 1);
412 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, finite_test_types) {
413 typedef typename T::vtr_colln_t vtr_colln_t;
414 typedef typename T::pool_type pool_type;
415 typedef typename pool_type::joinable joinable;
417 pool_type pool(T::pool_size);
421 auto const &context=pool<<joinable()<<pool.max_element(v);
422 BOOST_CHECK_EQUAL(*context, 2);
425 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, finite_test_types) {
426 typedef typename T::vtr_colln_t vtr_colln_t;
427 typedef typename T::pool_type pool_type;
428 typedef typename pool_type::joinable joinable;
430 pool_type pool(T::pool_size);
434 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
435 BOOST_CHECK_EQUAL(*context, 2);
438 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, finite_test_types) {
439 typedef typename T::vtr_colln_t vtr_colln_t;
440 typedef typename T::pool_type pool_type;
441 typedef typename pool_type::joinable joinable;
443 pool_type pool(T::pool_size);
447 auto const &context=pool<<joinable()<<pool.min_element(v);
448 BOOST_CHECK_EQUAL(*context, 1);
451 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, finite_test_types) {
452 typedef typename T::vtr_colln_t vtr_colln_t;
453 typedef typename T::pool_type pool_type;
454 typedef typename pool_type::joinable joinable;
456 pool_type pool(T::pool_size);
457 vtr_colln_t v, v1, v_out;
462 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
463 pool.min_time(vtr_colln_t::memory_access_mode);
464 pool.min_processors(vtr_colln_t::memory_access_mode);
466 BOOST_CHECK_EQUAL(v.size(), 2U);
467 BOOST_CHECK_EQUAL(v1.size(), 2U);
468 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
469 BOOST_CHECK_EQUAL(v_out[0], v[0]);
470 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
471 BOOST_CHECK_EQUAL(v_out[2], v[1]);
472 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
474 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>());
475 BOOST_CHECK(v_out==v_chk);
478 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, finite_test_types) {
479 typedef typename T::vtr_colln_t vtr_colln_t;
480 typedef typename T::pool_type pool_type;
481 typedef typename pool_type::joinable joinable;
483 pool_type pool(T::pool_size);
484 vtr_colln_t v, v1, v_out;
489 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
490 pool.min_time(vtr_colln_t::memory_access_mode);
491 pool.min_processors(vtr_colln_t::memory_access_mode);
493 BOOST_CHECK_EQUAL(v.size(), 2U);
494 BOOST_CHECK_EQUAL(v1.size(), 2U);
495 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
496 BOOST_CHECK_EQUAL(v_out[0], v[0]);
497 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
498 BOOST_CHECK_EQUAL(v_out[2], v[1]);
499 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
501 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
502 BOOST_CHECK(v_out==v_chk);
505 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_sorted, T, finite_test_types) {
506 typedef typename T::vtr_colln_t vtr_colln_t;
507 typedef typename T::pool_type pool_type;
508 typedef typename pool_type::joinable joinable;
510 pool_type pool(T::pool_size);
514 vtr_colln_t v_chk(v);
515 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
516 pool.min_time(vtr_colln_t::memory_access_mode);
517 pool.min_processors(vtr_colln_t::memory_access_mode);
519 BOOST_CHECK_EQUAL(v.size(), 2U);
520 BOOST_CHECK_EQUAL(v[0], 2);
521 BOOST_CHECK_EQUAL(v[1], 1);
522 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
523 BOOST_CHECK(v==v_chk);
526 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_unsorted, T, finite_test_types) {
527 typedef typename T::vtr_colln_t vtr_colln_t;
528 typedef typename T::pool_type pool_type;
529 typedef typename pool_type::joinable joinable;
531 pool_type pool(T::pool_size);
535 vtr_colln_t v_chk(v);
536 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
537 pool.min_time(vtr_colln_t::memory_access_mode);
538 pool.min_processors(vtr_colln_t::memory_access_mode);
540 BOOST_CHECK_EQUAL(v.size(), 2U);
541 BOOST_CHECK_EQUAL(v[0], 2);
542 BOOST_CHECK_EQUAL(v[1], 1);
543 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
544 BOOST_CHECK(v==v_chk);
547 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_sorted, T, finite_test_types) {
548 typedef typename T::vtr_colln_t vtr_colln_t;
549 typedef typename T::pool_type pool_type;
550 typedef typename pool_type::joinable joinable;
552 pool_type pool(T::pool_size);
556 vtr_colln_t v_chk(v);
557 auto const &context=pool<<joinable()<<pool.sort(v);
558 pool.min_time(vtr_colln_t::memory_access_mode);
559 pool.min_processors(vtr_colln_t::memory_access_mode);
561 BOOST_CHECK_EQUAL(v.size(), 2U);
562 BOOST_CHECK_EQUAL(v[0], 1);
563 BOOST_CHECK_EQUAL(v[1], 2);
564 std::sort(v_chk.colln().begin(), v_chk.colln().end());
565 BOOST_CHECK(v==v_chk);
568 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_unsorted, T, finite_test_types) {
569 typedef typename T::vtr_colln_t vtr_colln_t;
570 typedef typename T::pool_type pool_type;
571 typedef typename pool_type::joinable joinable;
573 pool_type pool(T::pool_size);
577 vtr_colln_t v_chk(v);
578 auto const &context=pool<<joinable()<<pool.sort(v);
579 pool.min_time(vtr_colln_t::memory_access_mode);
580 pool.min_processors(vtr_colln_t::memory_access_mode);
582 BOOST_CHECK_EQUAL(v.size(), 2U);
583 BOOST_CHECK_EQUAL(v[0], 1);
584 BOOST_CHECK_EQUAL(v[1], 2);
585 std::sort(v_chk.colln().begin(), v_chk.colln().end());
586 BOOST_CHECK(v==v_chk);
589 BOOST_AUTO_TEST_SUITE_END()
591 BOOST_AUTO_TEST_SUITE(n_elements)
593 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element_op, T, finite_test_types) {
594 typedef typename T::vtr_colln_t vtr_colln_t;
595 typedef typename T::pool_type pool_type;
596 typedef typename pool_type::joinable joinable;
598 pool_type pool(T::pool_size);
608 auto const &context=pool<<joinable()<<pool.max_element(v,
std::greater<
typename vtr_colln_t::value_type>());
609 BOOST_CHECK_EQUAL(*context, 1);
612 BOOST_AUTO_TEST_CASE_TEMPLATE(max_element, T, finite_test_types) {
613 typedef typename T::vtr_colln_t vtr_colln_t;
614 typedef typename T::pool_type pool_type;
615 typedef typename pool_type::joinable joinable;
617 pool_type pool(T::pool_size);
627 auto const &context=pool<<joinable()<<pool.max_element(v);
628 BOOST_CHECK_EQUAL(*context, 8);
631 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element_op, T, finite_test_types) {
632 typedef typename T::vtr_colln_t vtr_colln_t;
633 typedef typename T::pool_type pool_type;
634 typedef typename pool_type::joinable joinable;
636 pool_type pool(T::pool_size);
646 auto const &context=pool<<joinable()<<pool.min_element(v,
std::greater<
typename vtr_colln_t::value_type>());
647 BOOST_CHECK_EQUAL(*context, 8);
650 BOOST_AUTO_TEST_CASE_TEMPLATE(min_element, T, finite_test_types) {
651 typedef typename T::vtr_colln_t vtr_colln_t;
652 typedef typename T::pool_type pool_type;
653 typedef typename pool_type::joinable joinable;
655 pool_type pool(T::pool_size);
665 auto const &context=pool<<joinable()<<pool.min_element(v);
666 BOOST_CHECK_EQUAL(*context, 1);
669 BOOST_AUTO_TEST_CASE_TEMPLATE(merge_op, T, finite_test_types) {
670 typedef typename T::vtr_colln_t vtr_colln_t;
671 typedef typename T::pool_type pool_type;
672 typedef typename pool_type::joinable joinable;
674 pool_type pool(T::pool_size);
675 vtr_colln_t v, v1, v_out;
692 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out,
std::less<
typename vtr_colln_t::value_type>());
693 pool.min_time(vtr_colln_t::memory_access_mode);
694 pool.min_processors(vtr_colln_t::memory_access_mode);
696 BOOST_CHECK_EQUAL(v.size(), 8U);
697 BOOST_CHECK_EQUAL(v1.size(), 8U);
698 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
699 BOOST_CHECK_EQUAL(v_out[0], v[0]);
700 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
701 BOOST_CHECK_EQUAL(v_out[2], v[1]);
702 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
703 BOOST_CHECK_EQUAL(v_out[4], v[2]);
704 BOOST_CHECK_EQUAL(v_out[5], v1[2]);
705 BOOST_CHECK_EQUAL(v_out[6], v[3]);
706 BOOST_CHECK_EQUAL(v_out[7], v1[3]);
707 BOOST_CHECK_EQUAL(v_out[8], v[4]);
708 BOOST_CHECK_EQUAL(v_out[9], v1[4]);
709 BOOST_CHECK_EQUAL(v_out[10], v[5]);
710 BOOST_CHECK_EQUAL(v_out[11], v1[5]);
711 BOOST_CHECK_EQUAL(v_out[12], v[6]);
712 BOOST_CHECK_EQUAL(v_out[13], v1[6]);
713 BOOST_CHECK_EQUAL(v_out[14], v[7]);
714 BOOST_CHECK_EQUAL(v_out[15], v1[7]);
716 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>());
717 BOOST_CHECK(v_out==v_chk);
720 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, finite_test_types) {
721 typedef typename T::vtr_colln_t vtr_colln_t;
722 typedef typename T::pool_type pool_type;
723 typedef typename pool_type::joinable joinable;
725 pool_type pool(T::pool_size);
726 vtr_colln_t v, v1, v_out;
743 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
744 pool.min_time(vtr_colln_t::memory_access_mode);
745 pool.min_processors(vtr_colln_t::memory_access_mode);
747 BOOST_CHECK_EQUAL(v.size(), 8U);
748 BOOST_CHECK_EQUAL(v1.size(), 8U);
749 BOOST_CHECK_EQUAL(v_out.size(), v.size()+v1.size());
750 BOOST_CHECK_EQUAL(v_out[0], v[0]);
751 BOOST_CHECK_EQUAL(v_out[1], v1[0]);
752 BOOST_CHECK_EQUAL(v_out[2], v[1]);
753 BOOST_CHECK_EQUAL(v_out[3], v1[1]);
754 BOOST_CHECK_EQUAL(v_out[4], v[2]);
755 BOOST_CHECK_EQUAL(v_out[5], v1[2]);
756 BOOST_CHECK_EQUAL(v_out[6], v[3]);
757 BOOST_CHECK_EQUAL(v_out[7], v1[3]);
758 BOOST_CHECK_EQUAL(v_out[8], v[4]);
759 BOOST_CHECK_EQUAL(v_out[9], v1[4]);
760 BOOST_CHECK_EQUAL(v_out[10], v[5]);
761 BOOST_CHECK_EQUAL(v_out[11], v1[5]);
762 BOOST_CHECK_EQUAL(v_out[12], v[6]);
763 BOOST_CHECK_EQUAL(v_out[13], v1[6]);
764 BOOST_CHECK_EQUAL(v_out[14], v[7]);
765 BOOST_CHECK_EQUAL(v_out[15], v1[7]);
767 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
768 BOOST_CHECK(v_out==v_chk);
771 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_sorted, T, finite_test_types) {
772 typedef typename T::vtr_colln_t vtr_colln_t;
773 typedef typename T::pool_type pool_type;
774 typedef typename pool_type::joinable joinable;
776 pool_type pool(T::pool_size);
786 vtr_colln_t v_chk(v);
787 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
788 pool.min_time(vtr_colln_t::memory_access_mode);
789 pool.min_processors(vtr_colln_t::memory_access_mode);
791 BOOST_CHECK_EQUAL(v.size(), 8U);
792 BOOST_CHECK_EQUAL(v[0], 8);
793 BOOST_CHECK_EQUAL(v[1], 7);
794 BOOST_CHECK_EQUAL(v[2], 6);
795 BOOST_CHECK_EQUAL(v[3], 5);
796 BOOST_CHECK_EQUAL(v[4], 4);
797 BOOST_CHECK_EQUAL(v[5], 3);
798 BOOST_CHECK_EQUAL(v[6], 2);
799 BOOST_CHECK_EQUAL(v[7], 1);
800 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
801 BOOST_CHECK(v==v_chk);
804 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_op_unsorted, T, finite_test_types) {
805 typedef typename T::vtr_colln_t vtr_colln_t;
806 typedef typename T::pool_type pool_type;
807 typedef typename pool_type::joinable joinable;
809 pool_type pool(T::pool_size);
819 vtr_colln_t v_chk(v);
820 auto const &context=pool<<joinable()<<pool.sort(v,
std::greater<
typename vtr_colln_t::value_type>());
821 pool.min_time(vtr_colln_t::memory_access_mode);
822 pool.min_processors(vtr_colln_t::memory_access_mode);
824 BOOST_CHECK_EQUAL(v.size(), 8U);
825 BOOST_CHECK_EQUAL(v[0], 8);
826 BOOST_CHECK_EQUAL(v[1], 7);
827 BOOST_CHECK_EQUAL(v[2], 6);
828 BOOST_CHECK_EQUAL(v[3], 5);
829 BOOST_CHECK_EQUAL(v[4], 4);
830 BOOST_CHECK_EQUAL(v[5], 3);
831 BOOST_CHECK_EQUAL(v[6], 2);
832 BOOST_CHECK_EQUAL(v[7], 1);
833 std::sort(v_chk.colln().begin(), v_chk.colln().end(),
std::greater<
typename vtr_colln_t::value_type>());
834 BOOST_CHECK(v==v_chk);
837 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_sorted, T, finite_test_types) {
838 typedef typename T::vtr_colln_t vtr_colln_t;
839 typedef typename T::pool_type pool_type;
840 typedef typename pool_type::joinable joinable;
842 pool_type pool(T::pool_size);
852 vtr_colln_t v_chk(v);
853 auto const &context=pool<<joinable()<<pool.sort(v);
854 pool.min_time(vtr_colln_t::memory_access_mode);
855 pool.min_processors(vtr_colln_t::memory_access_mode);
857 BOOST_CHECK_EQUAL(v.size(), 8U);
858 BOOST_CHECK_EQUAL(v[0], 1);
859 BOOST_CHECK_EQUAL(v[1], 2);
860 BOOST_CHECK_EQUAL(v[2], 3);
861 BOOST_CHECK_EQUAL(v[3], 4);
862 BOOST_CHECK_EQUAL(v[4], 5);
863 BOOST_CHECK_EQUAL(v[5], 6);
864 BOOST_CHECK_EQUAL(v[6], 7);
865 BOOST_CHECK_EQUAL(v[7], 8);
866 std::sort(v_chk.colln().begin(), v_chk.colln().end());
867 BOOST_CHECK(v==v_chk);
870 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_unsorted, T, finite_test_types) {
871 typedef typename T::vtr_colln_t vtr_colln_t;
872 typedef typename T::pool_type pool_type;
873 typedef typename pool_type::joinable joinable;
875 pool_type pool(T::pool_size);
885 vtr_colln_t v_chk(v);
886 auto const &context=pool<<joinable()<<pool.sort(v);
887 pool.min_time(vtr_colln_t::memory_access_mode);
888 pool.min_processors(vtr_colln_t::memory_access_mode);
890 BOOST_CHECK_EQUAL(v.size(), 8U);
891 BOOST_CHECK_EQUAL(v[0], 1);
892 BOOST_CHECK_EQUAL(v[1], 2);
893 BOOST_CHECK_EQUAL(v[2], 3);
894 BOOST_CHECK_EQUAL(v[3], 4);
895 BOOST_CHECK_EQUAL(v[4], 5);
896 BOOST_CHECK_EQUAL(v[5], 6);
897 BOOST_CHECK_EQUAL(v[6], 7);
898 BOOST_CHECK_EQUAL(v[7], 8);
899 std::sort(v_chk.colln().begin(), v_chk.colln().end());
900 BOOST_CHECK(v==v_chk);
903 BOOST_AUTO_TEST_SUITE_END()
905 BOOST_AUTO_TEST_SUITE_END()
907 BOOST_AUTO_TEST_SUITE_END()
909 BOOST_AUTO_TEST_SUITE_END()
911 BOOST_AUTO_TEST_SUITE_END()