test_transform_iterator.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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 TestTransformIterator
  11. #include <boost/test/unit_test.hpp>
  12. #include <iterator>
  13. #include <boost/type_traits.hpp>
  14. #include <boost/static_assert.hpp>
  15. #include <boost/compute/types.hpp>
  16. #include <boost/compute/functional.hpp>
  17. #include <boost/compute/algorithm/copy.hpp>
  18. #include <boost/compute/container/vector.hpp>
  19. #include <boost/compute/iterator/buffer_iterator.hpp>
  20. #include <boost/compute/iterator/transform_iterator.hpp>
  21. #include "check_macros.hpp"
  22. #include "context_setup.hpp"
  23. BOOST_AUTO_TEST_CASE(value_type)
  24. {
  25. using boost::compute::float4_;
  26. BOOST_STATIC_ASSERT((
  27. boost::is_same<
  28. boost::compute::transform_iterator<
  29. boost::compute::buffer_iterator<float>,
  30. boost::compute::sqrt<float>
  31. >::value_type,
  32. float
  33. >::value
  34. ));
  35. BOOST_STATIC_ASSERT((
  36. boost::is_same<
  37. boost::compute::transform_iterator<
  38. boost::compute::buffer_iterator<float4_>,
  39. boost::compute::length<float4_>
  40. >::value_type,
  41. float
  42. >::value
  43. ));
  44. }
  45. BOOST_AUTO_TEST_CASE(base_type)
  46. {
  47. BOOST_STATIC_ASSERT((
  48. boost::is_same<
  49. boost::compute::transform_iterator<
  50. boost::compute::buffer_iterator<int>, boost::compute::abs<int>
  51. >::base_type,
  52. boost::compute::buffer_iterator<int>
  53. >::value
  54. ));
  55. }
  56. BOOST_AUTO_TEST_CASE(copy)
  57. {
  58. int data[] = { 1, -2, 3, -4, 5 };
  59. boost::compute::vector<int> a(data, data + 5, queue);
  60. boost::compute::vector<int> b(5, context);
  61. boost::compute::copy(
  62. boost::compute::make_transform_iterator(
  63. a.begin(),
  64. boost::compute::abs<int>()
  65. ),
  66. boost::compute::make_transform_iterator(
  67. a.end(),
  68. boost::compute::abs<int>()
  69. ),
  70. b.begin(),
  71. queue
  72. );
  73. CHECK_RANGE_EQUAL(int, 5, b, (1, 2, 3, 4, 5));
  74. }
  75. BOOST_AUTO_TEST_CASE(copy_abs_doctest)
  76. {
  77. int data[] = { -1, -2, -3, -4 };
  78. boost::compute::vector<int> input(data, data + 4, queue);
  79. boost::compute::vector<int> output(4, context);
  80. //! [copy_abs]
  81. // use abs() from boost.compute
  82. using boost::compute::abs;
  83. // copy the absolute value for each element in input to output
  84. boost::compute::copy(
  85. boost::compute::make_transform_iterator(input.begin(), abs<int>()),
  86. boost::compute::make_transform_iterator(input.end(), abs<int>()),
  87. output.begin(),
  88. queue
  89. );
  90. //! [copy_abs]
  91. CHECK_RANGE_EQUAL(int, 4, output, (1, 2, 3, 4));
  92. }
  93. BOOST_AUTO_TEST_SUITE_END()