/* * 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 { // forward declaration of iterator_adaptor for iterator_adaptor_base below template class iterator_adaptor; namespace detail { // If T is use_default, return the result of invoking // DefaultNullaryFn, otherwise return T. // XXX rename to dflt_help template struct ia_dflt_help : thrust::detail::eval_if< thrust::detail::is_same::value , DefaultNullaryFn , thrust::detail::identity_ > { }; // end ia_dflt_help // A metafunction which computes an iterator_adaptor's base class, // a specialization of iterator_facade. template struct iterator_adaptor_base { typedef typename ia_dflt_help< Value, iterator_value >::type value; typedef typename ia_dflt_help< System, thrust::iterator_system >::type system; typedef typename ia_dflt_help< Traversal, thrust::iterator_traversal >::type traversal; typedef typename ia_dflt_help< Reference, thrust::detail::eval_if< thrust::detail::is_same::value, thrust::iterator_reference, thrust::detail::add_reference > >::type reference; typedef typename ia_dflt_help< Difference, iterator_difference >::type difference; typedef thrust::iterator_facade< Derived, value, system, traversal, reference, difference > type; }; // end iterator_adaptor_base } // end detail } // end thrust