#include #include #include #include // ensure that we properly support thrust::discard_iterator from cuda::std void TestDiscardIteratorTraits() { using it = thrust::discard_iterator<>; using traits = cuda::std::iterator_traits; using category = thrust::detail::iterator_category_with_system_and_traversal<::cuda::std::random_access_iterator_tag, thrust::any_system_tag, thrust::random_access_traversal_tag>; static_assert(cuda::std::is_same_v); static_assert(cuda::std::is_same_v); static_assert(cuda::std::is_same_v); static_assert(cuda::std::is_same_v); static_assert(cuda::std::is_same_v); static_assert(cuda::std::is_same_v, thrust::random_access_traversal_tag>); static_assert(cuda::std::__has_random_access_traversal); static_assert(cuda::std::output_iterator); static_assert(cuda::std::input_iterator); static_assert(cuda::std::forward_iterator); static_assert(cuda::std::bidirectional_iterator); static_assert(cuda::std::random_access_iterator); static_assert(!cuda::std::contiguous_iterator); } DECLARE_UNITTEST(TestDiscardIteratorTraits); void TestDiscardIteratorIncrement() { thrust::discard_iterator<> lhs(0); thrust::discard_iterator<> rhs(0); ASSERT_EQUAL(0, lhs - rhs); lhs++; ASSERT_EQUAL(1, lhs - rhs); lhs++; lhs++; ASSERT_EQUAL(3, lhs - rhs); lhs += 5; ASSERT_EQUAL(8, lhs - rhs); lhs -= 10; ASSERT_EQUAL(-2, lhs - rhs); } DECLARE_UNITTEST(TestDiscardIteratorIncrement); static_assert(cuda::std::is_trivially_copy_constructible>::value); static_assert(cuda::std::is_trivially_copyable>::value); void TestDiscardIteratorComparison() { thrust::discard_iterator<> iter1(0); thrust::discard_iterator<> iter2(0); ASSERT_EQUAL(0, iter1 - iter2); ASSERT_EQUAL(true, iter1 == iter2); iter1++; ASSERT_EQUAL(1, iter1 - iter2); ASSERT_EQUAL(false, iter1 == iter2); iter2++; ASSERT_EQUAL(0, iter1 - iter2); ASSERT_EQUAL(true, iter1 == iter2); iter1 += 100; iter2 += 100; ASSERT_EQUAL(0, iter1 - iter2); ASSERT_EQUAL(true, iter1 == iter2); } DECLARE_UNITTEST(TestDiscardIteratorComparison); void TestMakeDiscardIterator() { thrust::discard_iterator<> iter0 = thrust::make_discard_iterator(13); *iter0 = 7; thrust::discard_iterator<> iter1 = thrust::make_discard_iterator(7); *iter1 = 13; ASSERT_EQUAL(6, iter0 - iter1); } DECLARE_UNITTEST(TestMakeDiscardIterator); void TestZippedDiscardIterator() { using IteratorTuple1 = cuda::std::tuple>; using ZipIterator1 = thrust::zip_iterator; IteratorTuple1 t = cuda::std::tuple(thrust::make_discard_iterator()); ZipIterator1 z_iter1_first = thrust::make_zip_iterator(t); ZipIterator1 z_iter1_last = z_iter1_first + 10; for (; z_iter1_first != z_iter1_last; ++z_iter1_first) { ; } ASSERT_EQUAL(10, cuda::std::get<0>(z_iter1_first.get_iterator_tuple()) - thrust::make_discard_iterator()); using IteratorTuple2 = cuda::std::tuple>; using ZipIterator2 = thrust::zip_iterator; ZipIterator2 z_iter_first = thrust::make_zip_iterator((int*) nullptr, thrust::make_discard_iterator()); ZipIterator2 z_iter_last = z_iter_first + 10; for (; z_iter_first != z_iter_last; ++z_iter_first) { ; } ASSERT_EQUAL(10, cuda::std::get<1>(z_iter_first.get_iterator_tuple()) - thrust::make_discard_iterator()); } DECLARE_UNITTEST(TestZippedDiscardIterator);