#include #include #include #include template struct is_even { __host__ __device__ bool operator()(T x) const { return ((int) x % 2) == 0; } }; template void TestIsPartitionedSimple(void) { typedef typename Vector::value_type T; Vector v(4); v[0] = 1; v[1] = 1; v[2] = 1; v[3] = 0; // empty partition ASSERT_EQUAL_QUIET(true, thrust::is_partitioned(v.begin(), v.begin(), thrust::identity())); // one element true partition ASSERT_EQUAL_QUIET(true, thrust::is_partitioned(v.begin(), v.begin() + 1, thrust::identity())); // just true partition ASSERT_EQUAL_QUIET(true, thrust::is_partitioned(v.begin(), v.begin() + 2, thrust::identity())); // both true & false partitions ASSERT_EQUAL_QUIET(true, thrust::is_partitioned(v.begin(), v.end(), thrust::identity())); // one element false partition ASSERT_EQUAL_QUIET(true, thrust::is_partitioned(v.begin() + 3, v.end(), thrust::identity())); v[0] = 1; v[1] = 0; v[2] = 1; v[3] = 1; // not partitioned ASSERT_EQUAL_QUIET(false, thrust::is_partitioned(v.begin(), v.end(), thrust::identity())); } DECLARE_VECTOR_UNITTEST(TestIsPartitionedSimple); template void TestIsPartitioned(void) { typedef typename Vector::value_type T; const size_t n = (1 << 16) + 13; Vector v = unittest::random_integers(n); v[0] = 1; v[1] = 0; ASSERT_EQUAL(false, thrust::is_partitioned(v.begin(), v.end(), is_even())); thrust::partition(v.begin(), v.end(), is_even()); ASSERT_EQUAL(true, thrust::is_partitioned(v.begin(), v.end(), is_even())); } DECLARE_INTEGRAL_VECTOR_UNITTEST(TestIsPartitioned); template bool is_partitioned(my_system &system, InputIterator /*first*/, InputIterator, Predicate) { system.validate_dispatch(); return false; } void TestIsPartitionedDispatchExplicit() { thrust::device_vector vec(1); my_system sys(0); thrust::is_partitioned(sys, vec.begin(), vec.end(), 0); ASSERT_EQUAL(true, sys.is_valid()); } DECLARE_UNITTEST(TestIsPartitionedDispatchExplicit); template bool is_partitioned(my_tag, InputIterator first, InputIterator, Predicate) { *first = 13; return false; } void TestIsPartitionedDispatchImplicit() { thrust::device_vector vec(1); thrust::is_partitioned(thrust::retag(vec.begin()), thrust::retag(vec.end()), 0); ASSERT_EQUAL(13, vec.front()); } DECLARE_UNITTEST(TestIsPartitionedDispatchImplicit);