/* * 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. */ #pragma once #include #include #include #include namespace thrust { namespace detail { template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9 > class tuple_of_iterator_references : public thrust::tuple { private: typedef thrust::tuple super_t; public: // allow implicit construction from tuple inline __host__ __device__ tuple_of_iterator_references(const super_t &other) : super_t(other) {} // allow assignment from tuples // XXX might be worthwhile to guard this with an enable_if is_assignable template inline __host__ __device__ tuple_of_iterator_references &operator=(const detail::cons &other) { super_t::operator=(other); return *this; } // allow assignment from pairs // XXX might be worthwhile to guard this with an enable_if is_assignable template inline __host__ __device__ tuple_of_iterator_references &operator=(const thrust::pair &other) { super_t::operator=(other); return *this; } // allow assignment from reference // XXX perhaps we should generalize to reference // we could captures reference this way template inline __host__ __device__ // XXX gcc-4.2 crashes on is_assignable // typename thrust::detail::enable_if< // thrust::detail::is_assignable< // super_t, // const thrust::tuple // >::value, // tuple_of_iterator_references & // >::type tuple_of_iterator_references & operator=(const thrust::reference, Pointer, Derived> &other) { typedef thrust::tuple tuple_type; // XXX perhaps this could be accelerated tuple_type other_tuple = other; super_t::operator=(other_tuple); return *this; } // duplicate thrust::tuple's constructors inline __host__ __device__ tuple_of_iterator_references() {} inline __host__ __device__ tuple_of_iterator_references(typename access_traits::parameter_type t0) : super_t(t0, static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type())) {} inline __host__ __device__ tuple_of_iterator_references(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1) : super_t(t0, t1, static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type())) {} inline __host__ __device__ tuple_of_iterator_references(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1, typename access_traits::parameter_type t2) : super_t(t0, t1, t2, static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type())) {} inline __host__ __device__ tuple_of_iterator_references(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1, typename access_traits::parameter_type t2, typename access_traits::parameter_type t3) : super_t(t0, t1, t2, t3, static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type())) {} inline __host__ __device__ tuple_of_iterator_references(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1, typename access_traits::parameter_type t2, typename access_traits::parameter_type t3, typename access_traits::parameter_type t4) : super_t(t0, t1, t2, t3, t4, static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type())) {} inline __host__ __device__ tuple_of_iterator_references(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1, typename access_traits::parameter_type t2, typename access_traits::parameter_type t3, typename access_traits::parameter_type t4, typename access_traits::parameter_type t5) : super_t(t0, t1, t2, t3, t4, t5, static_cast(null_type()), static_cast(null_type()), static_cast(null_type()), static_cast(null_type())) {} inline __host__ __device__ tuple_of_iterator_references(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1, typename access_traits::parameter_type t2, typename access_traits::parameter_type t3, typename access_traits::parameter_type t4, typename access_traits::parameter_type t5, typename access_traits::parameter_type t6) : super_t(t0, t1, t2, t3, t4, t5, t6, static_cast(null_type()), static_cast(null_type()), static_cast(null_type())) {} inline __host__ __device__ tuple_of_iterator_references(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1, typename access_traits::parameter_type t2, typename access_traits::parameter_type t3, typename access_traits::parameter_type t4, typename access_traits::parameter_type t5, typename access_traits::parameter_type t6, typename access_traits::parameter_type t7) : super_t(t0, t1, t2, t3, t4, t5, t6, t7, static_cast(null_type()), static_cast(null_type())) {} inline __host__ __device__ tuple_of_iterator_references(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1, typename access_traits::parameter_type t2, typename access_traits::parameter_type t3, typename access_traits::parameter_type t4, typename access_traits::parameter_type t5, typename access_traits::parameter_type t6, typename access_traits::parameter_type t7, typename access_traits::parameter_type t8) : super_t(t0, t1, t2, t3, t4, t5, t6, t7, t8, static_cast(null_type())) {} inline __host__ __device__ tuple_of_iterator_references(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1, typename access_traits::parameter_type t2, typename access_traits::parameter_type t3, typename access_traits::parameter_type t4, typename access_traits::parameter_type t5, typename access_traits::parameter_type t6, typename access_traits::parameter_type t7, typename access_traits::parameter_type t8, typename access_traits::parameter_type t9) : super_t(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) {} }; } // end detail } // end thrust