|
#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; |
|
|