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)