/* * Copyright 2008-2012 NVIDIA Corporation * * 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 namespace thrust { namespace detail { namespace allocator_traits_detail { template struct construct1_via_allocator { Allocator &a; construct1_via_allocator(Allocator &a) : a(a) {} template inline __host__ __device__ void operator()(T &x) { allocator_traits::construct(a, &x); } }; template struct needs_default_construct_via_allocator : has_member_construct1< Allocator, T > {}; // we know that std::allocator::construct's only effect is to call T's // default constructor, so we needn't use it for default construction template struct needs_default_construct_via_allocator, T> : thrust::detail::false_type {}; template typename enable_if< needs_default_construct_via_allocator< Allocator, typename pointer_element::type >::value >::type default_construct_range(Allocator &a, Pointer p, Size n) { thrust::for_each_n(allocator_system::get(a), p, n, construct1_via_allocator(a)); } template typename disable_if< needs_default_construct_via_allocator< Allocator, typename pointer_element::type >::value >::type default_construct_range(Allocator &a, Pointer p, Size n) { thrust::uninitialized_fill_n(allocator_system::get(a), p, n, typename pointer_element::type()); } } // end allocator_traits_detail template void default_construct_range(Allocator &a, Pointer p, Size n) { return allocator_traits_detail::default_construct_range(a,p,n); } } // end detail } // end thrust