Spaces:
Runtime error
Runtime error
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 THRUST_FINAL : thrust::mr::memory_resource<> | |
{ | |
void * do_allocate(std::size_t size, std::size_t) THRUST_OVERRIDE | |
{ | |
return reinterpret_cast<void *>(size); | |
} | |
void do_deallocate(void * ptr, std::size_t size, std::size_t) THRUST_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; | |
// test correctness of attachment | |
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)); | |
// test whether the resulting policy is actually usable | |
// a real allocator is necessary here, unlike above | |
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)); | |
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)); | |
} | |
}; | |
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; | |
typedef policy_info< | |
thrust::system::cuda::detail::par_t, | |
thrust::cuda_cub::execute_on_stream_base | |
> cuda_par_info; | |
SimpleUnitTest< | |
TestAllocatorAttachment, | |
unittest::type_list< | |
sequential_info, | |
cuda_par_info, | |
cpp_par_info, | |
omp_par_info, | |
tbb_par_info | |
> | |
> TestAllocatorAttachmentInstance; | |