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_normal_lifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_type::
pool_type::
size_type erew_normal_lifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_size;
106 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;
132 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;
158 const typename crew_normal_lifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_type::
pool_type::
size_type crew_normal_lifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_size;
184 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;
186 typedef boost::mpl::list<
187 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>,
188 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>,
189 erew_normal_lifo_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>,
190 crew_normal_lifo_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>,
191 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>,
192 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>,
194 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>,
196 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>,
198 erew_normal_lifo_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>,
200 crew_normal_lifo_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>,
202 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>,
204 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>,
207 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>,
208 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>,
209 erew_normal_lifo_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>,
210 crew_normal_lifo_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>,
211 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>,
212 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>
215 typedef boost::mpl::list<
216 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>,
217 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>,
218 erew_normal_lifo_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>,
219 crew_normal_lifo_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>,
220 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>,
221 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>,
222 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>,
223 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>,
224 erew_normal_lifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
225 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
226 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>,
227 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>,
235 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>,
236 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>,
237 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>,
238 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>,
239 erew_normal_lifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
240 erew_normal_lifo_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>,
241 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
242 crew_normal_lifo_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>,
243 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>,
244 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>,
245 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>,
246 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>
247 > infinite_test_types;
252 struct square :
std::unary_function<T,
void> {
268 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
270 BOOST_AUTO_TEST_SUITE(joinable_dataflow)
272 BOOST_AUTO_TEST_SUITE(finite)
274 BOOST_AUTO_TEST_SUITE(empty_colln)
276 BOOST_AUTO_TEST_CASE_TEMPLATE(transform, T, finite_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;
281 pool_type pool(T::pool_size);
282 vtr_colln_t v, v_out;
283 auto const &context=pool<<joinable()<<pool.transform(v, v_out,
std::negate<
typename vtr_colln_t::value_type>());
284 pool.min_time(vtr_colln_t::memory_access_mode);
285 pool.min_processors(vtr_colln_t::memory_access_mode);
287 BOOST_CHECK_EQUAL(v.empty(),
true);
288 BOOST_CHECK(v==v_out);
289 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
290 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
293 BOOST_AUTO_TEST_CASE_TEMPLATE(transform_2_collns, T, finite_test_types) {
294 typedef typename T::vtr_colln_t vtr_colln_t;
295 typedef typename T::pool_type pool_type;
296 typedef typename pool_type::joinable joinable;
298 pool_type pool(T::pool_size);
299 vtr_colln_t v, v1, v_out;
300 auto const &context=pool<<joinable()<<pool.transform(v, v1, v_out,
std::plus<
typename vtr_colln_t::value_type>());
301 pool.min_time(vtr_colln_t::memory_access_mode);
302 pool.min_processors(vtr_colln_t::memory_access_mode);
304 BOOST_CHECK_EQUAL(v.empty(),
true);
305 BOOST_CHECK_EQUAL(v1.empty(),
true);
306 BOOST_CHECK(v==v_out);
307 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
308 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
311 BOOST_AUTO_TEST_CASE_TEMPLATE(copy, 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, v_out;
318 auto const &context=pool<<joinable()<<pool.copy(v, v_out);
319 pool.min_time(vtr_colln_t::memory_access_mode);
320 pool.min_processors(vtr_colln_t::memory_access_mode);
322 BOOST_CHECK_EQUAL(v.empty(),
true);
323 BOOST_CHECK_EQUAL(v.size(), 0U);
324 BOOST_CHECK(v==v_out);
325 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
326 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
329 BOOST_AUTO_TEST_CASE_TEMPLATE(fill_n, T, finite_test_types) {
330 typedef typename T::vtr_colln_t vtr_colln_t;
331 typedef typename T::pool_type pool_type;
332 typedef typename pool_type::joinable joinable;
334 pool_type pool(T::pool_size);
336 auto const &context=pool<<joinable()<<pool.fill_n(v, 1,
typename vtr_colln_t::value_type(1));
338 BOOST_CHECK_EQUAL(v.empty(),
false);
339 BOOST_CHECK_EQUAL(v.size(), 1);
340 BOOST_CHECK_EQUAL(v[0], 1);
341 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
342 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
345 BOOST_AUTO_TEST_CASE_TEMPLATE(fill, T, finite_test_types) {
346 typedef typename T::vtr_colln_t vtr_colln_t;
347 typedef typename T::pool_type pool_type;
348 typedef typename pool_type::joinable joinable;
350 pool_type pool(T::pool_size);
352 auto const &context=pool<<joinable()<<pool.fill(v,
typename vtr_colln_t::value_type(1));
354 BOOST_CHECK_EQUAL(v.empty(),
true);
355 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
356 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
359 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse, 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);
366 auto const &context=pool<<joinable()<<pool.reverse(v);
368 BOOST_CHECK_EQUAL(v.empty(),
true);
369 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
370 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
373 BOOST_AUTO_TEST_SUITE_END()
375 BOOST_AUTO_TEST_SUITE(nonempty_colln)
377 BOOST_AUTO_TEST_SUITE(one_element)
379 BOOST_AUTO_TEST_CASE_TEMPLATE(transform, T, finite_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;
384 pool_type pool(T::pool_size);
385 vtr_colln_t v{1}, v_out;
386 auto const &context=pool<<joinable()<<pool.transform(v, v_out,
std::negate<
typename vtr_colln_t::value_type>());
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_out.size(), 1U);
392 BOOST_CHECK_EQUAL(v_out[0], -v[0]);
395 BOOST_AUTO_TEST_CASE_TEMPLATE(transform_2_collns, T, finite_test_types) {
396 typedef typename T::vtr_colln_t vtr_colln_t;
397 typedef typename T::pool_type pool_type;
398 typedef typename pool_type::joinable joinable;
400 pool_type pool(T::pool_size);
401 vtr_colln_t v{1}, v1{1}, v_out;
402 auto const &context=pool<<joinable()<<pool.transform(v, v1, v_out,
std::plus<
typename vtr_colln_t::value_type>());
403 pool.min_time(vtr_colln_t::memory_access_mode);
404 pool.min_processors(vtr_colln_t::memory_access_mode);
406 BOOST_CHECK_EQUAL(v.size(), 1U);
407 BOOST_CHECK_EQUAL(v1.size(), 1U);
408 BOOST_CHECK_EQUAL(v_out.size(), 1U);
409 BOOST_CHECK_EQUAL(v_out[0], v[0]+v1[0]);
412 BOOST_AUTO_TEST_CASE_TEMPLATE(copy, 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);
418 vtr_colln_t v{1}, v_out;
419 auto const &context=pool<<joinable()<<pool.copy(v, v_out);
420 pool.min_time(vtr_colln_t::memory_access_mode);
421 pool.min_processors(vtr_colln_t::memory_access_mode);
423 BOOST_CHECK_EQUAL(v.size(), 1U);
424 BOOST_CHECK(v==v_out);
427 BOOST_AUTO_TEST_CASE_TEMPLATE(fill_n, 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);
434 auto const &context=pool<<joinable()<<pool.fill_n(v, 2,
typename vtr_colln_t::value_type(2));
436 BOOST_CHECK_EQUAL(v.empty(),
false);
437 BOOST_CHECK_EQUAL(v.size(), 2);
438 BOOST_CHECK_EQUAL(v[0], 2);
439 BOOST_CHECK_EQUAL(v[1], 2);
442 BOOST_AUTO_TEST_CASE_TEMPLATE(fill, T, finite_test_types) {
443 typedef typename T::vtr_colln_t vtr_colln_t;
444 typedef typename T::pool_type pool_type;
445 typedef typename pool_type::joinable joinable;
447 pool_type pool(T::pool_size);
449 auto const &context=pool<<joinable()<<pool.fill(v,
typename vtr_colln_t::value_type(2));
451 BOOST_CHECK_EQUAL(v.empty(),
false);
452 BOOST_CHECK_EQUAL(v.size(), 1);
453 BOOST_CHECK_EQUAL(v[0], 2);
456 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse, T, finite_test_types) {
457 typedef typename T::vtr_colln_t vtr_colln_t;
458 typedef typename T::pool_type pool_type;
459 typedef typename pool_type::joinable joinable;
461 pool_type pool(T::pool_size);
463 auto const &context=pool<<joinable()<<pool.reverse(v);
465 BOOST_CHECK_EQUAL(v.empty(),
false);
466 BOOST_CHECK_EQUAL(v.size(), 1);
467 BOOST_CHECK_EQUAL(v[0], 1);
470 BOOST_AUTO_TEST_SUITE_END()
472 BOOST_AUTO_TEST_SUITE(two_elements)
474 BOOST_AUTO_TEST_CASE_TEMPLATE(transform, T, finite_test_types) {
475 typedef typename T::vtr_colln_t vtr_colln_t;
476 typedef typename T::pool_type pool_type;
477 typedef typename pool_type::joinable joinable;
479 pool_type pool(T::pool_size);
480 vtr_colln_t v{1, 2}, v_out;
481 auto const &context=pool<<joinable()<<pool.transform(v, v_out,
std::negate<
typename vtr_colln_t::value_type>());
482 pool.min_time(vtr_colln_t::memory_access_mode);
483 pool.min_processors(vtr_colln_t::memory_access_mode);
485 BOOST_CHECK_EQUAL(v.size(), 2U);
486 BOOST_CHECK_EQUAL(v_out.size(), 2U);
487 BOOST_CHECK_EQUAL(v_out[0], -v[0]);
488 BOOST_CHECK_EQUAL(v_out[1], -v[1]);
491 BOOST_AUTO_TEST_CASE_TEMPLATE(transform_2_collns, T, finite_test_types) {
492 typedef typename T::vtr_colln_t vtr_colln_t;
493 typedef typename T::pool_type pool_type;
494 typedef typename pool_type::joinable joinable;
496 pool_type pool(T::pool_size);
497 vtr_colln_t v{1, 2}, v1{1, 2}, v_out;
498 auto const &context=pool<<joinable()<<pool.transform(v, v1, v_out,
std::plus<
typename vtr_colln_t::value_type>());
499 pool.min_time(vtr_colln_t::memory_access_mode);
500 pool.min_processors(vtr_colln_t::memory_access_mode);
502 BOOST_CHECK_EQUAL(v.size(), 2U);
503 BOOST_CHECK_EQUAL(v1.size(), 2U);
504 BOOST_CHECK_EQUAL(v_out.size(), 2U);
505 BOOST_CHECK_EQUAL(v_out[0], v[0]+v1[0]);
506 BOOST_CHECK_EQUAL(v_out[1], v[1]+v1[1]);
509 BOOST_AUTO_TEST_CASE_TEMPLATE(copy, T, finite_test_types) {
510 typedef typename T::vtr_colln_t vtr_colln_t;
511 typedef typename T::pool_type pool_type;
512 typedef typename pool_type::joinable joinable;
514 pool_type pool(T::pool_size);
515 vtr_colln_t v{1, 2}, v_out;
516 auto const &context=pool<<joinable()<<pool.copy(v, v_out);
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(v==v_out);
524 BOOST_AUTO_TEST_CASE_TEMPLATE(fill_n, T, finite_test_types) {
525 typedef typename T::vtr_colln_t vtr_colln_t;
526 typedef typename T::pool_type pool_type;
527 typedef typename pool_type::joinable joinable;
529 pool_type pool(T::pool_size);
531 auto const &context=pool<<joinable()<<pool.fill_n(v, 2,
typename vtr_colln_t::value_type(3));
533 BOOST_CHECK_EQUAL(v.empty(),
false);
534 BOOST_CHECK_EQUAL(v.size(), 2);
535 BOOST_CHECK_EQUAL(v[0], 3);
536 BOOST_CHECK_EQUAL(v[1], 3);
539 BOOST_AUTO_TEST_CASE_TEMPLATE(fill, T, finite_test_types) {
540 typedef typename T::vtr_colln_t vtr_colln_t;
541 typedef typename T::pool_type pool_type;
542 typedef typename pool_type::joinable joinable;
544 pool_type pool(T::pool_size);
546 auto const &context=pool<<joinable()<<pool.fill(v,
typename vtr_colln_t::value_type(3));
548 BOOST_CHECK_EQUAL(v.empty(),
false);
549 BOOST_CHECK_EQUAL(v.size(), 2);
550 BOOST_CHECK_EQUAL(v[0], 3);
551 BOOST_CHECK_EQUAL(v[1], 3);
554 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse, T, finite_test_types) {
555 typedef typename T::vtr_colln_t vtr_colln_t;
556 typedef typename T::pool_type pool_type;
557 typedef typename pool_type::joinable joinable;
559 pool_type pool(T::pool_size);
561 auto const &context=pool<<joinable()<<pool.reverse(v);
563 BOOST_CHECK_EQUAL(v.empty(),
false);
564 BOOST_CHECK_EQUAL(v.size(), 2);
565 BOOST_CHECK_EQUAL(v[0], 2);
566 BOOST_CHECK_EQUAL(v[1], 1);
569 BOOST_AUTO_TEST_SUITE_END()
571 BOOST_AUTO_TEST_SUITE(n_elements)
573 BOOST_AUTO_TEST_CASE_TEMPLATE(transform, T, finite_test_types) {
574 typedef typename T::vtr_colln_t vtr_colln_t;
575 typedef typename T::pool_type pool_type;
576 typedef typename pool_type::joinable joinable;
578 pool_type pool(T::pool_size);
579 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8}, v_out;
580 auto const &context=pool<<joinable()<<pool.transform(v, v_out,
std::negate<
typename vtr_colln_t::value_type>());
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(), 8U);
585 BOOST_CHECK_EQUAL(v_out.size(), 8U);
586 BOOST_CHECK_EQUAL(v_out[0], -v[0]);
587 BOOST_CHECK_EQUAL(v_out[1], -v[1]);
588 BOOST_CHECK_EQUAL(v_out[2], -v[2]);
589 BOOST_CHECK_EQUAL(v_out[3], -v[3]);
590 BOOST_CHECK_EQUAL(v_out[4], -v[4]);
591 BOOST_CHECK_EQUAL(v_out[5], -v[5]);
592 BOOST_CHECK_EQUAL(v_out[6], -v[6]);
593 BOOST_CHECK_EQUAL(v_out[7], -v[7]);
596 BOOST_AUTO_TEST_CASE_TEMPLATE(transform_2_collns, T, finite_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;
601 pool_type pool(T::pool_size);
602 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8}, v1{1, 2, 3, 4, 5, 6, 7, 8}, v_out;
603 auto const &context=pool<<joinable()<<pool.transform(v, v1, v_out,
std::plus<
typename vtr_colln_t::value_type>());
604 pool.min_time(vtr_colln_t::memory_access_mode);
605 pool.min_processors(vtr_colln_t::memory_access_mode);
607 BOOST_CHECK_EQUAL(v.size(), 8U);
608 BOOST_CHECK_EQUAL(v1.size(), 8U);
609 BOOST_CHECK_EQUAL(v_out.size(), 8U);
610 BOOST_CHECK_EQUAL(v_out[0], v[0]+v1[0]);
611 BOOST_CHECK_EQUAL(v_out[1], v[1]+v1[1]);
612 BOOST_CHECK_EQUAL(v_out[2], v[2]+v1[2]);
613 BOOST_CHECK_EQUAL(v_out[3], v[3]+v1[3]);
614 BOOST_CHECK_EQUAL(v_out[4], v[4]+v1[4]);
615 BOOST_CHECK_EQUAL(v_out[5], v[5]+v1[5]);
616 BOOST_CHECK_EQUAL(v_out[6], v[6]+v1[6]);
617 BOOST_CHECK_EQUAL(v_out[7], v[7]+v1[7]);
620 BOOST_AUTO_TEST_CASE_TEMPLATE(copy, T, finite_test_types) {
621 typedef typename T::vtr_colln_t vtr_colln_t;
622 typedef typename T::pool_type pool_type;
623 typedef typename pool_type::joinable joinable;
625 pool_type pool(T::pool_size);
626 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8}, v_out;
627 auto const &context=pool<<joinable()<<pool.copy(v, v_out);
628 pool.min_time(vtr_colln_t::memory_access_mode);
629 pool.min_processors(vtr_colln_t::memory_access_mode);
631 BOOST_CHECK_EQUAL(v.size(), 8U);
632 BOOST_CHECK(v==v_out);
635 BOOST_AUTO_TEST_CASE_TEMPLATE(two_sequential_independent_copies, T, finite_test_types) {
636 typedef typename T::vtr_colln_t vtr_colln_t;
637 typedef typename T::pool_type pool_type;
638 typedef typename pool_type::joinable joinable;
640 pool_type pool(T::pool_size);
641 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8}, v1{11, 22, 33, 44, 55, 66, 77, 88}, v3, v4;
642 v3.reserve(v.size()+v1.size());
643 auto const &context1=pool<<joinable()<<pool.copy(v, v3);
645 auto const &context2=pool<<joinable()<<pool.copy(v1,v4);
647 BOOST_CHECK_EQUAL(v3.size(), 8U);
649 BOOST_CHECK_EQUAL(v4.size(), 8U);
652 v_chk.reserve(v3.size()*2);
653 std::copy(v3.colln().begin(), v3.colln().end(),
std::back_inserter(v_chk.colln()));
654 BOOST_CHECK_EQUAL(v_chk.colln().size(), 8U);
655 BOOST_CHECK_EQUAL(v_chk.size(), 8U);
656 BOOST_CHECK(v==v_chk);
659 BOOST_AUTO_TEST_CASE_TEMPLATE(two_concurrent_independent_copies, T, finite_test_types) {
660 typedef typename T::vtr_colln_t vtr_colln_t;
661 typedef typename T::pool_type pool_type;
662 typedef typename pool_type::joinable joinable;
664 pool_type pool(T::pool_size);
665 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8}, v1{11, 22, 33, 44, 55, 66, 77, 88}, v3, v4;
666 auto const &context1=pool<<joinable()<<pool.copy(v, v3);
667 auto const &context2=pool<<joinable()<<pool.copy(v1, v4);
670 BOOST_CHECK_EQUAL(v3.size(), 8U);
672 BOOST_CHECK_EQUAL(v4.size(), 8U);
676 BOOST_AUTO_TEST_CASE_TEMPLATE(two_concurrent_dependent_copies_second_larger, T, finite_test_types) {
677 typedef typename T::vtr_colln_t vtr_colln_t;
678 typedef typename T::pool_type pool_type;
679 typedef typename pool_type::joinable joinable;
681 pool_type pool(T::pool_size);
682 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8}, v1{11, 22, 33, 44, 55, 66, 77, 88, 99}, v3;
683 auto const &context1=pool<<joinable()<<pool.copy(v, v3);
684 auto const &context2=pool<<joinable()<<pool.copy(v1, v3);
687 BOOST_CHECK_EQUAL(v.size(), 8U);
688 BOOST_CHECK_EQUAL(v1.size(), 9U);
689 BOOST_CHECK(v3.size()==v1.size());
693 BOOST_AUTO_TEST_CASE_TEMPLATE(two_concurrent_dependent_copies_invert_dependencies, T, finite_test_types) {
694 typedef typename T::vtr_colln_t vtr_colln_t;
695 typedef typename T::pool_type pool_type;
696 typedef typename pool_type::joinable joinable;
698 pool_type pool(T::pool_size);
699 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8}, v1{11, 22, 33, 44, 55, 66, 77, 88, 99}, v3;
700 auto const &context1=pool<<joinable()<<pool.copy(v, v3);
701 auto const &context2=pool<<joinable()<<pool.copy(v1, v3);
704 BOOST_CHECK_EQUAL(v.size(), 8U);
705 BOOST_CHECK_EQUAL(v1.size(), 9U);
706 BOOST_CHECK(v3.size()==v1.size());
710 BOOST_AUTO_TEST_CASE_TEMPLATE(two_concurrent_dependent_copies_second_smaller, T, finite_test_types) {
711 typedef typename T::vtr_colln_t vtr_colln_t;
712 typedef typename T::pool_type pool_type;
713 typedef typename pool_type::joinable joinable;
715 pool_type pool(T::pool_size);
716 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8}, v1{11, 22, 33, 44, 55}, v3;
717 auto const &context1=pool<<joinable()<<pool.copy(v, v3);
718 auto const &context2=pool<<joinable()<<pool.copy(v1, v3);
721 BOOST_CHECK_EQUAL(v.size(), 8U);
722 BOOST_CHECK_EQUAL(v1.size(), 5U);
723 BOOST_CHECK(v3.size()==v1.size());
724 BOOST_CHECK(v3[0]==v1[0]);
725 BOOST_CHECK(v3[1]==v1[1]);
726 BOOST_CHECK(v3[2]==v1[2]);
727 BOOST_CHECK(v3[3]==v1[3]);
728 BOOST_CHECK(v3[4]==v1[4]);
729 BOOST_CHECK(v3[5]==v[5]);
730 BOOST_CHECK(v3[6]==v[6]);
731 BOOST_CHECK(v3[7]==v[7]);
734 BOOST_AUTO_TEST_CASE_TEMPLATE(fill_n, T, finite_test_types) {
735 typedef typename T::vtr_colln_t vtr_colln_t;
736 typedef typename T::pool_type pool_type;
737 typedef typename pool_type::joinable joinable;
739 pool_type pool(T::pool_size);
740 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8};
741 auto const &context=pool<<joinable()<<pool.fill_n(v, 2,
typename vtr_colln_t::value_type(9));
743 BOOST_CHECK_EQUAL(v.empty(),
false);
744 BOOST_CHECK_EQUAL(v.size(), 2U);
745 BOOST_CHECK_EQUAL(v[0], 9);
746 BOOST_CHECK_EQUAL(v[1], 9);
747 BOOST_CHECK_EQUAL(v[2], 3);
748 BOOST_CHECK_EQUAL(v[3], 4);
749 BOOST_CHECK_EQUAL(v[4], 5);
750 BOOST_CHECK_EQUAL(v[5], 6);
751 BOOST_CHECK_EQUAL(v[6], 7);
752 BOOST_CHECK_EQUAL(v[7], 8);
755 BOOST_AUTO_TEST_CASE_TEMPLATE(fill, T, finite_test_types) {
756 typedef typename T::vtr_colln_t vtr_colln_t;
757 typedef typename T::pool_type pool_type;
758 typedef typename pool_type::joinable joinable;
760 pool_type pool(T::pool_size);
761 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8};
762 auto const &context=pool<<joinable()<<pool.fill(v,
typename vtr_colln_t::value_type(9));
764 BOOST_CHECK_EQUAL(v.empty(),
false);
765 BOOST_CHECK_EQUAL(v.size(), 8);
766 BOOST_CHECK_EQUAL(v[0], 9);
767 BOOST_CHECK_EQUAL(v[1], 9);
768 BOOST_CHECK_EQUAL(v[2], 9);
769 BOOST_CHECK_EQUAL(v[3], 9);
770 BOOST_CHECK_EQUAL(v[4], 9);
771 BOOST_CHECK_EQUAL(v[5], 9);
772 BOOST_CHECK_EQUAL(v[6], 9);
773 BOOST_CHECK_EQUAL(v[7], 9);
776 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse_8_elems, T, finite_test_types) {
777 typedef typename T::vtr_colln_t vtr_colln_t;
778 typedef typename T::pool_type pool_type;
779 typedef typename pool_type::joinable joinable;
781 pool_type pool(T::pool_size);
782 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8};
783 auto const &context=pool<<joinable()<<pool.reverse(v);
785 BOOST_CHECK_EQUAL(v.empty(),
false);
786 BOOST_CHECK_EQUAL(v.size(), 8);
787 BOOST_CHECK_EQUAL(v[0], 8);
788 BOOST_CHECK_EQUAL(v[1], 7);
789 BOOST_CHECK_EQUAL(v[2], 6);
790 BOOST_CHECK_EQUAL(v[3], 5);
791 BOOST_CHECK_EQUAL(v[4], 4);
792 BOOST_CHECK_EQUAL(v[5], 3);
793 BOOST_CHECK_EQUAL(v[6], 2);
794 BOOST_CHECK_EQUAL(v[7], 1);
797 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse_9_elems, T, finite_test_types) {
798 typedef typename T::vtr_colln_t vtr_colln_t;
799 typedef typename T::pool_type pool_type;
800 typedef typename pool_type::joinable joinable;
802 pool_type pool(T::pool_size);
803 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8, 9};
804 auto const &context=pool<<joinable()<<pool.reverse(v);
806 BOOST_CHECK_EQUAL(v.empty(),
false);
807 BOOST_CHECK_EQUAL(v.size(), 9);
808 BOOST_CHECK_EQUAL(v[0], 9);
809 BOOST_CHECK_EQUAL(v[1], 8);
810 BOOST_CHECK_EQUAL(v[2], 7);
811 BOOST_CHECK_EQUAL(v[3], 6);
812 BOOST_CHECK_EQUAL(v[4], 5);
813 BOOST_CHECK_EQUAL(v[5], 4);
814 BOOST_CHECK_EQUAL(v[6], 3);
815 BOOST_CHECK_EQUAL(v[7], 2);
816 BOOST_CHECK_EQUAL(v[8], 1);
819 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse_9_elems_clear, T, finite_test_types) {
820 typedef typename T::vtr_colln_t vtr_colln_t;
821 typedef typename T::pool_type pool_type;
822 typedef typename pool_type::joinable joinable;
824 pool_type pool(T::pool_size);
825 vtr_colln_t v{1, 2, 3, 4, 5, 6, 7, 8, 9};
826 auto const &context=pool<<joinable()<<pool.reverse(v);
829 BOOST_CHECK_EQUAL(v.empty(),
true);
830 BOOST_CHECK_EQUAL(v.size(), 0);
833 BOOST_AUTO_TEST_SUITE_END()
835 BOOST_AUTO_TEST_SUITE_END()
837 BOOST_AUTO_TEST_SUITE_END()
839 BOOST_AUTO_TEST_SUITE(infinite)
841 BOOST_AUTO_TEST_SUITE(empty_colln)
843 BOOST_AUTO_TEST_CASE_TEMPLATE(transform, T, infinite_test_types) {
844 typedef typename T::vtr_colln_t vtr_colln_t;
845 typedef typename T::pool_type pool_type;
846 typedef typename pool_type::joinable joinable;
849 vtr_colln_t v, v_out;
850 auto const &context=pool<<joinable()<<pool.transform(v, v_out,
std::negate<
typename vtr_colln_t::value_type>());
851 pool.min_time(vtr_colln_t::memory_access_mode);
852 pool.min_processors(vtr_colln_t::memory_access_mode);
854 BOOST_CHECK_EQUAL(v.empty(),
true);
855 BOOST_CHECK(v==v_out);
856 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
857 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
860 BOOST_AUTO_TEST_CASE_TEMPLATE(transform_2_collns, T, infinite_test_types) {
861 typedef typename T::vtr_colln_t vtr_colln_t;
862 typedef typename T::pool_type pool_type;
863 typedef typename pool_type::joinable joinable;
866 vtr_colln_t v, v1, v_out;
867 auto const &context=pool<<joinable()<<pool.transform(v, v1, v_out,
std::plus<
typename vtr_colln_t::value_type>());
868 pool.min_time(vtr_colln_t::memory_access_mode);
869 pool.min_processors(vtr_colln_t::memory_access_mode);
871 BOOST_CHECK_EQUAL(v.empty(),
true);
872 BOOST_CHECK_EQUAL(v1.empty(),
true);
873 BOOST_CHECK(v==v_out);
874 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
875 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
878 BOOST_AUTO_TEST_CASE_TEMPLATE(copy, T, infinite_test_types) {
879 typedef typename T::vtr_colln_t vtr_colln_t;
880 typedef typename T::pool_type pool_type;
881 typedef typename pool_type::joinable joinable;
884 vtr_colln_t v, v_out;
885 auto const &context=pool<<joinable()<<pool.copy(v, v_out);
886 pool.min_time(vtr_colln_t::memory_access_mode);
887 pool.min_processors(vtr_colln_t::memory_access_mode);
889 BOOST_CHECK_EQUAL(v.empty(),
true);
890 BOOST_CHECK_EQUAL(v.size(), 0U);
891 BOOST_CHECK(v==v_out);
892 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
893 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
896 BOOST_AUTO_TEST_CASE_TEMPLATE(fill_n, T, infinite_test_types) {
897 typedef typename T::vtr_colln_t vtr_colln_t;
898 typedef typename T::pool_type pool_type;
899 typedef typename pool_type::joinable joinable;
903 auto const &context=pool<<joinable()<<pool.fill_n(v, 1,
typename vtr_colln_t::value_type(1));
905 BOOST_CHECK_EQUAL(v.empty(),
false);
906 BOOST_CHECK_EQUAL(v.size(), 1);
907 BOOST_CHECK_EQUAL(v[0], 1);
908 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
909 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
912 BOOST_AUTO_TEST_CASE_TEMPLATE(fill, T, infinite_test_types) {
913 typedef typename T::vtr_colln_t vtr_colln_t;
914 typedef typename T::pool_type pool_type;
915 typedef typename pool_type::joinable joinable;
919 auto const &context=pool<<joinable()<<pool.fill(v,
typename vtr_colln_t::value_type(1));
921 BOOST_CHECK_EQUAL(v.empty(),
true);
922 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
923 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
926 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse, T, infinite_test_types) {
927 typedef typename T::vtr_colln_t vtr_colln_t;
928 typedef typename T::pool_type pool_type;
929 typedef typename pool_type::joinable joinable;
933 auto const &context=pool<<joinable()<<pool.reverse(v);
935 BOOST_CHECK_EQUAL(v.empty(),
true);
936 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
937 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
940 BOOST_AUTO_TEST_SUITE_END()
942 BOOST_AUTO_TEST_SUITE_END()
944 BOOST_AUTO_TEST_SUITE(nonempty_colln)
946 BOOST_AUTO_TEST_SUITE(one_element)
948 BOOST_AUTO_TEST_CASE_TEMPLATE(transform, T, infinite_test_types) {
949 typedef typename T::vtr_colln_t vtr_colln_t;
950 typedef typename T::pool_type pool_type;
951 typedef typename pool_type::joinable joinable;
954 vtr_colln_t v, v_out;
956 auto const &context=pool<<joinable()<<pool.transform(v, v_out,
std::negate<
typename vtr_colln_t::value_type>());
957 pool.min_time(vtr_colln_t::memory_access_mode);
958 pool.min_processors(vtr_colln_t::memory_access_mode);
960 BOOST_CHECK_EQUAL(v.size(), 1U);
961 BOOST_CHECK_EQUAL(v_out.size(), 1U);
962 BOOST_CHECK_EQUAL(v_out[0], -v[0]);
965 BOOST_AUTO_TEST_CASE_TEMPLATE(transform_2_collns, T, infinite_test_types) {
966 typedef typename T::vtr_colln_t vtr_colln_t;
967 typedef typename T::pool_type pool_type;
968 typedef typename pool_type::joinable joinable;
971 vtr_colln_t v, v1, v_out;
974 auto const &context=pool<<joinable()<<pool.transform(v, v1, v_out,
std::plus<
typename vtr_colln_t::value_type>());
975 pool.min_time(vtr_colln_t::memory_access_mode);
976 pool.min_processors(vtr_colln_t::memory_access_mode);
978 BOOST_CHECK_EQUAL(v.size(), 1U);
979 BOOST_CHECK_EQUAL(v1.size(), 1U);
980 BOOST_CHECK_EQUAL(v_out.size(), 1U);
981 BOOST_CHECK_EQUAL(v_out[0], v[0]+v1[0]);
984 BOOST_AUTO_TEST_CASE_TEMPLATE(copy, T, infinite_test_types) {
985 typedef typename T::vtr_colln_t vtr_colln_t;
986 typedef typename T::pool_type pool_type;
987 typedef typename pool_type::joinable joinable;
990 vtr_colln_t v, v_out;
992 auto const &context=pool<<joinable()<<pool.copy(v, v_out);
993 pool.min_time(vtr_colln_t::memory_access_mode);
994 pool.min_processors(vtr_colln_t::memory_access_mode);
996 BOOST_CHECK_EQUAL(v.size(), 1U);
997 BOOST_CHECK(v==v_out);
1000 BOOST_AUTO_TEST_CASE_TEMPLATE(fill_n, T, infinite_test_types) {
1001 typedef typename T::vtr_colln_t vtr_colln_t;
1002 typedef typename T::pool_type pool_type;
1003 typedef typename pool_type::joinable joinable;
1008 auto const &context=pool<<joinable()<<pool.fill_n(v, 2,
typename vtr_colln_t::value_type(2));
1010 BOOST_CHECK_EQUAL(v.empty(),
false);
1011 BOOST_CHECK_EQUAL(v.size(), 2);
1012 BOOST_CHECK_EQUAL(v[0], 2);
1013 BOOST_CHECK_EQUAL(v[1], 2);
1016 BOOST_AUTO_TEST_CASE_TEMPLATE(fill, T, infinite_test_types) {
1017 typedef typename T::vtr_colln_t vtr_colln_t;
1018 typedef typename T::pool_type pool_type;
1019 typedef typename pool_type::joinable joinable;
1024 auto const &context=pool<<joinable()<<pool.fill(v,
typename vtr_colln_t::value_type(2));
1026 BOOST_CHECK_EQUAL(v.empty(),
false);
1027 BOOST_CHECK_EQUAL(v.size(), 1);
1028 BOOST_CHECK_EQUAL(v[0], 2);
1031 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse, T, infinite_test_types) {
1032 typedef typename T::vtr_colln_t vtr_colln_t;
1033 typedef typename T::pool_type pool_type;
1034 typedef typename pool_type::joinable joinable;
1039 auto const &context=pool<<joinable()<<pool.reverse(v);
1041 BOOST_CHECK_EQUAL(v.empty(),
false);
1042 BOOST_CHECK_EQUAL(v.size(), 1);
1043 BOOST_CHECK_EQUAL(v[0], 1);
1046 BOOST_AUTO_TEST_SUITE_END()
1048 BOOST_AUTO_TEST_SUITE(two_elements)
1050 BOOST_AUTO_TEST_CASE_TEMPLATE(transform, T, infinite_test_types) {
1051 typedef typename T::vtr_colln_t vtr_colln_t;
1052 typedef typename T::pool_type pool_type;
1053 typedef typename pool_type::joinable joinable;
1056 vtr_colln_t v, v_out;
1059 auto const &context=pool<<joinable()<<pool.transform(v, v_out,
std::negate<
typename vtr_colln_t::value_type>());
1060 pool.min_time(vtr_colln_t::memory_access_mode);
1061 pool.min_processors(vtr_colln_t::memory_access_mode);
1063 BOOST_CHECK_EQUAL(v.size(), 2U);
1064 BOOST_CHECK_EQUAL(v_out.size(), 2U);
1065 BOOST_CHECK_EQUAL(v_out[0], -v[0]);
1066 BOOST_CHECK_EQUAL(v_out[1], -v[1]);
1069 BOOST_AUTO_TEST_CASE_TEMPLATE(transform_2_collns, T, infinite_test_types) {
1070 typedef typename T::vtr_colln_t vtr_colln_t;
1071 typedef typename T::pool_type pool_type;
1072 typedef typename pool_type::joinable joinable;
1075 vtr_colln_t v, v1, v_out;
1080 auto const &context=pool<<joinable()<<pool.transform(v, v1, v_out,
std::plus<
typename vtr_colln_t::value_type>());
1081 pool.min_time(vtr_colln_t::memory_access_mode);
1082 pool.min_processors(vtr_colln_t::memory_access_mode);
1084 BOOST_CHECK_EQUAL(v.size(), 2U);
1085 BOOST_CHECK_EQUAL(v1.size(), 2U);
1086 BOOST_CHECK_EQUAL(v_out.size(), 2U);
1087 BOOST_CHECK_EQUAL(v_out[0], v[0]+v1[0]);
1088 BOOST_CHECK_EQUAL(v_out[1], v[1]+v1[1]);
1091 BOOST_AUTO_TEST_CASE_TEMPLATE(copy, T, infinite_test_types) {
1092 typedef typename T::vtr_colln_t vtr_colln_t;
1093 typedef typename T::pool_type pool_type;
1094 typedef typename pool_type::joinable joinable;
1097 vtr_colln_t v, v_out;
1100 auto const &context=pool<<joinable()<<pool.copy(v, v_out);
1101 pool.min_time(vtr_colln_t::memory_access_mode);
1102 pool.min_processors(vtr_colln_t::memory_access_mode);
1104 BOOST_CHECK_EQUAL(v.size(), 2U);
1105 BOOST_CHECK(v==v_out);
1108 BOOST_AUTO_TEST_CASE_TEMPLATE(fill_n, T, infinite_test_types) {
1109 typedef typename T::vtr_colln_t vtr_colln_t;
1110 typedef typename T::pool_type pool_type;
1111 typedef typename pool_type::joinable joinable;
1117 auto const &context=pool<<joinable()<<pool.fill_n(v, 2,
typename vtr_colln_t::value_type(3));
1119 BOOST_CHECK_EQUAL(v.empty(),
false);
1120 BOOST_CHECK_EQUAL(v.size(), 2);
1121 BOOST_CHECK_EQUAL(v[0], 3);
1122 BOOST_CHECK_EQUAL(v[1], 3);
1125 BOOST_AUTO_TEST_CASE_TEMPLATE(fill, T, infinite_test_types) {
1126 typedef typename T::vtr_colln_t vtr_colln_t;
1127 typedef typename T::pool_type pool_type;
1128 typedef typename pool_type::joinable joinable;
1134 auto const &context=pool<<joinable()<<pool.fill(v,
typename vtr_colln_t::value_type(3));
1136 BOOST_CHECK_EQUAL(v.empty(),
false);
1137 BOOST_CHECK_EQUAL(v.size(), 2);
1138 BOOST_CHECK_EQUAL(v[0], 3);
1139 BOOST_CHECK_EQUAL(v[1], 3);
1142 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse, T, infinite_test_types) {
1143 typedef typename T::vtr_colln_t vtr_colln_t;
1144 typedef typename T::pool_type pool_type;
1145 typedef typename pool_type::joinable joinable;
1151 auto const &context=pool<<joinable()<<pool.reverse(v);
1153 BOOST_CHECK_EQUAL(v.empty(),
false);
1154 BOOST_CHECK_EQUAL(v.size(), 2);
1155 BOOST_CHECK_EQUAL(v[0], 2);
1156 BOOST_CHECK_EQUAL(v[1], 1);
1159 BOOST_AUTO_TEST_SUITE_END()
1161 BOOST_AUTO_TEST_SUITE(n_elements)
1163 BOOST_AUTO_TEST_CASE_TEMPLATE(transform, T, infinite_test_types) {
1164 typedef typename T::vtr_colln_t vtr_colln_t;
1165 typedef typename T::pool_type pool_type;
1166 typedef typename pool_type::joinable joinable;
1169 vtr_colln_t v, v_out;
1178 auto const &context=pool<<joinable()<<pool.transform(v, v_out,
std::negate<
typename vtr_colln_t::value_type>());
1179 pool.min_time(vtr_colln_t::memory_access_mode);
1180 pool.min_processors(vtr_colln_t::memory_access_mode);
1182 BOOST_CHECK_EQUAL(v.size(), 8U);
1183 BOOST_CHECK_EQUAL(v_out.size(), 8U);
1184 BOOST_CHECK_EQUAL(v_out[0], -v[0]);
1185 BOOST_CHECK_EQUAL(v_out[1], -v[1]);
1186 BOOST_CHECK_EQUAL(v_out[2], -v[2]);
1187 BOOST_CHECK_EQUAL(v_out[3], -v[3]);
1188 BOOST_CHECK_EQUAL(v_out[4], -v[4]);
1189 BOOST_CHECK_EQUAL(v_out[5], -v[5]);
1190 BOOST_CHECK_EQUAL(v_out[6], -v[6]);
1191 BOOST_CHECK_EQUAL(v_out[7], -v[7]);
1194 BOOST_AUTO_TEST_CASE_TEMPLATE(transform_2_collns, T, infinite_test_types) {
1195 typedef typename T::vtr_colln_t vtr_colln_t;
1196 typedef typename T::pool_type pool_type;
1197 typedef typename pool_type::joinable joinable;
1200 vtr_colln_t v, v1, v_out;
1217 auto const &context=pool<<joinable()<<pool.transform(v, v1, v_out,
std::plus<
typename vtr_colln_t::value_type>());
1218 pool.min_time(vtr_colln_t::memory_access_mode);
1219 pool.min_processors(vtr_colln_t::memory_access_mode);
1221 BOOST_CHECK_EQUAL(v.size(), 8U);
1222 BOOST_CHECK_EQUAL(v1.size(), 8U);
1223 BOOST_CHECK_EQUAL(v_out.size(), 8U);
1224 BOOST_CHECK_EQUAL(v_out[0], v[0]+v1[0]);
1225 BOOST_CHECK_EQUAL(v_out[1], v[1]+v1[1]);
1226 BOOST_CHECK_EQUAL(v_out[2], v[2]+v1[2]);
1227 BOOST_CHECK_EQUAL(v_out[3], v[3]+v1[3]);
1228 BOOST_CHECK_EQUAL(v_out[4], v[4]+v1[4]);
1229 BOOST_CHECK_EQUAL(v_out[5], v[5]+v1[5]);
1230 BOOST_CHECK_EQUAL(v_out[6], v[6]+v1[6]);
1231 BOOST_CHECK_EQUAL(v_out[7], v[7]+v1[7]);
1234 BOOST_AUTO_TEST_CASE_TEMPLATE(copy, T, infinite_test_types) {
1235 typedef typename T::vtr_colln_t vtr_colln_t;
1236 typedef typename T::pool_type pool_type;
1237 typedef typename pool_type::joinable joinable;
1240 vtr_colln_t v, v_out;
1249 auto const &context=pool<<joinable()<<pool.copy(v, v_out);
1250 pool.min_time(vtr_colln_t::memory_access_mode);
1251 pool.min_processors(vtr_colln_t::memory_access_mode);
1253 BOOST_CHECK_EQUAL(v.size(), 8U);
1254 BOOST_CHECK(v==v_out);
1257 BOOST_AUTO_TEST_CASE_TEMPLATE(two_sequential_independent_copies, T, infinite_test_types) {
1258 typedef typename T::vtr_colln_t vtr_colln_t;
1259 typedef typename T::pool_type pool_type;
1260 typedef typename pool_type::joinable joinable;
1263 vtr_colln_t v, v1, v3, v4;
1280 auto const &context1=pool<<joinable()<<pool.copy(v, v3);
1282 auto const &context2=pool<<joinable()<<pool.copy(v1, v4);
1284 BOOST_CHECK_EQUAL(v3.size(), 8U);
1286 BOOST_CHECK_EQUAL(v4.size(), 8U);
1287 BOOST_CHECK(v1==v4);
1290 BOOST_AUTO_TEST_CASE_TEMPLATE(two_concurrent_independent_copies, T, infinite_test_types) {
1291 typedef typename T::vtr_colln_t vtr_colln_t;
1292 typedef typename T::pool_type pool_type;
1293 typedef typename pool_type::joinable joinable;
1296 vtr_colln_t v, v1, v3, v4;
1313 auto const &context1=pool<<joinable()<<pool.copy(v, v3);
1314 auto const &context2=pool<<joinable()<<pool.copy(v1, v4);
1317 BOOST_CHECK_EQUAL(v3.size(), 8U);
1319 BOOST_CHECK_EQUAL(v4.size(), 8U);
1320 BOOST_CHECK(v1==v4);
1323 BOOST_AUTO_TEST_CASE_TEMPLATE(two_concurrent_dependent_copies_second_larger, T, infinite_test_types) {
1324 typedef typename T::vtr_colln_t vtr_colln_t;
1325 typedef typename T::pool_type pool_type;
1326 typedef typename pool_type::joinable joinable;
1329 vtr_colln_t v, v1, v3;
1347 auto const &context1=pool<<joinable()<<pool.copy(v, v3);
1348 auto const &context2=pool<<joinable()<<pool.copy(v1, v3);
1351 BOOST_CHECK_EQUAL(v.size(), 8U);
1352 BOOST_CHECK_EQUAL(v1.size(), 9U);
1353 BOOST_CHECK(v3.size()==v1.size());
1354 BOOST_CHECK(v3==v1);
1357 BOOST_AUTO_TEST_CASE_TEMPLATE(two_concurrent_dependent_copies_invert_dependencies, T, infinite_test_types) {
1358 typedef typename T::vtr_colln_t vtr_colln_t;
1359 typedef typename T::pool_type pool_type;
1360 typedef typename pool_type::joinable joinable;
1363 vtr_colln_t v, v1, v3;
1381 auto const &context1=pool<<joinable()<<pool.copy(v,v3);
1382 auto const &context2=pool<<joinable()<<pool.copy(v1,v3);
1385 BOOST_CHECK_EQUAL(v.size(), 8U);
1386 BOOST_CHECK_EQUAL(v1.size(), 9U);
1387 BOOST_CHECK(v3.size()==v1.size());
1388 BOOST_CHECK(v3==v1);
1391 BOOST_AUTO_TEST_CASE_TEMPLATE(two_concurrent_dependent_copies_second_smaller, T, infinite_test_types) {
1392 typedef typename T::vtr_colln_t vtr_colln_t;
1393 typedef typename T::pool_type pool_type;
1394 typedef typename pool_type::joinable joinable;
1397 vtr_colln_t v, v1, v3;
1411 auto const &context1=pool<<joinable()<<pool.copy(v, v3);
1412 auto const &context2=pool<<joinable()<<pool.copy(v1, v3);
1415 BOOST_CHECK_EQUAL(v.size(), 8U);
1416 BOOST_CHECK_EQUAL(v1.size(), 5U);
1417 BOOST_CHECK(v3.size()==v1.size());
1418 BOOST_CHECK(v3==v1);
1421 BOOST_AUTO_TEST_CASE_TEMPLATE(fill_n, T, infinite_test_types) {
1422 typedef typename T::vtr_colln_t vtr_colln_t;
1423 typedef typename T::pool_type pool_type;
1424 typedef typename pool_type::joinable joinable;
1436 auto const &context=pool<<joinable()<<pool.fill_n(v, 2,
typename vtr_colln_t::value_type(9));
1438 BOOST_CHECK_EQUAL(v.empty(),
false);
1439 BOOST_CHECK_EQUAL(v.size(), 2);
1440 BOOST_CHECK_EQUAL(v[0], 9);
1441 BOOST_CHECK_EQUAL(v[1], 9);
1444 BOOST_AUTO_TEST_CASE_TEMPLATE(fill, T, infinite_test_types) {
1445 typedef typename T::vtr_colln_t vtr_colln_t;
1446 typedef typename T::pool_type pool_type;
1447 typedef typename pool_type::joinable joinable;
1459 auto const &context=pool<<joinable()<<pool.fill(v,
typename vtr_colln_t::value_type(9));
1461 BOOST_CHECK_EQUAL(v.empty(),
false);
1462 BOOST_CHECK_EQUAL(v.size(), 8);
1463 BOOST_CHECK_EQUAL(v[0], 9);
1464 BOOST_CHECK_EQUAL(v[1], 9);
1465 BOOST_CHECK_EQUAL(v[2], 9);
1466 BOOST_CHECK_EQUAL(v[3], 9);
1467 BOOST_CHECK_EQUAL(v[4], 9);
1468 BOOST_CHECK_EQUAL(v[5], 9);
1469 BOOST_CHECK_EQUAL(v[6], 9);
1470 BOOST_CHECK_EQUAL(v[7], 9);
1473 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse_8_elems, T, infinite_test_types) {
1474 typedef typename T::vtr_colln_t vtr_colln_t;
1475 typedef typename T::pool_type pool_type;
1476 typedef typename pool_type::joinable joinable;
1488 auto const &context=pool<<joinable()<<pool.reverse(v);
1490 BOOST_CHECK_EQUAL(v.empty(),
false);
1491 BOOST_CHECK_EQUAL(v.size(), 8);
1492 BOOST_CHECK_EQUAL(v[0], 8);
1493 BOOST_CHECK_EQUAL(v[1], 7);
1494 BOOST_CHECK_EQUAL(v[2], 6);
1495 BOOST_CHECK_EQUAL(v[3], 5);
1496 BOOST_CHECK_EQUAL(v[4], 4);
1497 BOOST_CHECK_EQUAL(v[5], 3);
1498 BOOST_CHECK_EQUAL(v[6], 2);
1499 BOOST_CHECK_EQUAL(v[7], 1);
1502 BOOST_AUTO_TEST_CASE_TEMPLATE(reverse_9_elems, T, infinite_test_types) {
1503 typedef typename T::vtr_colln_t vtr_colln_t;
1504 typedef typename T::pool_type pool_type;
1505 typedef typename pool_type::joinable joinable;
1518 auto const &context=pool<<joinable()<<pool.reverse(v);
1520 BOOST_CHECK_EQUAL(v.empty(),
false);
1521 BOOST_CHECK_EQUAL(v.size(), 9);
1522 BOOST_CHECK_EQUAL(v[0], 9);
1523 BOOST_CHECK_EQUAL(v[1], 8);
1524 BOOST_CHECK_EQUAL(v[2], 7);
1525 BOOST_CHECK_EQUAL(v[3], 6);
1526 BOOST_CHECK_EQUAL(v[4], 5);
1527 BOOST_CHECK_EQUAL(v[5], 4);
1528 BOOST_CHECK_EQUAL(v[6], 3);
1529 BOOST_CHECK_EQUAL(v[7], 2);
1530 BOOST_CHECK_EQUAL(v[8], 1);
1533 BOOST_AUTO_TEST_SUITE_END()
1535 BOOST_AUTO_TEST_SUITE_END()
1537 BOOST_AUTO_TEST_SUITE_END()
1539 BOOST_AUTO_TEST_SUITE_END()