1 /*
2  *  Copyright 2008-2013 NVIDIA Corporation
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 
17 #pragma once
18 
19 #include <thrust/detail/config.h>
20 #include <thrust/system/detail/generic/tag.h>
21 #include <thrust/pair.h>
22 
23 namespace thrust
24 {
25 namespace system
26 {
27 namespace detail
28 {
29 namespace generic
30 {
31 
32 
33 template<typename ExecutionPolicy,
34          typename InputIterator1,
35          typename InputIterator2,
36          typename OutputIterator>
37 __host__ __device__
38 OutputIterator set_difference(thrust::execution_policy<ExecutionPolicy> &exec,
39                               InputIterator1                             first1,
40                               InputIterator1                             last1,
41                               InputIterator2                             first2,
42                               InputIterator2                             last2,
43                               OutputIterator                             result);
44 
45 
46 // XXX it is an error to call this function; it has no implementation
47 template<typename ExecutionPolicy,
48          typename InputIterator1,
49          typename InputIterator2,
50          typename OutputIterator,
51          typename StrictWeakOrdering>
52 __host__ __device__
53 OutputIterator set_difference(thrust::execution_policy<ExecutionPolicy> &exec,
54                               InputIterator1                             first1,
55                               InputIterator1                             last1,
56                               InputIterator2                             first2,
57                               InputIterator2                             last2,
58                               OutputIterator                             result,
59                               StrictWeakOrdering                         comp);
60 
61 
62 template<typename ExecutionPolicy,
63          typename InputIterator1,
64          typename InputIterator2,
65          typename InputIterator3,
66          typename InputIterator4,
67          typename OutputIterator1,
68          typename OutputIterator2>
69 __host__ __device__
70 thrust::pair<OutputIterator1,OutputIterator2>
71   set_difference_by_key(thrust::execution_policy<ExecutionPolicy> &exec,
72                         InputIterator1                             keys_first1,
73                         InputIterator1                             keys_last1,
74                         InputIterator2                             keys_first2,
75                         InputIterator2                             keys_last2,
76                         InputIterator3                             values_first1,
77                         InputIterator4                             values_first2,
78                         OutputIterator1                            keys_result,
79                         OutputIterator2                            values_result);
80 
81 
82 template<typename ExecutionPolicy,
83          typename InputIterator1,
84          typename InputIterator2,
85          typename InputIterator3,
86          typename InputIterator4,
87          typename OutputIterator1,
88          typename OutputIterator2,
89          typename StrictWeakOrdering>
90 __host__ __device__
91 thrust::pair<OutputIterator1,OutputIterator2>
92   set_difference_by_key(thrust::execution_policy<ExecutionPolicy> &exec,
93                         InputIterator1                             keys_first1,
94                         InputIterator1                             keys_last1,
95                         InputIterator2                             keys_first2,
96                         InputIterator2                             keys_last2,
97                         InputIterator3                             values_first1,
98                         InputIterator4                             values_first2,
99                         OutputIterator1                            keys_result,
100                         OutputIterator2                            values_result,
101                         StrictWeakOrdering                         comp);
102 
103 
104 template<typename ExecutionPolicy,
105          typename InputIterator1,
106          typename InputIterator2,
107          typename OutputIterator>
108 __host__ __device__
109 OutputIterator set_intersection(thrust::execution_policy<ExecutionPolicy> &system,
110                                 InputIterator1                             first1,
111                                 InputIterator1                             last1,
112                                 InputIterator2                             first2,
113                                 InputIterator2                             last2,
114                                 OutputIterator                             result);
115 
116 
117 // XXX it is an error to call this function; it has no implementation
118 template<typename ExecutionPolicy,
119          typename InputIterator1,
120          typename InputIterator2,
121          typename OutputIterator,
122          typename StrictWeakOrdering>
123 __host__ __device__
124 OutputIterator set_intersection(thrust::execution_policy<StrictWeakOrdering> &system,
125                                 InputIterator1                                first1,
126                                 InputIterator1                                last1,
127                                 InputIterator2                                first2,
128                                 InputIterator2                                last2,
129                                 OutputIterator                                result,
130                                 StrictWeakOrdering                            comp);
131 
132 
133 template<typename ExecutionPolicy,
134          typename InputIterator1,
135          typename InputIterator2,
136          typename InputIterator3,
137          typename OutputIterator1,
138          typename OutputIterator2>
139 __host__ __device__
140 thrust::pair<OutputIterator1,OutputIterator2>
141   set_intersection_by_key(thrust::execution_policy<ExecutionPolicy> &system,
142                           InputIterator1                             keys_first1,
143                           InputIterator1                             keys_last1,
144                           InputIterator2                             keys_first2,
145                           InputIterator2                             keys_last2,
146                           InputIterator3                             values_first1,
147                           OutputIterator1                            keys_result,
148                           OutputIterator2                            values_result);
149 
150 
151 template<typename ExecutionPolicy,
152          typename InputIterator1,
153          typename InputIterator2,
154          typename InputIterator3,
155          typename OutputIterator1,
156          typename OutputIterator2,
157          typename StrictWeakOrdering>
158 __host__ __device__
159 thrust::pair<OutputIterator1,OutputIterator2>
160   set_intersection_by_key(thrust::execution_policy<ExecutionPolicy> &system,
161                           InputIterator1                             keys_first1,
162                           InputIterator1                             keys_last1,
163                           InputIterator2                             keys_first2,
164                           InputIterator2                             keys_last2,
165                           InputIterator3                             values_first1,
166                           OutputIterator1                            keys_result,
167                           OutputIterator2                            values_result,
168                           StrictWeakOrdering                         comp);
169 
170 
171 template<typename ExecutionPolicy,
172          typename InputIterator1,
173          typename InputIterator2,
174          typename OutputIterator>
175 __host__ __device__
176 OutputIterator set_symmetric_difference(thrust::execution_policy<ExecutionPolicy> &system,
177                                         InputIterator1                             first1,
178                                         InputIterator1                             last1,
179                                         InputIterator2                             first2,
180                                         InputIterator2                             last2,
181                                         OutputIterator                             result);
182 
183 
184 // XXX it is an error to call this function; it has no implementation
185 template<typename ExecutionPolicy,
186          typename InputIterator1,
187          typename InputIterator2,
188          typename OutputIterator,
189          typename StrictWeakOrdering>
190 __host__ __device__
191 OutputIterator set_symmetric_difference(thrust::execution_policy<ExecutionPolicy> &system,
192                                         InputIterator1                             first1,
193                                         InputIterator1                             last1,
194                                         InputIterator2                             first2,
195                                         InputIterator2                             last2,
196                                         OutputIterator                             result,
197                                         StrictWeakOrdering                         comp);
198 
199 
200 template<typename ExecutionPolicy,
201          typename InputIterator1,
202          typename InputIterator2,
203          typename InputIterator3,
204          typename InputIterator4,
205          typename OutputIterator1,
206          typename OutputIterator2>
207 __host__ __device__
208 thrust::pair<OutputIterator1,OutputIterator2>
209   set_symmetric_difference_by_key(thrust::execution_policy<ExecutionPolicy> &system,
210                                   InputIterator1                             keys_first1,
211                                   InputIterator1                             keys_last1,
212                                   InputIterator2                             keys_first2,
213                                   InputIterator2                             keys_last2,
214                                   InputIterator3                             values_first1,
215                                   InputIterator4                             values_first2,
216                                   OutputIterator1                            keys_result,
217                                   OutputIterator2                            values_result);
218 
219 
220 template<typename ExecutionPolicy,
221          typename InputIterator1,
222          typename InputIterator2,
223          typename InputIterator3,
224          typename InputIterator4,
225          typename OutputIterator1,
226          typename OutputIterator2,
227          typename StrictWeakOrdering>
228 __host__ __device__
229 thrust::pair<OutputIterator1,OutputIterator2>
230   set_symmetric_difference_by_key(thrust::execution_policy<ExecutionPolicy> &system,
231                                   InputIterator1                             keys_first1,
232                                   InputIterator1                             keys_last1,
233                                   InputIterator2                             keys_first2,
234                                   InputIterator2                             keys_last2,
235                                   InputIterator3                             values_first1,
236                                   InputIterator4                             values_first2,
237                                   OutputIterator1                            keys_result,
238                                   OutputIterator2                            values_result,
239                                   StrictWeakOrdering                         comp);
240 
241 
242 template<typename ExecutionPolicy,
243          typename InputIterator1,
244          typename InputIterator2,
245          typename OutputIterator>
246 __host__ __device__
247 OutputIterator set_union(thrust::execution_policy<ExecutionPolicy> &system,
248                          InputIterator1                             first1,
249                          InputIterator1                             last1,
250                          InputIterator2                             first2,
251                          InputIterator2                             last2,
252                          OutputIterator                             result);
253 
254 
255 // XXX it is an error to call this function; it has no implementation
256 template<typename ExecutionPolicy,
257          typename InputIterator1,
258          typename InputIterator2,
259          typename OutputIterator,
260          typename StrictWeakOrdering>
261 __host__ __device__
262 OutputIterator set_union(thrust::execution_policy<ExecutionPolicy> &system,
263                          InputIterator1                             first1,
264                          InputIterator1                             last1,
265                          InputIterator2                             first2,
266                          InputIterator2                             last2,
267                          OutputIterator                             result,
268                          StrictWeakOrdering                         comp);
269 
270 
271 template<typename ExecutionPolicy,
272          typename InputIterator1,
273          typename InputIterator2,
274          typename InputIterator3,
275          typename InputIterator4,
276          typename OutputIterator1,
277          typename OutputIterator2>
278 __host__ __device__
279 thrust::pair<OutputIterator1,OutputIterator2>
280   set_union_by_key(thrust::execution_policy<ExecutionPolicy> &system,
281                    InputIterator1                             keys_first1,
282                    InputIterator1                             keys_last1,
283                    InputIterator2                             keys_first2,
284                    InputIterator2                             keys_last2,
285                    InputIterator3                             values_first1,
286                    InputIterator4                             values_first2,
287                    OutputIterator1                            keys_result,
288                    OutputIterator2                            values_result);
289 
290 
291 template<typename ExecutionPolicy,
292          typename InputIterator1,
293          typename InputIterator2,
294          typename InputIterator3,
295          typename InputIterator4,
296          typename OutputIterator1,
297          typename OutputIterator2,
298          typename StrictWeakOrdering>
299 __host__ __device__
300 thrust::pair<OutputIterator1,OutputIterator2>
301   set_union_by_key(thrust::execution_policy<ExecutionPolicy> &system,
302                    InputIterator1                             keys_first1,
303                    InputIterator1                             keys_last1,
304                    InputIterator2                             keys_first2,
305                    InputIterator2                             keys_last2,
306                    InputIterator3                             values_first1,
307                    InputIterator4                             values_first2,
308                    OutputIterator1                            keys_result,
309                    OutputIterator2                            values_result,
310                    StrictWeakOrdering                         comp);
311 
312 
313 } // end namespace generic
314 } // end namespace detail
315 } // end namespace system
316 } // end namespace thrust
317 
318 #include <thrust/system/detail/generic/set_operations.inl>
319 
320