test_tuple.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //---------------------------------------------------------------------------//
  2. // Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com>
  3. //
  4. // Distributed under the Boost Software License, Version 1.0
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. //
  8. // See http://boostorg.github.com/compute for more information.
  9. //---------------------------------------------------------------------------//
  10. #define BOOST_TEST_MODULE TestTuple
  11. #include <boost/test/unit_test.hpp>
  12. #include <iostream>
  13. #include <boost/tuple/tuple.hpp>
  14. #include <boost/tuple/tuple_io.hpp>
  15. #include <boost/tuple/tuple_comparison.hpp>
  16. #include <boost/compute/algorithm/copy.hpp>
  17. #include <boost/compute/algorithm/fill.hpp>
  18. #include <boost/compute/algorithm/find.hpp>
  19. #include <boost/compute/algorithm/transform.hpp>
  20. #include <boost/compute/container/vector.hpp>
  21. #include <boost/compute/types/tuple.hpp>
  22. #include "quirks.hpp"
  23. #include "check_macros.hpp"
  24. #include "context_setup.hpp"
  25. namespace compute = boost::compute;
  26. BOOST_AUTO_TEST_CASE(vector_tuple_int_float)
  27. {
  28. boost::compute::vector<boost::tuple<int, float> > vector(context);
  29. vector.push_back(boost::make_tuple(1, 2.1f), queue);
  30. vector.push_back(boost::make_tuple(2, 3.2f), queue);
  31. vector.push_back(boost::make_tuple(3, 4.3f), queue);
  32. }
  33. BOOST_AUTO_TEST_CASE(copy_vector_tuple)
  34. {
  35. // create vector of tuples on device
  36. boost::compute::vector<boost::tuple<char, int, float> > input(context);
  37. input.push_back(boost::make_tuple('a', 1, 2.3f), queue);
  38. input.push_back(boost::make_tuple('c', 3, 4.5f), queue);
  39. input.push_back(boost::make_tuple('f', 6, 7.8f), queue);
  40. // copy on device
  41. boost::compute::vector<boost::tuple<char, int, float> > output(context);
  42. boost::compute::copy(
  43. input.begin(),
  44. input.end(),
  45. output.begin(),
  46. queue
  47. );
  48. // copy to host
  49. std::vector<boost::tuple<char, int, float> > host_output(3);
  50. boost::compute::copy(
  51. input.begin(),
  52. input.end(),
  53. host_output.begin(),
  54. queue
  55. );
  56. // check tuple data
  57. BOOST_CHECK_EQUAL(host_output[0], boost::make_tuple('a', 1, 2.3f));
  58. BOOST_CHECK_EQUAL(host_output[1], boost::make_tuple('c', 3, 4.5f));
  59. BOOST_CHECK_EQUAL(host_output[2], boost::make_tuple('f', 6, 7.8f));
  60. }
  61. BOOST_AUTO_TEST_CASE(extract_tuple_elements)
  62. {
  63. compute::vector<boost::tuple<char, int, float> > vector(context);
  64. vector.push_back(boost::make_tuple('a', 1, 2.3f), queue);
  65. vector.push_back(boost::make_tuple('c', 3, 4.5f), queue);
  66. vector.push_back(boost::make_tuple('f', 6, 7.8f), queue);
  67. compute::vector<char> chars(3, context);
  68. compute::transform(
  69. vector.begin(), vector.end(), chars.begin(), compute::get<0>(), queue
  70. );
  71. CHECK_RANGE_EQUAL(char, 3, chars, ('a', 'c', 'f'));
  72. compute::vector<int> ints(3, context);
  73. compute::transform(
  74. vector.begin(), vector.end(), ints.begin(), compute::get<1>(), queue
  75. );
  76. CHECK_RANGE_EQUAL(int, 3, ints, (1, 3, 6));
  77. compute::vector<float> floats(3, context);
  78. compute::transform(
  79. vector.begin(), vector.end(), floats.begin(), compute::get<2>(), queue
  80. );
  81. CHECK_RANGE_EQUAL(float, 3, floats, (2.3f, 4.5f, 7.8f));
  82. }
  83. BOOST_AUTO_TEST_CASE(fill_tuple_vector)
  84. {
  85. if(bug_in_struct_assignment(device)){
  86. std::cerr << "skipping fill_tuple_vector test" << std::endl;
  87. return;
  88. }
  89. compute::vector<boost::tuple<char, int, float> > vector(5, context);
  90. compute::fill(vector.begin(), vector.end(), boost::make_tuple('z', 4, 3.14f), queue);
  91. std::vector<boost::tuple<char, int, float> > host_output(5);
  92. compute::copy(vector.begin(), vector.end(), host_output.begin(), queue);
  93. BOOST_CHECK_EQUAL(host_output[0], boost::make_tuple('z', 4, 3.14f));
  94. BOOST_CHECK_EQUAL(host_output[1], boost::make_tuple('z', 4, 3.14f));
  95. BOOST_CHECK_EQUAL(host_output[2], boost::make_tuple('z', 4, 3.14f));
  96. BOOST_CHECK_EQUAL(host_output[3], boost::make_tuple('z', 4, 3.14f));
  97. BOOST_CHECK_EQUAL(host_output[4], boost::make_tuple('z', 4, 3.14f));
  98. }
  99. #ifndef BOOST_COMPUTE_NO_VARIADIC_TEMPLATES
  100. BOOST_AUTO_TEST_CASE(variadic_tuple)
  101. {
  102. BOOST_CHECK_EQUAL(
  103. (compute::type_name<boost::tuple<char, short, int, float> >()),
  104. "boost_tuple_char_short_int_float_t"
  105. );
  106. }
  107. #endif // BOOST_COMPUTE_NO_VARIADIC_TEMPLATES
  108. #ifndef BOOST_COMPUTE_NO_STD_TUPLE
  109. BOOST_AUTO_TEST_CASE(std_tuple)
  110. {
  111. BOOST_CHECK_EQUAL(
  112. (compute::type_name<std::tuple<char, short, int, float>>()),
  113. "std_tuple_char_short_int_float_t"
  114. );
  115. }
  116. #endif // BOOST_COMPUTE_NO_STD_TUPLE
  117. BOOST_AUTO_TEST_SUITE_END()