2 * Copyright 2008-2012 NVIDIA Corporation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <thrust/detail/temporary_array.h>
20 #include <thrust/sequence.h>
21 #include <thrust/gather.h>
22 #include <thrust/detail/function.h>
34 template<typename DerivedPolicy, typename RandomAccessIterator>
35 struct temporary_indirect_permutation
38 typedef unsigned int size_type;
39 typedef thrust::detail::temporary_array<size_type, DerivedPolicy> array_type;
42 temporary_indirect_permutation(DerivedPolicy &exec, RandomAccessIterator first, RandomAccessIterator last)
46 m_permutation(0, m_exec, last - first)
48 // generate sorted index sequence
49 thrust::sequence(exec, m_permutation.begin(), m_permutation.end());
52 ~temporary_indirect_permutation()
54 // permute the source array using the indices
55 typedef typename thrust::iterator_value<RandomAccessIterator>::type value_type;
56 thrust::detail::temporary_array<value_type, DerivedPolicy> temp(m_exec, m_src_first, m_src_last);
57 thrust::gather(m_exec, m_permutation.begin(), m_permutation.end(), temp.begin(), m_src_first);
60 typedef typename array_type::iterator iterator;
64 return m_permutation.begin();
69 return m_permutation.end();
73 DerivedPolicy &m_exec;
74 RandomAccessIterator m_src_first, m_src_last;
75 thrust::detail::temporary_array<size_type, DerivedPolicy> m_permutation;
79 template<typename DerivedPolicy, typename RandomAccessIterator>
80 struct iterator_range_with_execution_policy
82 iterator_range_with_execution_policy(DerivedPolicy &exec, RandomAccessIterator first, RandomAccessIterator last)
83 : m_exec(exec), m_first(first), m_last(last)
86 typedef RandomAccessIterator iterator;
103 DerivedPolicy &m_exec;
104 RandomAccessIterator m_first, m_last;
108 template<typename Condition, typename DerivedPolicy, typename RandomAccessIterator>
109 struct conditional_temporary_indirect_permutation
110 : thrust::detail::eval_if<
112 thrust::detail::identity_<temporary_indirect_permutation<DerivedPolicy, RandomAccessIterator> >,
113 thrust::detail::identity_<iterator_range_with_execution_policy<DerivedPolicy, RandomAccessIterator> >
116 typedef typename thrust::detail::eval_if<
118 thrust::detail::identity_<temporary_indirect_permutation<DerivedPolicy, RandomAccessIterator> >,
119 thrust::detail::identity_<iterator_range_with_execution_policy<DerivedPolicy, RandomAccessIterator> >
122 conditional_temporary_indirect_permutation(DerivedPolicy &exec, RandomAccessIterator first, RandomAccessIterator last)
123 : super_t(exec, first, last)
128 template<typename DerivedPolicy, typename RandomAccessIterator, typename Compare>
129 struct temporary_indirect_ordering
130 : temporary_indirect_permutation<DerivedPolicy,RandomAccessIterator>
133 typedef temporary_indirect_permutation<DerivedPolicy,RandomAccessIterator> super_t;
136 temporary_indirect_ordering(DerivedPolicy &exec, RandomAccessIterator first, RandomAccessIterator last, Compare comp)
137 : super_t(exec, first, last),
143 RandomAccessIterator first;
145 thrust::detail::host_device_function<
150 compare(RandomAccessIterator first, Compare comp)
151 : first(first), comp(comp)
154 template<typename Integral>
156 bool operator()(Integral a, Integral b)
158 return comp(first[a], first[b]);
172 template<typename DerivedPolicy, typename RandomAccessIterator, typename Compare>
173 struct iterator_range_with_execution_policy_and_compare
174 : iterator_range_with_execution_policy<DerivedPolicy, RandomAccessIterator>
176 typedef iterator_range_with_execution_policy<DerivedPolicy, RandomAccessIterator> super_t;
178 iterator_range_with_execution_policy_and_compare(DerivedPolicy &exec, RandomAccessIterator first, RandomAccessIterator last, Compare comp)
179 : super_t(exec, first, last), m_comp(comp)
182 typedef Compare compare;
193 template<typename Condition, typename DerivedPolicy, typename RandomAccessIterator, typename Compare>
194 struct conditional_temporary_indirect_ordering
195 : thrust::detail::eval_if<
197 thrust::detail::identity_<temporary_indirect_ordering<DerivedPolicy, RandomAccessIterator, Compare> >,
198 thrust::detail::identity_<iterator_range_with_execution_policy_and_compare<DerivedPolicy, RandomAccessIterator, Compare> >
201 typedef typename thrust::detail::eval_if<
203 thrust::detail::identity_<temporary_indirect_ordering<DerivedPolicy, RandomAccessIterator, Compare> >,
204 thrust::detail::identity_<iterator_range_with_execution_policy_and_compare<DerivedPolicy, RandomAccessIterator, Compare> >
207 conditional_temporary_indirect_ordering(DerivedPolicy &exec, RandomAccessIterator first, RandomAccessIterator last, Compare comp)
208 : super_t(exec, first, last, comp)