#include #include #include #include static const size_t num_samples = 10000; template struct rebind_vector; template struct rebind_vector, U> { typedef typename thrust::detail::allocator_traits alloc_traits; typedef typename alloc_traits::template rebind_alloc new_alloc; typedef thrust::host_vector type; }; template struct rebind_vector, U> { typedef thrust::device_vector::other> type; }; template struct rebind_vector, U> { typedef thrust::universal_vector::other> type; }; #define BINARY_FUNCTIONAL_PLACEHOLDERS_TEST(name, reference_operator, functor) \ template \ void TestFunctionalPlaceholders##name(void) \ { \ typedef typename Vector::value_type T; \ typedef typename rebind_vector::type bool_vector; \ Vector lhs = unittest::random_samples(num_samples); \ Vector rhs = unittest::random_samples(num_samples); \ \ bool_vector reference(lhs.size()); \ thrust::transform(lhs.begin(), lhs.end(), rhs.begin(), reference.begin(), functor()); \ \ using namespace thrust::placeholders; \ bool_vector result(lhs.size()); \ thrust::transform(lhs.begin(), lhs.end(), rhs.begin(), result.begin(), _1 reference_operator _2); \ \ ASSERT_EQUAL(reference, result); \ } \ DECLARE_VECTOR_UNITTEST(TestFunctionalPlaceholders##name); BINARY_FUNCTIONAL_PLACEHOLDERS_TEST(LogicalAnd, &&, thrust::logical_and); BINARY_FUNCTIONAL_PLACEHOLDERS_TEST(LogicalOr, ||, thrust::logical_or); template void TestFunctionalPlaceholdersLogicalNot(void) { typedef typename Vector::value_type T; typedef typename rebind_vector::type bool_vector; Vector input = unittest::random_samples(num_samples); if(input.size() > 0) { // produce at least one true in the output input[0] = T(0); } // end if bool_vector reference(input.size()); thrust::transform(input.begin(), input.end(), reference.begin(), thrust::logical_not()); using namespace thrust::placeholders; bool_vector result(input.size()); thrust::transform(input.begin(), input.end(), result.begin(), !_1); ASSERT_EQUAL(reference, result); } DECLARE_INTEGRAL_VECTOR_UNITTEST(TestFunctionalPlaceholdersLogicalNot);