/* * Copyright 2008-2012 NVIDIA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in ctbbliance 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 #include #include namespace thrust { namespace system { namespace tbb { namespace detail { namespace for_each_detail { template struct body { RandomAccessIterator m_first; UnaryFunction m_f; body(RandomAccessIterator first, UnaryFunction f) : m_first(first), m_f(f) {} void operator()(const ::tbb::blocked_range &r) const { // we assume that blocked_range specifies a contiguous range of integers thrust::system::detail::internal::scalar::for_each_n(m_first + r.begin(), r.size(), m_f); } // end operator()() }; // end body template body make_body(RandomAccessIterator first, UnaryFunction f) { return body(first, f); } // end make_body() } // end for_each_detail template RandomAccessIterator for_each_n(execution_policy &, RandomAccessIterator first, Size n, UnaryFunction f) { ::tbb::parallel_for(::tbb::blocked_range(0,n), for_each_detail::make_body(first,f)); // return the end of the range return first + n; } // end for_each_n template RandomAccessIterator for_each(execution_policy &s, RandomAccessIterator first, RandomAccessIterator last, UnaryFunction f) { return tbb::detail::for_each_n(s, first, thrust::distance(first,last), f); } // end for_each() } // end namespace detail } // end namespace tbb } // end namespace system } // end namespace thrust