test_count.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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 TestCount
  11. #include <boost/test/unit_test.hpp>
  12. #include <string>
  13. #include <boost/compute/command_queue.hpp>
  14. #include <boost/compute/function.hpp>
  15. #include <boost/compute/lambda.hpp>
  16. #include <boost/compute/system.hpp>
  17. #include <boost/compute/algorithm/copy.hpp>
  18. #include <boost/compute/algorithm/count.hpp>
  19. #include <boost/compute/algorithm/count_if.hpp>
  20. #include <boost/compute/algorithm/iota.hpp>
  21. #include <boost/compute/container/vector.hpp>
  22. #include <boost/compute/iterator/constant_iterator.hpp>
  23. #include "context_setup.hpp"
  24. namespace bc = boost::compute;
  25. namespace compute = boost::compute;
  26. BOOST_AUTO_TEST_CASE(count_int)
  27. {
  28. int data[] = { 1, 2, 1, 2, 3 };
  29. bc::vector<int> vector(data, data + 5, queue);
  30. BOOST_CHECK_EQUAL(bc::count(vector.begin(), vector.end(), 1, queue), size_t(2));
  31. BOOST_CHECK_EQUAL(bc::count(vector.begin(), vector.end(), 2, queue), size_t(2));
  32. BOOST_CHECK_EQUAL(bc::count(vector.begin(), vector.end(), 3, queue), size_t(1));
  33. BOOST_CHECK_EQUAL(bc::count(vector.begin() + 1, vector.end(), 1, queue), size_t(1));
  34. BOOST_CHECK_EQUAL(bc::count(vector.begin() + 1, vector.end() - 1, 3, queue), size_t(0));
  35. BOOST_CHECK_EQUAL(bc::count(vector.begin() + 1, vector.end() - 1, 2, queue), size_t(2));
  36. }
  37. BOOST_AUTO_TEST_CASE(count_constant_int_range)
  38. {
  39. BOOST_CHECK_EQUAL(
  40. bc::count(bc::make_constant_iterator(18, 0),
  41. bc::make_constant_iterator(18, 5),
  42. 18,
  43. queue),
  44. size_t(5)
  45. );
  46. BOOST_CHECK_EQUAL(
  47. bc::count(bc::make_constant_iterator(19, 0),
  48. bc::make_constant_iterator(19, 5),
  49. 18,
  50. queue),
  51. size_t(0)
  52. );
  53. }
  54. BOOST_AUTO_TEST_CASE(count_if_greater_than_two)
  55. {
  56. float data[] = { 1.0f, 2.5f, -1.0f, 3.0f, 5.0f, -8.0f };
  57. bc::vector<float> vector(data, data + 5, queue);
  58. BOOST_CHECK_EQUAL(
  59. bc::count_if(vector.begin(), vector.end(), bc::_1 > 2.0f, queue),
  60. size_t(3)
  61. );
  62. }
  63. BOOST_AUTO_TEST_CASE(count_int4)
  64. {
  65. int data[] = { 1, 2, 3, 4,
  66. 4, 5, 6, 7,
  67. 7, 8, 9, 1,
  68. 1, 2, 3, 4,
  69. 4, 5, 6, 7,
  70. 0, 3, 2, 2 };
  71. bc::vector<bc::int4_> vector(reinterpret_cast<bc::int4_ *>(data),
  72. reinterpret_cast<bc::int4_ *>(data) + 6,
  73. queue);
  74. BOOST_CHECK_EQUAL(vector.size(), size_t(6));
  75. BOOST_CHECK_EQUAL(
  76. bc::count(vector.begin(), vector.end(), bc::int4_(1, 2, 3, 4), queue),
  77. size_t(2)
  78. );
  79. BOOST_CHECK_EQUAL(
  80. bc::count(vector.begin(), vector.end(), bc::int4_(4, 5, 6, 7), queue),
  81. size_t(2)
  82. );
  83. BOOST_CHECK_EQUAL(
  84. bc::count(vector.begin(), vector.end(), bc::int4_(7, 8, 9, 1), queue),
  85. size_t(1)
  86. );
  87. BOOST_CHECK_EQUAL(
  88. bc::count(vector.begin(), vector.end(), bc::int4_(0, 3, 2, 2), queue),
  89. size_t(1)
  90. );
  91. BOOST_CHECK_EQUAL(
  92. bc::count(vector.begin(), vector.end(), bc::int4_(3, 4, 4, 5), queue),
  93. size_t(0)
  94. );
  95. BOOST_CHECK_EQUAL(
  96. bc::count(vector.begin(), vector.end(), bc::int4_(1, 2, 3, 0), queue),
  97. size_t(0)
  98. );
  99. BOOST_CHECK_EQUAL(
  100. bc::count(vector.begin(), vector.end(), bc::int4_(1, 9, 8, 7), queue),
  101. size_t(0)
  102. );
  103. }
  104. BOOST_AUTO_TEST_CASE(count_newlines)
  105. {
  106. std::string string = "abcdefg\nhijklmn\nopqrs\ntuv\nwxyz\n";
  107. compute::vector<char> data(string.size(), context);
  108. compute::copy(string.begin(), string.end(), data.begin(), queue);
  109. BOOST_CHECK_EQUAL(
  110. compute::count(data.begin(), data.end(), '\n', queue),
  111. size_t(5)
  112. );
  113. }
  114. BOOST_AUTO_TEST_CASE(count_uchar)
  115. {
  116. using boost::compute::uchar_;
  117. unsigned char data[] = { 0x00, 0x10, 0x2F, 0x10, 0x01, 0x00, 0x01, 0x00 };
  118. compute::vector<uchar_> vector(8, context);
  119. compute::copy(data, data + 8, vector.begin(), queue);
  120. BOOST_CHECK_EQUAL(
  121. compute::count(vector.begin(), vector.end(), 0x00, queue),
  122. size_t(3)
  123. );
  124. BOOST_CHECK_EQUAL(
  125. compute::count(vector.begin(), vector.end(), 0x10, queue),
  126. size_t(2)
  127. );
  128. BOOST_CHECK_EQUAL(
  129. compute::count(vector.begin(), vector.end(), 0x2F, queue),
  130. size_t(1)
  131. );
  132. BOOST_CHECK_EQUAL(
  133. compute::count(vector.begin(), vector.end(), 0x01, queue),
  134. size_t(2)
  135. );
  136. BOOST_CHECK_EQUAL(
  137. compute::count(vector.begin(), vector.end(), 0xFF, queue),
  138. size_t(0)
  139. );
  140. }
  141. BOOST_AUTO_TEST_CASE(count_vector_component)
  142. {
  143. int data[] = {
  144. 1, 2,
  145. 3, 4,
  146. 5, 6,
  147. 7, 8
  148. };
  149. using boost::compute::int2_;
  150. compute::vector<int2_> vector(4, context);
  151. compute::copy(
  152. reinterpret_cast<int2_ *>(data),
  153. reinterpret_cast<int2_ *>(data) + 4,
  154. vector.begin(),
  155. queue
  156. );
  157. using boost::compute::lambda::_1;
  158. using boost::compute::lambda::get;
  159. BOOST_CHECK_EQUAL(
  160. compute::count_if(vector.begin(), vector.end(), get<0>(_1) < 4, queue),
  161. size_t(2)
  162. );
  163. BOOST_CHECK_EQUAL(
  164. compute::count_if(vector.begin(), vector.end(), get<1>(_1) > 3, queue),
  165. size_t(3)
  166. );
  167. }
  168. BOOST_AUTO_TEST_CASE(count_if_odd)
  169. {
  170. compute::vector<int> vec(2048, context);
  171. compute::iota(vec.begin(), vec.end(), 0, queue);
  172. BOOST_COMPUTE_FUNCTION(bool, is_odd, (int x),
  173. {
  174. return x & 1;
  175. });
  176. BOOST_CHECK_EQUAL(
  177. compute::count_if(vec.begin(), vec.end(), is_odd, queue), vec.size() / 2
  178. );
  179. }
  180. BOOST_AUTO_TEST_CASE(count_if_with_reduce)
  181. {
  182. compute::vector<int> vec(2048, context);
  183. compute::iota(vec.begin(), vec.end(), 0, queue);
  184. using boost::compute::lambda::_1;
  185. BOOST_CHECK_EQUAL(
  186. compute::detail::count_if_with_reduce(
  187. vec.begin(), vec.end(), _1 > 1024, queue
  188. ),
  189. size_t(1023)
  190. );
  191. }
  192. BOOST_AUTO_TEST_SUITE_END()