Spaces:
Runtime error
Runtime error
| template <typename T> | |
| struct my_allocator_with_custom_construct1 | |
| : thrust::device_malloc_allocator<T> | |
| { | |
| __host__ __device__ | |
| my_allocator_with_custom_construct1() | |
| {} | |
| __host__ __device__ | |
| void construct(T *p) | |
| { | |
| *p = 13; | |
| } | |
| }; | |
| template <typename T> | |
| void TestAllocatorCustomDefaultConstruct(size_t n) | |
| { | |
| thrust::device_vector<T> ref(n, 13); | |
| thrust::device_vector<T, my_allocator_with_custom_construct1<T> > vec(n); | |
| ASSERT_EQUAL_QUIET(ref, vec); | |
| } | |
| DECLARE_VARIABLE_UNITTEST(TestAllocatorCustomDefaultConstruct); | |
| template <typename T> | |
| struct my_allocator_with_custom_construct2 | |
| : thrust::device_malloc_allocator<T> | |
| { | |
| __host__ __device__ | |
| my_allocator_with_custom_construct2() | |
| {} | |
| template <typename Arg> | |
| __host__ __device__ | |
| void construct(T *p, const Arg &) | |
| { | |
| *p = 13; | |
| } | |
| }; | |
| template <typename T> | |
| void TestAllocatorCustomCopyConstruct(size_t n) | |
| { | |
| thrust::device_vector<T> ref(n, 13); | |
| thrust::device_vector<T> copy_from(n, 7); | |
| thrust::device_vector<T, my_allocator_with_custom_construct2<T> > | |
| vec(copy_from.begin(), copy_from.end()); | |
| ASSERT_EQUAL_QUIET(ref, vec); | |
| } | |
| DECLARE_VARIABLE_UNITTEST(TestAllocatorCustomCopyConstruct); | |
| template <typename T> | |
| struct my_allocator_with_custom_destroy | |
| { | |
| typedef T value_type; | |
| typedef T & reference; | |
| typedef const T & const_reference; | |
| static bool g_state; | |
| __host__ | |
| my_allocator_with_custom_destroy(){} | |
| __host__ | |
| my_allocator_with_custom_destroy(const my_allocator_with_custom_destroy &other) | |
| : use_me_to_alloc(other.use_me_to_alloc) | |
| {} | |
| __host__ | |
| ~my_allocator_with_custom_destroy(){} | |
| __host__ __device__ | |
| void destroy(T *) | |
| { | |
| g_state = true; | |
| } | |
| value_type *allocate(std::ptrdiff_t n) | |
| { | |
| return use_me_to_alloc.allocate(n); | |
| } | |
| void deallocate(value_type *ptr, std::ptrdiff_t n) | |
| { | |
| use_me_to_alloc.deallocate(ptr,n); | |
| } | |
| bool operator==(const my_allocator_with_custom_destroy &) const | |
| { | |
| return true; | |
| } | |
| bool operator!=(const my_allocator_with_custom_destroy &other) const | |
| { | |
| return !(*this == other); | |
| } | |
| typedef thrust::detail::true_type is_always_equal; | |
| // use composition rather than inheritance | |
| // to avoid inheriting std::allocator's member | |
| // function destroy | |
| std::allocator<T> use_me_to_alloc; | |
| }; | |
| template <typename T> | |
| bool my_allocator_with_custom_destroy<T>::g_state = false; | |
| template <typename T> | |
| void TestAllocatorCustomDestroy(size_t n) | |
| { | |
| { | |
| thrust::cpp::vector<T, my_allocator_with_custom_destroy<T> > vec(n); | |
| } // destroy everything | |
| if (0 < n) | |
| ASSERT_EQUAL(true, my_allocator_with_custom_destroy<T>::g_state); | |
| } | |
| DECLARE_VARIABLE_UNITTEST(TestAllocatorCustomDestroy); | |
| template <typename T> | |
| struct my_minimal_allocator | |
| { | |
| typedef T value_type; | |
| // XXX ideally, we shouldn't require | |
| // these two typedefs | |
| typedef T & reference; | |
| typedef const T & const_reference; | |
| __host__ | |
| my_minimal_allocator(){} | |
| __host__ | |
| my_minimal_allocator(const my_minimal_allocator &other) | |
| : use_me_to_alloc(other.use_me_to_alloc) | |
| {} | |
| __host__ | |
| ~my_minimal_allocator(){} | |
| value_type *allocate(std::ptrdiff_t n) | |
| { | |
| return use_me_to_alloc.allocate(n); | |
| } | |
| void deallocate(value_type *ptr, std::ptrdiff_t n) | |
| { | |
| use_me_to_alloc.deallocate(ptr,n); | |
| } | |
| std::allocator<T> use_me_to_alloc; | |
| }; | |
| template <typename T> | |
| void TestAllocatorMinimal(size_t n) | |
| { | |
| thrust::cpp::vector<int, my_minimal_allocator<int> > vec(n, 13); | |
| // XXX copy to h_vec because ASSERT_EQUAL doesn't know about cpp::vector | |
| thrust::host_vector<int> h_vec(vec.begin(), vec.end()); | |
| thrust::host_vector<int> ref(n, 13); | |
| ASSERT_EQUAL(ref, h_vec); | |
| } | |
| DECLARE_VARIABLE_UNITTEST(TestAllocatorMinimal); | |
| void TestAllocatorTraitsRebind() | |
| { | |
| ASSERT_EQUAL( | |
| (thrust::detail::is_same< | |
| typename thrust::detail::allocator_traits< | |
| thrust::device_malloc_allocator<int> | |
| >::template rebind_traits<float>::other, | |
| typename thrust::detail::allocator_traits< | |
| thrust::device_malloc_allocator<float> | |
| > | |
| >::value), | |
| true | |
| ); | |
| ASSERT_EQUAL( | |
| (thrust::detail::is_same< | |
| typename thrust::detail::allocator_traits< | |
| my_minimal_allocator<int> | |
| >::template rebind_traits<float>::other, | |
| typename thrust::detail::allocator_traits< | |
| my_minimal_allocator<float> | |
| > | |
| >::value), | |
| true | |
| ); | |
| } | |
| DECLARE_UNITTEST(TestAllocatorTraitsRebind); | |
| void TestAllocatorTraitsRebindCpp11() | |
| { | |
| ASSERT_EQUAL( | |
| (thrust::detail::is_same< | |
| typename thrust::detail::allocator_traits< | |
| thrust::device_malloc_allocator<int> | |
| >::template rebind_alloc<float>, | |
| thrust::device_malloc_allocator<float> | |
| >::value), | |
| true | |
| ); | |
| ASSERT_EQUAL( | |
| (thrust::detail::is_same< | |
| typename thrust::detail::allocator_traits< | |
| my_minimal_allocator<int> | |
| >::template rebind_alloc<float>, | |
| my_minimal_allocator<float> | |
| >::value), | |
| true | |
| ); | |
| ASSERT_EQUAL( | |
| (thrust::detail::is_same< | |
| typename thrust::detail::allocator_traits< | |
| thrust::device_malloc_allocator<int> | |
| >::template rebind_traits<float>, | |
| typename thrust::detail::allocator_traits< | |
| thrust::device_malloc_allocator<float> | |
| > | |
| >::value), | |
| true | |
| ); | |
| ASSERT_EQUAL( | |
| (thrust::detail::is_same< | |
| typename thrust::detail::allocator_traits< | |
| my_minimal_allocator<int> | |
| >::template rebind_traits<float>, | |
| typename thrust::detail::allocator_traits< | |
| my_minimal_allocator<float> | |
| > | |
| >::value), | |
| true | |
| ); | |
| } | |
| DECLARE_UNITTEST(TestAllocatorTraitsRebindCpp11); | |