//---------------------------------------------------------------------------// // Copyright (c) 2013 Kyle Lutz // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // // See http://boostorg.github.com/compute for more information. //---------------------------------------------------------------------------// #define BOOST_TEST_MODULE TestCount #include #include #include #include #include #include #include #include #include #include #include #include #include "context_setup.hpp" namespace bc = boost::compute; namespace compute = boost::compute; BOOST_AUTO_TEST_CASE(count_int) { int data[] = { 1, 2, 1, 2, 3 }; bc::vector vector(data, data + 5, queue); BOOST_CHECK_EQUAL(bc::count(vector.begin(), vector.end(), 1, queue), size_t(2)); BOOST_CHECK_EQUAL(bc::count(vector.begin(), vector.end(), 2, queue), size_t(2)); BOOST_CHECK_EQUAL(bc::count(vector.begin(), vector.end(), 3, queue), size_t(1)); BOOST_CHECK_EQUAL(bc::count(vector.begin() + 1, vector.end(), 1, queue), size_t(1)); BOOST_CHECK_EQUAL(bc::count(vector.begin() + 1, vector.end() - 1, 3, queue), size_t(0)); BOOST_CHECK_EQUAL(bc::count(vector.begin() + 1, vector.end() - 1, 2, queue), size_t(2)); } BOOST_AUTO_TEST_CASE(count_constant_int_range) { BOOST_CHECK_EQUAL( bc::count(bc::make_constant_iterator(18, 0), bc::make_constant_iterator(18, 5), 18, queue), size_t(5) ); BOOST_CHECK_EQUAL( bc::count(bc::make_constant_iterator(19, 0), bc::make_constant_iterator(19, 5), 18, queue), size_t(0) ); } BOOST_AUTO_TEST_CASE(count_if_greater_than_two) { float data[] = { 1.0f, 2.5f, -1.0f, 3.0f, 5.0f, -8.0f }; bc::vector vector(data, data + 5, queue); BOOST_CHECK_EQUAL( bc::count_if(vector.begin(), vector.end(), bc::_1 > 2.0f, queue), size_t(3) ); } BOOST_AUTO_TEST_CASE(count_int4) { int data[] = { 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 1, 1, 2, 3, 4, 4, 5, 6, 7, 0, 3, 2, 2 }; bc::vector vector(reinterpret_cast(data), reinterpret_cast(data) + 6, queue); BOOST_CHECK_EQUAL(vector.size(), size_t(6)); BOOST_CHECK_EQUAL( bc::count(vector.begin(), vector.end(), bc::int4_(1, 2, 3, 4), queue), size_t(2) ); BOOST_CHECK_EQUAL( bc::count(vector.begin(), vector.end(), bc::int4_(4, 5, 6, 7), queue), size_t(2) ); BOOST_CHECK_EQUAL( bc::count(vector.begin(), vector.end(), bc::int4_(7, 8, 9, 1), queue), size_t(1) ); BOOST_CHECK_EQUAL( bc::count(vector.begin(), vector.end(), bc::int4_(0, 3, 2, 2), queue), size_t(1) ); BOOST_CHECK_EQUAL( bc::count(vector.begin(), vector.end(), bc::int4_(3, 4, 4, 5), queue), size_t(0) ); BOOST_CHECK_EQUAL( bc::count(vector.begin(), vector.end(), bc::int4_(1, 2, 3, 0), queue), size_t(0) ); BOOST_CHECK_EQUAL( bc::count(vector.begin(), vector.end(), bc::int4_(1, 9, 8, 7), queue), size_t(0) ); } BOOST_AUTO_TEST_CASE(count_newlines) { std::string string = "abcdefg\nhijklmn\nopqrs\ntuv\nwxyz\n"; compute::vector data(string.size(), context); compute::copy(string.begin(), string.end(), data.begin(), queue); BOOST_CHECK_EQUAL( compute::count(data.begin(), data.end(), '\n', queue), size_t(5) ); } BOOST_AUTO_TEST_CASE(count_uchar) { using boost::compute::uchar_; unsigned char data[] = { 0x00, 0x10, 0x2F, 0x10, 0x01, 0x00, 0x01, 0x00 }; compute::vector vector(8, context); compute::copy(data, data + 8, vector.begin(), queue); BOOST_CHECK_EQUAL( compute::count(vector.begin(), vector.end(), 0x00, queue), size_t(3) ); BOOST_CHECK_EQUAL( compute::count(vector.begin(), vector.end(), 0x10, queue), size_t(2) ); BOOST_CHECK_EQUAL( compute::count(vector.begin(), vector.end(), 0x2F, queue), size_t(1) ); BOOST_CHECK_EQUAL( compute::count(vector.begin(), vector.end(), 0x01, queue), size_t(2) ); BOOST_CHECK_EQUAL( compute::count(vector.begin(), vector.end(), 0xFF, queue), size_t(0) ); } BOOST_AUTO_TEST_CASE(count_vector_component) { int data[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; using boost::compute::int2_; compute::vector vector(4, context); compute::copy( reinterpret_cast(data), reinterpret_cast(data) + 4, vector.begin(), queue ); using boost::compute::lambda::_1; using boost::compute::lambda::get; BOOST_CHECK_EQUAL( compute::count_if(vector.begin(), vector.end(), get<0>(_1) < 4, queue), size_t(2) ); BOOST_CHECK_EQUAL( compute::count_if(vector.begin(), vector.end(), get<1>(_1) > 3, queue), size_t(3) ); } BOOST_AUTO_TEST_CASE(count_if_odd) { compute::vector vec(2048, context); compute::iota(vec.begin(), vec.end(), 0, queue); BOOST_COMPUTE_FUNCTION(bool, is_odd, (int x), { return x & 1; }); BOOST_CHECK_EQUAL( compute::count_if(vec.begin(), vec.end(), is_odd, queue), vec.size() / 2 ); } BOOST_AUTO_TEST_CASE(count_if_with_reduce) { compute::vector vec(2048, context); compute::iota(vec.begin(), vec.end(), 0, queue); using boost::compute::lambda::_1; BOOST_CHECK_EQUAL( compute::detail::count_if_with_reduce( vec.begin(), vec.end(), _1 > 1024, queue ), size_t(1023) ); } BOOST_AUTO_TEST_SUITE_END()