| #include <unittest/unittest.h> |
|
|
| #include <thrust/detail/seq.h> |
| #include <thrust/system/cpp/detail/par.h> |
| #include <thrust/system/omp/detail/par.h> |
| #include <thrust/system/tbb/detail/par.h> |
|
|
| #if THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CUDA |
| #include <thrust/system/cuda/detail/par.h> |
| #endif |
|
|
| template<typename T> |
| struct test_allocator_t |
| { |
| }; |
|
|
| test_allocator_t<int> test_allocator = test_allocator_t<int>(); |
| const test_allocator_t<int> const_test_allocator = test_allocator_t<int>(); |
|
|
| struct test_memory_resource_t final : thrust::mr::memory_resource<> |
| { |
| void * do_allocate(std::size_t size, std::size_t) override |
| { |
| return reinterpret_cast<void *>(size); |
| } |
|
|
| void do_deallocate(void * ptr, std::size_t size, std::size_t) override |
| { |
| ASSERT_EQUAL(ptr, reinterpret_cast<void *>(size)); |
| } |
| } test_memory_resource; |
|
|
| template<typename Policy, template <typename> class CRTPBase> |
| struct policy_info |
| { |
| typedef Policy policy; |
|
|
| template<template <typename, template <typename> class> class Template, typename Argument> |
| struct apply_base_second |
| { |
| typedef Template<Argument, CRTPBase> type; |
| }; |
| }; |
|
|
| template<typename PolicyInfo> |
| struct TestAllocatorAttachment |
| { |
| template<typename Expected, typename T> |
| static void assert_correct(T) |
| { |
| ASSERT_EQUAL( |
| (thrust::detail::is_same< |
| T, |
| typename PolicyInfo::template apply_base_second< |
| thrust::detail::execute_with_allocator, |
| Expected |
| >::type |
| >::value), true); |
| } |
|
|
| template<typename ExpectedResource, typename T> |
| static void assert_npa_correct(T) |
| { |
| ASSERT_EQUAL( |
| (thrust::detail::is_same< |
| T, |
| typename PolicyInfo::template apply_base_second< |
| thrust::detail::execute_with_allocator, |
| thrust::mr::allocator< |
| thrust::detail::max_align_t, |
| ExpectedResource |
| > |
| >::type |
| >::value), true); |
| } |
|
|
| template<typename Policy> |
| void test_temporary_allocation_valid(Policy policy) |
| { |
| using thrust::detail::get_temporary_buffer; |
|
|
| return_temporary_buffer( |
| policy, |
| get_temporary_buffer<int>( |
| policy, |
| 123 |
| ).first, |
| 123 |
| ); |
| } |
|
|
| void operator()() |
| { |
| typename PolicyInfo::policy policy; |
|
|
| |
| assert_correct<test_allocator_t<int> >(policy(test_allocator_t<int>())); |
| assert_correct<test_allocator_t<int>&>(policy(test_allocator)); |
| assert_correct<test_allocator_t<int> >(policy(const_test_allocator)); |
|
|
| assert_npa_correct<test_memory_resource_t>(policy(&test_memory_resource)); |
|
|
| |
| |
| std::allocator<int> alloc; |
| const std::allocator<int> const_alloc; |
|
|
| test_temporary_allocation_valid(policy(std::allocator<int>())); |
| test_temporary_allocation_valid(policy(alloc)); |
| test_temporary_allocation_valid(policy(const_alloc)); |
| test_temporary_allocation_valid(policy(&test_memory_resource)); |
|
|
| #if THRUST_CPP_DIALECT >= 2011 |
| test_temporary_allocation_valid(policy(std::allocator<int>()).after(1)); |
| test_temporary_allocation_valid(policy(alloc).after(1)); |
| test_temporary_allocation_valid(policy(const_alloc).after(1)); |
| #endif |
| } |
| }; |
|
|
| typedef policy_info< |
| thrust::detail::seq_t, |
| thrust::system::detail::sequential::execution_policy |
| > sequential_info; |
| typedef policy_info< |
| thrust::system::cpp::detail::par_t, |
| thrust::system::cpp::detail::execution_policy |
| > cpp_par_info; |
| typedef policy_info< |
| thrust::system::omp::detail::par_t, |
| thrust::system::omp::detail::execution_policy |
| > omp_par_info; |
| typedef policy_info< |
| thrust::system::tbb::detail::par_t, |
| thrust::system::tbb::detail::execution_policy |
| > tbb_par_info; |
|
|
| #if THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CUDA |
| typedef policy_info< |
| thrust::system::cuda::detail::par_t, |
| thrust::cuda_cub::execute_on_stream_base |
| > cuda_par_info; |
| #endif |
|
|
| SimpleUnitTest< |
| TestAllocatorAttachment, |
| unittest::type_list< |
| sequential_info, |
| #if THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CUDA |
| cuda_par_info, |
| #endif |
| cpp_par_info, |
| omp_par_info, |
| tbb_par_info |
| > |
| > TestAllocatorAttachmentInstance; |
|
|