#define CCCL_IGNORE_DEPRECATED_API #include #include #include #include #include #include #include // ensure that we properly support thrust::constant_iterator from cuda::std void TestConstantIteratorTraits() { using it = thrust::constant_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(TestConstantIteratorTraits); void TestConstantIteratorConstructFromConvertibleSystem() { thrust::constant_iterator default_system(13); thrust::constant_iterator host_system = default_system; ASSERT_EQUAL(*default_system, *host_system); thrust::constant_iterator device_system = default_system; ASSERT_EQUAL(*default_system, *device_system); } DECLARE_UNITTEST(TestConstantIteratorConstructFromConvertibleSystem); void TestConstantIteratorIncrement() { thrust::constant_iterator lhs(0, 0); thrust::constant_iterator rhs(0, 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(TestConstantIteratorIncrement); static_assert(cuda::std::is_trivially_copy_constructible>::value); static_assert(cuda::std::is_trivially_copyable>::value); void TestConstantIteratorIncrementBig() { long long int n = 10000000000ULL; thrust::constant_iterator begin(1); thrust::constant_iterator end = begin + n; ASSERT_EQUAL(cuda::std::distance(begin, end), n); } DECLARE_UNITTEST(TestConstantIteratorIncrementBig); void TestConstantIteratorComparison() { thrust::constant_iterator iter1(0); thrust::constant_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(TestConstantIteratorComparison); void TestMakeConstantIterator() { // test one argument version thrust::constant_iterator iter0 = thrust::make_constant_iterator(13); ASSERT_EQUAL(13, *iter0); // test two argument version thrust::constant_iterator iter1 = thrust::make_constant_iterator(13, 7); ASSERT_EQUAL(13, *iter1); ASSERT_EQUAL(7, iter1 - iter0); // ensure CTAD words thrust::constant_iterator deduced_iter{42}; static_assert(cuda::std::is_same_v>); ASSERT_EQUAL(42, *deduced_iter); } DECLARE_UNITTEST(TestMakeConstantIterator); template void TestConstantIteratorCopy() { using ValueType = typename Vector::value_type; using ConstIter = thrust::constant_iterator; Vector result(4); ConstIter first = thrust::make_constant_iterator(7); ConstIter last = first + result.size(); thrust::copy(first, last, result.begin()); Vector ref(4, 7); ASSERT_EQUAL(ref, result); }; DECLARE_VECTOR_UNITTEST(TestConstantIteratorCopy); template void TestConstantIteratorTransform() { using T = typename Vector::value_type; using ConstIter = thrust::constant_iterator; Vector result(4); ConstIter first1 = thrust::make_constant_iterator(7); ConstIter last1 = first1 + result.size(); ConstIter first2 = thrust::make_constant_iterator(3); thrust::transform(first1, last1, result.begin(), cuda::std::negate()); Vector ref(4, -7); ASSERT_EQUAL(ref, result); thrust::transform(first1, last1, first2, result.begin(), cuda::std::plus()); ref = Vector(4, 10); ASSERT_EQUAL(ref, result); }; DECLARE_VECTOR_UNITTEST(TestConstantIteratorTransform); void TestConstantIteratorReduce() { using T = int; using ConstIter = thrust::constant_iterator; ConstIter first = thrust::make_constant_iterator(7); ConstIter last = first + 4; T sum = thrust::reduce(first, last); ASSERT_EQUAL(sum, 4 * 7); }; DECLARE_UNITTEST(TestConstantIteratorReduce);