/* * Copyright 2008-2013 NVIDIA Corporation * Modifications Copyright© 2025 Advanced Micro Devices, Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "test_param_fixtures.hpp" #include "test_utils.hpp" #if !_THRUST_HAS_DEVICE_SYSTEM_STD # include # include #endif TESTS_DEFINE(IsContiguousIteratorTests, FullTestsParams); THRUST_STATIC_ASSERT((thrust::is_contiguous_iterator::value)); THRUST_STATIC_ASSERT((thrust::is_contiguous_iterator::value)); THRUST_STATIC_ASSERT((thrust::is_contiguous_iterator::value)); THRUST_STATIC_ASSERT((thrust::is_contiguous_iterator::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); TYPED_TEST(IsContiguousIteratorTests, test_is_contiguous_iterator) { using Vector = typename TestFixture::input_type; using T = typename Vector::value_type; SCOPED_TRACE(testing::Message() << "with device_id= " << test::set_device_from_ctest()); THRUST_STATIC_ASSERT((thrust::is_contiguous_iterator::value)); THRUST_STATIC_ASSERT((thrust::is_contiguous_iterator::value)); THRUST_STATIC_ASSERT((thrust::is_contiguous_iterator>::value)); THRUST_STATIC_ASSERT((thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::reverse_iterator>::value)); THRUST_STATIC_ASSERT((thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator::iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator>::value)); THRUST_STATIC_ASSERT((!thrust::is_contiguous_iterator>::value)); } TYPED_TEST(IsContiguousIteratorTests, test_is_contiguous_iterator_vectors) { using Vector = typename TestFixture::input_type; SCOPED_TRACE(testing::Message() << "with device_id= " << test::set_device_from_ctest()); THRUST_STATIC_ASSERT((thrust::is_contiguous_iterator::value)); } struct expect_pointer {}; struct expect_passthrough {}; template struct check_unwrapped_iterator { using unwrapped_t = _THRUST_STD::remove_reference_t()))>; static constexpr bool value = std::is_same::value ? std::is_same::value : std::is_same::value; }; TYPED_TEST(IsContiguousIteratorTests, test_try_unwrap_contiguous_iterator) { using Vector = typename TestFixture::input_type; using T = typename Vector::value_type; SCOPED_TRACE(testing::Message() << "with device_id= " << test::set_device_from_ctest()); // Raw pointers should pass whether expecting pointers or passthrough. THRUST_STATIC_ASSERT((check_unwrapped_iterator::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator, T*, expect_pointer>::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator, T const*, expect_pointer>::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator::iterator, T*, expect_pointer>::value)); THRUST_STATIC_ASSERT( (check_unwrapped_iterator::reverse_iterator, T*, expect_passthrough>::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator::iterator, T*, expect_pointer>::value)); THRUST_STATIC_ASSERT( (check_unwrapped_iterator::iterator, T const*, expect_pointer>::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator::iterator, T*, expect_passthrough>::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator::iterator, T*, expect_passthrough>::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator::iterator, T*, expect_passthrough>::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator::iterator, T*, expect_passthrough>::value)); THRUST_STATIC_ASSERT( (check_unwrapped_iterator::iterator, std::pair*, expect_passthrough>::value)); THRUST_STATIC_ASSERT(( check_unwrapped_iterator::iterator, std::pair*, expect_passthrough>::value)); THRUST_STATIC_ASSERT( (check_unwrapped_iterator::iterator, T*, expect_passthrough>::value)); THRUST_STATIC_ASSERT( (check_unwrapped_iterator::iterator, T*, expect_passthrough>::value)); THRUST_STATIC_ASSERT( (check_unwrapped_iterator::iterator, std::pair*, expect_passthrough>:: value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator::iterator, std::pair*, expect_passthrough>::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator, T*, expect_passthrough>::value)); THRUST_STATIC_ASSERT((check_unwrapped_iterator, void, expect_passthrough>::value)); }