#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static_assert(thrust::is_contiguous_iterator_v); static_assert(thrust::is_contiguous_iterator_v); static_assert(thrust::is_contiguous_iterator_v); static_assert(thrust::is_contiguous_iterator_v); static_assert(!thrust::is_contiguous_iterator_v::iterator>); template _CCCL_HOST void test_is_contiguous_iterator() { static_assert(thrust::is_contiguous_iterator_v); static_assert(thrust::is_contiguous_iterator_v); static_assert(thrust::is_contiguous_iterator_v>); static_assert(thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::reverse_iterator>); static_assert(thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v::iterator>); static_assert(!thrust::is_contiguous_iterator_v>); static_assert(!thrust::is_contiguous_iterator_v>); } DECLARE_GENERIC_UNITTEST(test_is_contiguous_iterator); template _CCCL_HOST void test_is_contiguous_iterator_cvref() { static_assert(thrust::is_contiguous_iterator_v); static_assert(thrust::is_contiguous_iterator_v); static_assert(thrust::is_contiguous_iterator_v); static_assert(thrust::is_contiguous_iterator_v); static_assert(thrust::is_contiguous_iterator_v); static_assert(!thrust::is_contiguous_iterator_v::iterator const>); static_assert(!thrust::is_contiguous_iterator_v::iterator volatile>); static_assert(!thrust::is_contiguous_iterator_v::iterator&>); static_assert(!thrust::is_contiguous_iterator_v::iterator const&>); static_assert(!thrust::is_contiguous_iterator_v::iterator volatile&>); } DECLARE_GENERIC_UNITTEST(test_is_contiguous_iterator_cvref); template _CCCL_HOST void test_is_contiguous_iterator_vectors() { static_assert(thrust::is_contiguous_iterator_v); } DECLARE_VECTOR_UNITTEST(test_is_contiguous_iterator_vectors); struct expect_pointer {}; struct expect_passthrough {}; template struct check_unwrapped_iterator { using unwrapped_t = ::cuda::std::remove_reference_t()))>; static constexpr bool value = std::is_same_v ? std::is_same_v : std::is_same_v; }; template void test_try_unwrap_contiguous_iterator() { // Raw pointers should pass whether expecting pointers or passthrough. static_assert(check_unwrapped_iterator::value); static_assert(check_unwrapped_iterator::value); static_assert(check_unwrapped_iterator::value); static_assert(check_unwrapped_iterator::value); static_assert(check_unwrapped_iterator, T*, expect_pointer>::value); static_assert(check_unwrapped_iterator, T const*, expect_pointer>::value); static_assert(check_unwrapped_iterator::iterator, T*, expect_pointer>::value); static_assert(check_unwrapped_iterator::reverse_iterator, T*, expect_passthrough>::value); static_assert(check_unwrapped_iterator::iterator, T*, expect_pointer>::value); static_assert(check_unwrapped_iterator::iterator, T const*, expect_pointer>::value); static_assert(check_unwrapped_iterator::iterator, T*, expect_passthrough>::value); static_assert(check_unwrapped_iterator::iterator, T*, expect_passthrough>::value); static_assert(check_unwrapped_iterator::iterator, T*, expect_passthrough>::value); static_assert(check_unwrapped_iterator::iterator, T*, expect_passthrough>::value); static_assert( check_unwrapped_iterator::iterator, std::pair*, expect_passthrough>::value); static_assert( check_unwrapped_iterator::iterator, std::pair*, expect_passthrough>::value); static_assert(check_unwrapped_iterator::iterator, T*, expect_passthrough>::value); static_assert(check_unwrapped_iterator::iterator, T*, expect_passthrough>::value); static_assert( check_unwrapped_iterator::iterator, std::pair*, expect_passthrough>:: value); static_assert(check_unwrapped_iterator::iterator, std::pair*, expect_passthrough>::value); static_assert(check_unwrapped_iterator, T*, expect_passthrough>::value); static_assert(check_unwrapped_iterator, void, expect_passthrough>::value); } DECLARE_GENERIC_UNITTEST(test_try_unwrap_contiguous_iterator);